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
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ą.
-- 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:
-- 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
Zwróć imię (imię) i nazwisko (nazwisko) pracowników, którzy NIE mają przypisanego działu. Jeden lub więcej wierszy, dwie kolumny.
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
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.
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