Skoro w Bloku 17 podzieliliśmy dane na osobne, znormalizowane tabele (np. Uczniowie i Klasy), potrzebujemy sposobu, żeby ponownie połączyć powiązane ze sobą dane w jednym zapytaniu — np. wyświetlić imię ucznia razem z nazwą jego klasy. Do tego służy JOIN.
| Uczniowie | Klasy | |||
|---|---|---|---|---|
| id_ucznia | imie | id_klasy | id_klasy | nazwa |
| 1 | Anna | 10 | 10 | 4TI |
| 2 | Piotr | 10 | 20 | 4TE |
| 3 | Ewa | NULL | ||
Zwraca wyłącznie wiersze, dla których istnieje dopasowanie w obu tabelach. Ewa (bez przypisanej klasy) nie pojawi się w wyniku.
Zwraca wszystkie wiersze z tabeli po lewej stronie (Uczniowie), nawet jeśli nie mają dopasowania po prawej — w takim przypadku kolumny z prawej tabeli będą miały wartość NULL.
Symetryczne odbicie LEFT JOIN — zwraca wszystkie wiersze z prawej tabeli, nawet bez dopasowania po lewej. Klasa 4TE (bez żadnych przypisanych uczniów w naszym przykładzie) pojawi się w wyniku z NULL zamiast imienia.
INNER JOIN = część wspólna (przecięcie zbiorów). LEFT/RIGHT JOIN = cała tabela wskazana słowem LEFT/RIGHT + dopasowania z drugiej, z lukami wypełnionymi NULL tam, gdzie brak dopasowania.
Kolejne JOIN po prostu doklejamy jeden po drugim — każdy łączy kolejną tabelę na podstawie wspólnego klucza.
Napisz zapytanie SQL wykorzystujące LEFT JOIN, które wypisze imiona wszystkich uczniów, którzy nie mają przypisanej klasy (podpowiedź: dodaj warunek WHERE Klasy.nazwa IS NULL po LEFT JOIN).
Mając tabele Uczniowie, Przedmioty i Oceny (z kluczami obcymi id_ucznia i id_przedmiotu), napisz zapytanie wypisujące imię ucznia, nazwę przedmiotu i ocenę dla wszystkich ocen w bazie.
1. Które wiersze zwraca INNER JOIN?
2. Co się dzieje z wierszami bez dopasowania przy LEFT JOIN?
3. Ile razy można użyć JOIN w jednym zapytaniu SQL, aby połączyć wiele tabel?