JOINy łączą wiersze z wielu tabel na podstawie powiązanej kolumny — są niezbędne do zapytań dotyczących danych relacyjnych rozproszonych między tabelami. Typ joinu określa, które wiersze są zachowywane, gdy nie ma dopasowania.
Konfiguracja
-- two related tables: users and their orders (orders.user_id → users.id)
SELECT users.name, orders.total
FROM users
JOIN orders ON users.id = orders.user_id; -- combine on the relationship
Klauzula ON określa sposób powiązania tabel (dopasowanie klucza obcego do klucza głównego). Typ joinu kontroluje, co się dzieje z wierszami, które nie pasują.
Cztery typy joinów
INNER JOIN → only rows that MATCH in BOTH tables (the intersection)
users WITH orders only — users with no orders are excluded
LEFT JOIN → ALL rows from the LEFT table + matches from the right (NULL if no match)
ALL users, with their orders (or NULL for users with no orders)
RIGHT JOIN → ALL rows from the RIGHT table + matches from the left (NULL if no match)
ALL orders, with their user (mirror of LEFT)
FULL JOIN → ALL rows from BOTH tables (matched where possible, NULL where not)
-- INNER — only users who have orders
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
-- LEFT — ALL users, even those with no orders (o.total is NULL for them)
SELECT u.name, o.total FROM users u LEFT JOIN orders o ON u.id = o.user_id;
Typowe zastosowanie: znajdź wiersze NIEDOPASOWANE
-- LEFT JOIN + IS NULL → users who have NEVER ordered
SELECT u.name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL; -- no matching order → o.id is NULL
Wzorzec LEFT JOIN + IS NULL znajduje wiersze w jednej tabeli, które nie mają odpowiadającego im wiersza w innej — bardzo częsta i użyteczna technika.
Podsumowanie wizualne
INNER → A ∩ B (matches only)
LEFT → all A + matching B
RIGHT → all B + matching A
FULL → all A + all B
Dlaczego to ważne
JOINy są fundamentem baz danych relacyjnych — dane są celowo podzielone między powiązane tabele (użytkownicy, zamówienia, produkty), a JOINy to sposób na łączenie tych powiązanych danych w zapytaniach, dlatego zrozumienie ich jest niezbędne do praktycznie każdej nietrywialnej pracy z bazą danych.
Zrozumienie czterech typów joinów i ich zachowania wobec niedopasowanych wierszy to kluczowa umiejętność: INNER JOIN (tylko dopasowane wiersze — najczęściej używany), LEFT JOIN (wszystkie wiersze z lewej tabeli, z NULL dla niedopasowań — kluczowy, gdy potrzebujesz wszystkich rekordów niezależnie od dopasowań), RIGHT JOIN (lustrzane odbicie), oraz FULL JOIN (wszystkie wiersze z obu tabel).
Wybór właściwego typu joinu bezpośrednio determinuje wyniki — użycie INNER, gdy miałeś na myśli LEFT, bezgłośnie usuwa wiersze (częsty błąd), dlatego zrozumienie różnic jest ważne dla poprawności.
Wzorzec LEFT JOIN + IS NULL (znajdowanie wierszy bez dopasowania w innej tabeli — jak użytkownicy, którzy nigdy nie zamawiają) to szczególnie użyteczna, częsta technika warta zapamiętania.
Ponieważ dane relacyjne są rozdzielone między tabele, a JOINy to podstawowy sposób na łączne ich zapytywanie, oraz ponieważ typ joinu krytycznie wpływa na to, które wiersze pojawiają się w wynikach, opanowanie JOINów — czterech typów, ich zachowania wobec niedopasowań i wzorców takich jak anti-join — to kluczowa, często stosowana wiedza dla SQL i jeden z najważniejszych oraz najczęściej testowanych koncepcji baz danych.
