BLOK 18 · 2 godz. SQL JOIN Relacje

SQL: JOIN — łączenie tabel

Informatyka Rozszerzona · Klasa 4 · Semestr II · Blok 18/30

1. Po co łączyć tabele?

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.

2. Dane przykładowe

UczniowieKlasy
id_uczniaimieid_klasyid_klasynazwa
1Anna10104TI
2Piotr10204TE
3EwaNULL

3. INNER JOIN — tylko dopasowane wiersze

Zwraca wyłącznie wiersze, dla których istnieje dopasowanie w obu tabelach. Ewa (bez przypisanej klasy) nie pojawi się w wyniku.

SELECT Uczniowie.imie, Klasy.nazwa FROM Uczniowie INNER JOIN Klasy ON Uczniowie.id_klasy = Klasy.id_klasy; -- wynik: -- Anna | 4TI -- Piotr | 4TI

4. LEFT JOIN — wszystkie wiersze z lewej tabeli

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.

SELECT Uczniowie.imie, Klasy.nazwa FROM Uczniowie LEFT JOIN Klasy ON Uczniowie.id_klasy = Klasy.id_klasy; -- wynik: -- Anna | 4TI -- Piotr | 4TI -- Ewa | NULL (Ewa zostaje w wyniku!)

5. RIGHT JOIN — wszystkie wiersze z prawej tabeli

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.

SELECT Uczniowie.imie, Klasy.nazwa FROM Uczniowie RIGHT JOIN Klasy ON Uczniowie.id_klasy = Klasy.id_klasy; -- wynik zawiera też: NULL | 4TE

Jak zapamiętać różnicę?

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.

6. Łączenie więcej niż dwóch tabel

SELECT Uczniowie.imie, Klasy.nazwa, Nauczyciele.nazwisko AS wychowawca FROM Uczniowie JOIN Klasy ON Uczniowie.id_klasy = Klasy.id_klasy JOIN Nauczyciele ON Klasy.id_wychowawcy = Nauczyciele.id_nauczyciela;

Kolejne JOIN po prostu doklejamy jeden po drugim — każdy łączy kolejną tabelę na podstawie wspólnego klucza.

7. Ćwiczenia praktyczne

Ćwiczenie 1 — znajdź uczniów bez klasy

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).

SELECT Uczniowie.imie FROM Uczniowie LEFT JOIN Klasy ON Uczniowie.id_klasy = Klasy.id_klasy WHERE Klasy.nazwa IS NULL;

Ćwiczenie 2 — połącz trzy tabele

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.

Sprawdź wiedzę

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?

Podsumowanie bloku