SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)
Poznaj złączenia INNER, LEFT, RIGHT, FULL, CROSS i SELF na dwóch małych tabelach, z czytelnymi zapytaniami i dokładnymi wynikami.
- INNER JOIN: tylko wiersze pasujące w obu tabelach.
- LEFT JOIN: wszystkie wiersze z lewej, plus dopasowane (NULL, gdy brak).
- RIGHT JOIN: wszystkie wiersze z prawej, plus dopasowane.
- FULL JOIN: wszystkie wiersze obu tabel, połączone tam, gdzie to możliwe.
- Łącz po kluczach, używaj aliasów tabel i indeksuj kolumny złączeń.
Prawdziwe bazy danych nie trzymają wszystkiego w jednej tabeli. Klienci są w jednej tabeli, a zamówienia w drugiej. Aby odpowiedzieć na pytanie „którzy klienci złożyli zamówienie w tym miesiącu?”, trzeba je połączyć – i właśnie to robią złączenia SQL.
Ten przewodnik jest praktyczny. Złączenia mylą początkujących, bo te same dwie tabele dają różne wyniki zależnie od typu złączenia. Na małych, konkretnych danych staje się to proste.
SQL JOIN – wyjaśnienie: przykładowe tabele
customers
| id | name |
|---|---|
| 1 | Asha |
| 2 | Ben |
| 3 | Chitra |
orders
| id | customer_id | total |
|---|---|---|
| 101 | 1 | 250 |
| 102 | 1 | 120 |
| 103 | 2 | 90 |
| 104 | 9 | 40 |
Chitra nie ma zamówień, a zamówienie 104 wskazuje na nieistniejącego klienta (9). Te dwa przypadki brzegowe pokazują różnicę między typami złączeń.
INNER JOIN
INNER JOIN zwraca tylko wiersze, dla których warunek jest spełniony w obu tabelach. Wiersze bez pary są pomijane.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
Wynik: Asha (101), Asha (102), Ben (103). Brakuje Chitry i zamówienia 104. Używaj go, gdy liczą się tylko powiązane dane, np. zamówienia ze szczegółami klienta. Samo JOIN oznacza INNER JOIN.
LEFT JOIN
LEFT JOIN zachowuje wszystkie wiersze lewej tabeli i dodaje pasujące wiersze z prawej. Gdy nie ma dopasowania, kolumny z prawej mają wartość NULL.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
Wynik: Asha (101), Asha (102), Ben (103), Chitra (NULL, NULL). Teraz Chitra jest widoczna.
Szybka wskazówka: aby znaleźć klientów, którzy nigdy nie zamawiali, przefiltruj NULL po prawej stronie: WHERE o.id IS NULL zwraca Chitrę. Testerzy używają tego do wyszukiwania osieroconych lub brakujących rekordów.
RIGHT JOIN i FULL JOIN
RIGHT JOIN to lustrzane odbicie LEFT JOIN i zachowuje wszystkie wiersze prawej tabeli. Większość osób zamienia kolejność tabel i używa LEFT JOIN, bo czyta się go naturalniej.
SELECT c.name, o.id AS order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;
Wynik zawiera zamówienie 104 z nazwą klienta NULL. FULL (OUTER) JOIN zwraca wszystkie wiersze obu tabel: Chitrę bez zamówienia i zamówienie 104 bez klienta.
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id;
Obsługują go PostgreSQL i SQL Server. MySQL nie – połącz LEFT JOIN i RIGHT JOIN za pomocą UNION. Więcej znajdziesz w podręczniku PostgreSQL, który zawiera przejrzysty samouczek o złączeniach.
| Złączenie | Tylko wiersze z lewej | Tylko wiersze z prawej | Dopasowane wiersze |
|---|---|---|---|
| INNER | Nie | Nie | Tak |
| LEFT | Tak | Nie | Tak |
| RIGHT | Nie | Tak | Tak |
| FULL | Tak | Tak | Tak |
CROSS JOIN i SELF JOIN
CROSS JOIN łączy każdy wiersz jednej tabeli z każdym wierszem drugiej: trzech klientów i cztery zamówienia dają dwanaście wierszy. Rzadko się go używa, ale bywa przydatny do generowania kombinacji, np. danych testowych dla każdego rozmiaru i koloru.
SELECT c.name, o.id
FROM customers c
CROSS JOIN orders o;
SELF JOIN łączy tabelę ze sobą za pomocą aliasów, np. aby znaleźć przełożonego każdego pracownika.
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
SQL JOIN: typowe błędy i wskazówki wydajnościowe
- Pominięcie klauzuli ON przypadkowo tworzy CROSS JOIN i gwałtownie zwiększa liczbę wierszy.
- Filtrowanie prawej tabeli w WHERE po LEFT JOIN zamienia go w INNER JOIN; warunek umieść w ON.
- Niejednoznaczne nazwy kolumn: poprzedzaj kolumny aliasem tabeli.
- Złączenie po kolumnach nieunikalnych mnoży wiersze i zawyża sumy.
- Indeksuj kolumny złączeń, wybieraj tylko potrzebne kolumny i analizuj wolne zapytania poleceniem
EXPLAIN.
Dlaczego złączenia są ważne dla testerów
Inżynierowie QA używają złączeń, by sprawdzić, czy dane utworzone przez interfejs lub API trafiły poprawnie do bazy, oraz by znajdować osierocone rekordy. Czytaj razem z naszym przewodnikiem po testowaniu API w Postmanie (po angielsku). Podstawy znajdziesz w samouczku SQL dla początkujących (po angielsku), a o nowych magazynach danych w artykule o bazach wektorowych (po angielsku). Aby uruchomić bazę lokalnie, zobacz nasz samouczek Dockera (po angielsku).
Podsumowanie
Złączenia SQL w jednym zdaniu: INNER zachowuje tylko dopasowania, LEFT wszystko z lewej, RIGHT wszystko z prawej, a FULL zachowuje wszystko. Ćwicz na dwóch małych tabelach, aż będziesz przewidywać wynik przed uruchomieniem zapytania; potem połącz trzy tabele i łącz złączenia z GROUP BY.
Najczęstsze pytania
Jaka jest różnica między INNER JOIN a LEFT JOIN?
INNER JOIN zwraca tylko pasujące wiersze z obu tabel. LEFT JOIN zwraca wszystkie wiersze lewej tabeli i uzupełnia niedopasowane kolumny z prawej wartością NULL.
Które złączenie SQL jest najszybsze?
Żaden typ nie jest zawsze najszybszy. Wydajność zależy od indeksów, rozmiaru tabel i planu wykonania. Zaindeksuj kolumny złączenia i sprawdź plan.
Czy MySQL obsługuje FULL OUTER JOIN?
Nie. W MySQL połącz LEFT JOIN i RIGHT JOIN za pomocą UNION, aby uzyskać ten sam wynik.
Do czego służy SELF JOIN?
SELF JOIN porównuje wiersze tej samej tabeli, np. aby znaleźć przełożonego każdego pracownika w jednej tabeli employees.
Dlaczego moje złączenie zwraca zduplikowane wiersze?
Duplikaty pojawiają się, gdy kolumna złączenia nie jest unikalna w jednej z tabel. Sprawdź klucze lub zagreguj dane przed złączeniem.
Ucz się dalej (artykuły po angielsku)
Potrzebujesz pomocy w testowaniu, WordPressie lub SEO?
Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich strony. Powiedz, nad czym pracujesz, a podpowiemy kolejny krok.
Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój
Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.
