CodeGym /Kursy /SQL SELF /Użycie LEFT JOIN: włączenie wszystkich danych z lewej ta...

Użycie LEFT JOIN: włączenie wszystkich danych z lewej tabeli

SQL SELF
Poziom 11, Lekcja 2
Dostępny

Wyobraź sobie, że masz dwie tabele: listę studentów i listę ich zapisów na kursy. Nie wszyscy studenci są zapisani na kursy i chcesz zobaczyć pełną listę wszystkich studentów, także tych, którzy z jakiegoś powodu jeszcze nie wybrali kursu. Za pomocą INNER JOIN zobaczysz tylko tych, którzy są zapisani na kursy, ale co z resztą studentów? Właśnie do tego służy LEFT JOIN.

LEFT JOIN zwraca wszystkie wiersze z lewej tabeli (tej, która jest pierwsza w zapytaniu) oraz pasujące wiersze z prawej tabeli. Jeśli nie ma dopasowań, dla kolumn z prawej tabeli zostaną zwrócone wartości NULL.

Składnia LEFT JOIN

SELECT
    tabela1.kolumna1,
    tabela1.kolumna2,
    tabela2.kolumna1,
    tabela2.kolumna2    
FROM 
    tabela1 LEFT JOIN tabela2
ON 
    tabela1.wspolna_kolumna = tabela2.wspolna_kolumna;
  • tabela1 — to "lewa" tabela.
  • tabela2 — to "prawa" tabela.
  • wspolna_kolumna — wspólna kolumna, po której następuje łączenie.

Przykład na chłopski rozum

Jeśli tabela students wygląda tak:

student_id name
1 Otto
2 Anna
3 Peter

A tabela enrollments wygląda tak:

enrollment_id student_id course
1 1 Matematyka
2 1 Fizyka
3 2 Biologia

To zapytanie:

SELECT
    students.name, 
    enrollments.course
FROM 
    students LEFT JOIN enrollments
ON 
    students.student_id = enrollments.student_id;

zwróci:

name course
Otto Matematyka
Otto Fizyka
Anna Biologia
Peter NULL

Jak widzisz, w wyniku zostali wszyscy studenci, nawet Peter, który jeszcze nie zapisał się na żaden kurs. Dla Petera w kolumnie course jest NULL.

Przykłady użycia LEFT JOIN

Przykład 1: Pobranie listy wszystkich studentów i ich kursów

Załóżmy, że musisz pobrać pełną listę studentów razem z kursami, na które są zapisani, jeśli takie są. Jeśli student jeszcze nie wybrał kursu, to też powinno być pokazane.

To samo zapytanie:

SELECT
    students.name, 
    enrollments.course
FROM 
    students LEFT JOIN enrollments
ON 
    students.student_id = enrollments.student_id;

Wynik:

name course
Otto Matematyka
Otto Fizyka
Anna Biologia
Peter NULL

To klasyczny przykład użycia LEFT JOIN.

Przykład 2: Wyświetlanie produktów i ich sprzedaży

Załóżmy, że masz dwie tabele:

Tabela products, zawierająca wszystkie produkty:

product_id product_name
1 Smartfon
2 Tablet
3 Laptop

Tabela sales, zawierająca dane o sprzedaży:

sale_id product_id quantity
1 1 5
2 1 3
3 2 2

Teraz chcesz zobaczyć wszystkie produkty i ilość ich sprzedaży, także te produkty, które jeszcze nie zostały sprzedane.

SELECT
    products.product_name, 
    SUM(sales.quantity) AS total_sold
FROM 
    products LEFT JOIN sales
    ON 
    products.product_id = sales.product_id
GROUP BY 
    products.product_name;

Wynik:

product_name total_sold
Smartfon 8
Tablet 2
Laptop NULL

Specyfika i problemy przy użyciu LEFT JOIN

Czy zawsze potrzebujesz NULL?
Czasami LEFT JOIN dodaje NULL tam, gdzie się tego nie spodziewasz. W takich przypadkach możesz zamienić NULL na coś bardziej czytelnego za pomocą funkcji COALESCE().

SELECT
    students.name, 
    COALESCE(enrollments.course, 'Kurs nie wybrany') AS course
FROM 
    students LEFT JOIN enrollments
ON 
    students.student_id = enrollments.student_id;

Wynik:

name course
Otto Matematyka
Otto Fizyka
Anna Biologia
Peter Kurs nie wybrany

Niepotrzebne duplikaty
Jeśli dane w prawej tabeli zawierają zduplikowane rekordy, wynik zapytania będzie miał więcej wierszy, niż się spodziewasz. Uważnie patrz na dane, z którymi pracujesz i używaj DISTINCT, jeśli nie chcesz duplikatów.

2
Zadanie
SQL SELF, poziom 11, lekcja 2
Niedostępne
Pełna lista studentów i ich kursów
Pełna lista studentów i ich kursów
2
Zadanie
SQL SELF, poziom 11, lekcja 2
Niedostępne
Pełna lista produktów i ich sprzedaży
Pełna lista produktów i ich sprzedaży
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION