Co jeśli chcemy zobaczyć WSZYSTKICH uczniów, nawet tych bez przypisanej klasy?
Problem z INNER JOIN polega na tym, że "gubi" rekordy, które nie mają dopasowania po drugiej stronie. W analityce często chcemy jednak zobaczyć właśnie te "sieroty" – np. uczniów bez klas, klientów bez zamówień itp. Do tego służą złączenia zewnętrzne (OUTER JOINs). Treść pochodzi z Lekcji 15: Złączenia zewnętrzne — LEFT JOIN i RIGHT JOIN.
LEFT JOIN: Zwraca wszystko z lewej tabeli + pasujące rekordy z prawej
LEFT JOIN to najpopularniejsze złączenie zewnętrzne. Tabela "lewa" to ta, która występuje jako pierwsza w zapytaniu (po FROM). Tabela "prawa" to ta, która występuje po klauzuli LEFT JOIN.
Logika działania LEFT JOIN:
- Bierze wszystkie wiersze z tabeli lewej (np. Uczniowie), bez wyjątku.
- Dla każdego z tych wierszy próbuje znaleźć dopasowanie w tabeli prawej (np. Klasy) na podstawie warunku
ON. - Jeśli znajdzie dopasowanie, dołącza dane z prawej tabeli (tak jak INNER JOIN).
- Jeśli nie znajdzie dopasowania (np. uczeń ma
ID_Klasy = NULL), nadal zwraca wiersz z lewej tabeli, a wszystkie kolumny pobierane z prawej tabeli wypełnia wartościami NULL.
Gdzie pojawią się wartości NULL po takim łączeniu
Przykład: Chcemy listę wszystkich uczniów i ich klas.
SELECT
Uczniowie.Nazwisko,
Klasy.NazwaKlasy
FROM Uczniowie
LEFT JOIN Klasy
ON Uczniowie.ID_Klasy = Klasy.ID_Klasy;
Potencjalny wynik:
Nazwisko | NazwaKlasy
----------------------------
Kowalski | '3A'
Nowak | '3B'
Wiśniewski | NULL
Wiersz 'Wiśniewski' pojawił się w wynikach (czego nie zapewniłby INNER JOIN), ponieważ Uczniowie była tabelą "lewą". NazwaKlasy dla niego to NULL, co informuje nas, że nie znaleziono dla niego dopasowania w tabeli Klasy.
RIGHT JOIN: Zwraca wszystko z prawej tabeli + pasujące rekordy z lewej
RIGHT JOIN działa analogicznie do LEFT JOIN, ale "odwraca" logikę – zatrzymuje wszystkie wiersze z tabeli prawej i uzupełnia NULL po lewej stronie, jeśli nie znajdzie dopasowania.
Przykład użycia: Uczniowie RIGHT JOIN Klasy pokazałby wszystkie klasy, nawet te, które nie mają przypisanych żadnych uczniów (tzw. "puste klasy").
Dobra praktyka: RIGHT JOIN jest rzadko używany, ponieważ każde zapytanie z RIGHT JOIN można zapisać jako LEFT JOIN poprzez zamianę kolejności tabel w klauzuli FROM. Używanie tylko LEFT JOIN sprawia, że kod jest bardziej spójny i czytelny dla innych analityków.