SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)

SQL joins explained with examples: inner, left, right, full, cross and self joins
  1. Strona główna
  2. Blog
  3. Bazy danych i SQL

Bazy danych i SQL

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.

Autor: Stack QuoraAktualizacja: 29 paź 20268 min czytania
SQLSQL JOIN – wyjaśnieniez przykładamistackquora.com

Najważniejsze

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

Pracuj ze Stack Quora

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.

Czytaj dalej

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.