JOIN to operacja w SQL, która łączy wiersze z dwóch lub więcej tabel na podstawie warunku dopasowania — najczęściej równości wartości w powiązanych kolumnach (np. klienci.id = zamowienia.klient_id). Zamiast trzymać wszystko w jednej gigantycznej tabeli, w relacyjnych bazach dane są rozbite na osobne tabele, a JOIN pozwala je z powrotem skleić w jednym zapytaniu i zobaczyć je razem jako wynik.
Do czego to służy
Relacyjna baza celowo rozdziela dane: klienci w jednej tabeli, ich zamówienia w drugiej, produkty w trzeciej. To unika powielania (tzw. normalizacja). Problem w tym, że na raporcie chcesz widzieć „imię klienta + co zamówił”, a te informacje siedzą w dwóch miejscach. JOIN jest mostem, który mówi bazie, jak te tabele są ze sobą powiązane, i zwraca połączony wynik.
Najważniejsze rodzaje, które musisz znać:
INNER JOIN— tylko wiersze, które mają dopasowanie po obu stronach.LEFT JOIN— wszystkie wiersze z lewej tabeli, a z prawej te pasujące (reszta jakoNULL).RIGHT JOIN— odwrotnośćLEFT JOIN.FULL OUTER JOIN— wszystko z obu tabel, dopasowane gdzie się da.
Przykład z praktyki
Masz tabelę klienci i tabelę zamowienia. Chcesz listę zamówień z nazwiskiem klienta. W PostgreSQL czy MySQL napiszesz:
SELECT k.nazwisko, z.kwota FROM klienci k INNER JOIN zamowienia z ON k.id = z.klient_id;
Jeśli zależy Ci też na klientach, którzy jeszcze nic nie kupili (przydatne np. do raportu „kto nie złożył zamówienia”), zamieniasz INNER na LEFT JOIN — wtedy tacy klienci pojawią się z NULL w kolumnie kwoty.
Częste błędy
- Brak warunku
ON— dostajesz wtedy iloczyn kartezjański (każdy wiersz z każdym). Przy dwóch tabelach po 10 tys. wierszy to 100 milionów rekordów i baza, która „wisi”. - Mylenie
INNERzLEFT—INNER JOINpo cichu wytnie wiersze bez dopasowania, więc możesz nie zauważyć, że brakuje Ci danych. - JOIN po niezindeksowanej kolumnie — działa, ale wolno. Klucze, po których łączysz, warto mieć w indeksie.
Pojęcia powiązane: klucz obcy (FOREIGN KEY), klucz główny (PRIMARY KEY), normalizacja, SQL, indeks, podzapytanie, relacja jeden-do-wielu.