🔗 Czym jest JOIN w SQL?
W relacyjnych bazach danych dane są podzielone na wiele tabel, by uniknąć redundancji. JOIN to mechanizm, który pozwala te tabele łączyć w jednym zapytaniu – na podstawie wspólnych kolumn (kluczy).
Wyobraź sobie sklep internetowy. Tabela Zamówienia przechowuje ID klienta, ale nie jego imię. Żeby wyświetlić „Jan Kowalski zamówił laptopa”, musisz połączyć tabelę zamówień z tabelą klientów – właśnie za pomocą JOIN.
📊 Dane przykładowe – nasze tabele
Przez cały artykuł będziemy używać dwóch prostych tabel: Klienci i Zamówienia. Nie każdy klient złożył zamówienie i nie każde zamówienie ma przypisanego klienta.
Tabela: Klienci
| KlientID | Imie | Miasto |
|---|---|---|
| 1 | Anna | Warszawa |
| 2 | Bartek | Kraków |
| 3 | Celina | Gdańsk |
| 4 | Damian | Wrocław |
Tabela: Zamówienia
| ZamówienieID | KlientID | Produkt |
|---|---|---|
| 101 | 1 | Laptop |
| 102 | 2 | Monitor |
| 103 | 2 | Klawiatura |
| 104 | 5 | Mysz |
Kod SQL – tworzenie tabel
-- Tworzenie tabeli Klienci
CREATE TABLE Klienci (
KlientID INT PRIMARY KEY,
Imie VARCHAR(50),
Miasto VARCHAR(50)
);
INSERT INTO Klienci VALUES
(1, 'Anna', 'Warszawa'),
(2, 'Bartek', 'Kraków'),
(3, 'Celina', 'Gdańsk'),
(4, 'Damian', 'Wrocław');
-- Tworzenie tabeli Zamówienia
CREATE TABLE Zamówienia (
ZamówienieID INT PRIMARY KEY,
KlientID INT,
Produkt VARCHAR(100)
);
INSERT INTO Zamówienia VALUES
(101, 1, 'Laptop'),
(102, 2, 'Monitor'),
(103, 2, 'Klawiatura'),
(104, 5, 'Mysz');
🎯 INNER JOIN – część wspólna
INNER JOIN zwraca wyłącznie te wiersze, dla których wartość klucza istnieje jednocześnie w obu tabelach. To najczęściej używany typ JOIN.
SELECT
k.KlientID,
k.Imie,
z.ZamówienieID,
z.Produkt
FROM Klienci AS k
INNER JOIN Zamówienia AS z
ON k.KlientID = z.KlientID;
Wynik:
| KlientID | Imie | ZamówienieID | Produkt |
|---|---|---|---|
| 1 | Anna | 101 | Laptop |
| 2 | Bartek | 102 | Monitor |
| 2 | Bartek | 103 | Klawiatura |
⬅️ LEFT JOIN – wszystko z lewej tabeli
LEFT JOIN zwraca wszystkie wiersze z lewej tabeli oraz dopasowane wiersze z prawej. Tam, gdzie nie ma dopasowania, pojawia się NULL.
SELECT
k.KlientID, k.Imie,
z.ZamówienieID, z.Produkt
FROM Klienci AS k
LEFT JOIN Zamówienia AS z
ON k.KlientID = z.KlientID;
Wynik:
| KlientID | Imie | ZamówienieID | Produkt |
|---|---|---|---|
| 1 | Anna | 101 | Laptop |
| 2 | Bartek | 102 | Monitor |
| 2 | Bartek | 103 | Klawiatura |
| 3 | Celina | NULL | NULL |
| 4 | Damian | NULL | NULL |
Trick – klienci BEZ zamówień
-- Znajdź klientów, którzy NIGDY nic nie zamówili
SELECT k.KlientID, k.Imie
FROM Klienci AS k
LEFT JOIN Zamówienia AS z
ON k.KlientID = z.KlientID
WHERE z.ZamówienieID IS NULL;
WHERE prawa_tabela.kolumna IS NULL po LEFT JOIN to klasyczny wzorzec do znajdowania rekordów bez odpowiednika. Używaj go przy audytach danych!➡️ RIGHT JOIN – wszystko z prawej tabeli
RIGHT JOIN to lustrzane odbicie LEFT JOIN – zwraca wszystkie wiersze z prawej tabeli oraz dopasowane z lewej.
SELECT
k.KlientID, k.Imie,
z.ZamówienieID, z.Produkt
FROM Klienci AS k
RIGHT JOIN Zamówienia AS z
ON k.KlientID = z.KlientID;
Wynik:
| KlientID | Imie | ZamówienieID | Produkt |
|---|---|---|---|
| 1 | Anna | 101 | Laptop |
| 2 | Bartek | 102 | Monitor |
| 2 | Bartek | 103 | Klawiatura |
| NULL | NULL | 104 | Mysz |
A RIGHT JOIN B można przepisać jako B LEFT JOIN A.🔄 FULL OUTER JOIN – pełna suma
FULL OUTER JOIN zwraca wszystkie wiersze z obu tabel. Gdzie brak dopasowania – pojawia się NULL.
SELECT k.KlientID, k.Imie, z.ZamówienieID, z.Produkt
FROM Klienci AS k
FULL OUTER JOIN Zamówienia AS z
ON k.KlientID = z.KlientID;
-- MySQL: emulacja przez UNION
SELECT k.KlientID, k.Imie, z.ZamówienieID, z.Produkt
FROM Klienci k LEFT JOIN Zamówienia z ON k.KlientID = z.KlientID
UNION
SELECT k.KlientID, k.Imie, z.ZamówienieID, z.Produkt
FROM Klienci k RIGHT JOIN Zamówienia z ON k.KlientID = z.KlientID;
UNION.✖️ CROSS JOIN – iloczyn kartezjański
CROSS JOIN łączy każdy wiersz pierwszej tabeli z każdym wierszem drugiej. Nie wymaga warunku ON. 4 × 3 = 12 wierszy.
SELECT k.Imie, p.NazwaProduktu
FROM Klienci AS k
CROSS JOIN Produkty AS p;
🪞 SELF JOIN – tabela z samą sobą
SELF JOIN to połączenie tabeli z samą sobą za pomocą aliasów. Stosuje się przy strukturach hierarchicznych – np. pracownicy i ich przełożeni.
-- Pracownik + imię jego przełożonego
SELECT
p.Imie AS Pracownik,
szef.Imie AS Przelozony
FROM Pracownicy AS p
LEFT JOIN Pracownicy AS szef
ON p.PrzelozonyID = szef.PracownikID;
📋 Porównanie wszystkich rodzajów JOIN
| Typ JOIN | Lewa tabela | Prawa tabela | Zastosowanie |
|---|---|---|---|
| INNER JOIN | Tylko dopasowane | Tylko dopasowane | Raporty z pewnymi danymi |
| LEFT JOIN | Wszystkie | Tylko dopasowane | Klienci z/bez zamówień |
| RIGHT JOIN | Tylko dopasowane | Wszystkie | Zamówienia z/bez klientów |
| FULL OUTER JOIN | Wszystkie | Wszystkie | Audyt danych |
| CROSS JOIN | Wszystkie × Wszystkie | Wszystkie × Wszystkie | Kombinacje, generatory |
| SELF JOIN | Tabela z sobą | Tabela z sobą | Hierarchie, drzewa |
🧭 Kiedy używać którego JOIN?
Zapamiętaj złotą zasadę JOIN
Zacznij od INNER JOIN. Jeśli brakuje Ci wierszy z jednej strony – przejdź na LEFT JOIN. Jeśli z obu stron – użyj FULL OUTER JOIN.
Chcesz nauczyć się SQL od podstaw?
Sprawdź nasz pełny kurs SQL – od SELECT po zaawansowane podzapytania i procedury składowane.
📚 SQL Kurs Podstawowy →