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.
GO TO FULL VERSION