LEFT JOIN

Złączenie zwracające wszystkie wiersze z lewej tabeli oraz dopasowane z prawej, a brakujące uzupełnia wartościami NULL.

LEFT JOIN (pełna nazwa: LEFT OUTER JOIN) to rodzaj złączenia w SQL, który zwraca wszystkie wiersze z lewej tabeli (tej zaraz po FROM) oraz pasujące do nich wiersze z prawej tabeli (tej po LEFT JOIN). Jeśli dla danego wiersza z lewej strony nie ma dopasowania po prawej, baza nie wyrzuca go z wyniku — po prostu w kolumnach z prawej tabeli wstawia NULL. Krótko mówiąc: lewa tabela jest święta, prawa dokleja się tam, gdzie pasuje.

Jak to działa i do czego służy

Złączenia łączą dane z wielu tabel po wspólnym kluczu — zwykle podajesz warunek w klauzuli ON, np. ON zamowienia.user_id = users.id. Zwykły INNER JOIN pokazuje tylko te wiersze, dla których dopasowanie istnieje po obu stronach. LEFT JOIN jest mniej wybredny: gwarantuje, że każdy wiersz z lewej tabeli trafi do wyniku, niezależnie od tego, czy ma swój odpowiednik po prawej.

Używasz go, gdy chcesz zachować komplet rekordów z jednej tabeli i tylko opcjonalnie wzbogacić je danymi z drugiej. Klasyka: lista wszystkich użytkowników wraz z ich zamówieniami — także tych, którzy jeszcze nic nie kupili.

Przykład z praktyki

Masz tabele users i orders w PostgreSQL. Chcesz wypisać każdego użytkownika i liczbę jego zamówień, łącznie z zerami:

SELECT u.name, COUNT(o.id) AS liczba_zamowien FROM users u LEFT JOIN orders o ON o.user_id = u.id GROUP BY u.name;

Dzięki LEFT JOIN użytkownik bez ani jednego zamówienia też pojawi się na liście — z wartością 0. Z INNER JOIN zniknąłby z raportu, a Ty zachodziłbyś w głowę, czemu liczby się nie zgadzają.

Częste błędy i pułapki

Najczęstsza wpadka: przeniesienie warunku z prawej tabeli z ON do WHERE. Zapis WHERE o.status = 'paid' odfiltruje wiersze z NULL i Twój LEFT JOIN po cichu zamieni się w INNER JOIN. Jeśli chcesz filtrować prawą tabelę, ale zachować wszystkie wiersze z lewej, wrzuć warunek do ON: ON o.user_id = u.id AND o.status = 'paid'.

Druga pułapka: COUNT(*) zamiast COUNT(o.id). Pierwsze policzy też wiersze z samymi NULL-ami i zwróci 1 zamiast 0. Pamiętaj też, że NULL to nie to samo co pusty string czy zero — w warunkach używaj IS NULL, nie = NULL.

Pojęcia powiązane: INNER JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN, klauzula ON i WHERE, NULL, klucz obcy (foreign key).