JOIN

Operacja łącząca wiersze z dwóch lub więcej tabel na podstawie powiązanej kolumny. Pozwala pobrać dane rozproszone po wielu tabelach.

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 jako NULL).
  • 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 INNER z LEFTINNER JOIN po 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.