Przejdź do głównej treści
eLearner.app
Moduł 3 · Lekcja 2 z 410/57 w kursie~10 min
Lekcje modułu (2/4)

Zachowanie wszystkiego po lewej stronie: LEFT JOIN

INNER JOIN z poprzedniej lekcji ma ważny efekt uboczny: to usuwa wiersze, które nie pasują. Jeśli pracownik nie ma działu (department_id to NULL), znikają z wyniku.

Czasami właśnie tego chcesz. Często jednak tak nie jest: w raporcie HR konieczne jest zobaczenie wszystkich pracowników, także tych nieposiadających działu, i wiedzieć, kim oni są. Do tego właśnie służy LEFT JOIN (w całości LEFT OUTER JOIN).

Jak to działa

SQL
SELECT columns
FROM   table_a
LEFT JOIN table_b ON table_a.x = table_b.y;

Przeczytaj po angielsku: "zachowaj wszystkie wiersze table_a; dla każdego spróbuj dołącz wiersz z table_b; jeśli nie ma dopasowania, wypełnij kolumny z table_b z NULL".

Kluczowym słowem jest LEFT: oznacza ono „lewą tabelę”, czyli tę zapisaną po KODEF1. Wszystkie jego rzędy zawsze przetrwają.

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

W naszym zbiorze danych to zapytanie zwraca 10 wierszy (po jednym pracowniku każdy). Andrea Costa, który ma department_id = NULL, pojawia się z dipartimento = NULL zamiast znikać.

Znajdowanie wierszy „brak dopasowania”.

Bardzo przydatna konsekwencja: filtrowanie za pomocą IS NULL w kolumnie w tabeli po prawej stronie znajdziesz dokładnie te wiersze bez dopasowania:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

Tę sztuczkę stosuje się cały czas w prawdziwym świecie: „znajdź mi zamówienia z nr klient", "produkty bez recenzji", "użytkownicy, którzy nigdy się nie logowali w".

Spróbuj

Ćwiczenie#sql.m3.l2.e1
Próby: 0Ładowanie...

Zwróć imię (imię) i nazwisko (nazwisko) pracowników, którzy NIE mają przypisanego działu. Jeden lub więcej wierszy, dwie kolumny.

Ładowanie edytora...
Pokaż wskazówkę

Uzupełnij WHERE za pomocą d.id IS NULL — chcesz uzyskać wiersze, w których LEFT JOIN nie znalazło pasującego działu.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m3.l2.e2
Próby: 0Ładowanie...

Wypisz wszystkie działy (nazwa departamentu) i obok nich liczbę pracowników, łącznie z działami, które nie zatrudniają pracowników (dla tych pokaż 0). Wskazówka: zacznij od działów i wykonaj LEWY DOŁĄCZ z pracownikami, a następnie GROUP BY + COUNT.

Ładowanie edytora...
Pokaż wskazówkę

Użyj COUNT(e.id) (a nie COUNT(*)), aby policzyć 0, gdy nie ma dopasowania: COUNT(*) policzy 1 ze względu na wiersz LEFT JOIN z wartością NULL.

Rozwiązanie dostępne po 3 próbach