SQL JOIN — kompletny przewodnik (INNER, LEFT, RIGHT, FULL i więcej)

SQL JOIN — kompletny przewodnik

JOINy służą do łączenia danych z wielu tabel. Poniżej znajdziesz najważniejsze typy JOIN wraz z przykładami i wizualizacją.

Załóżmy dwie tabele:

  • users
  • orders

🔹 1. INNER JOIN

Zwraca tylko wspólne dane.

users     orders

A A
B B
C

Result:
A
B
SELECT *
FROM users
INNER JOIN orders ON users.id = orders.user_id;

🔹 2. LEFT JOIN

Wszystko z lewej + dopasowania z prawej.

users     orders

A A
B B
C

Result:
A
B
C (NULL)
SELECT *
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

🔹 3. RIGHT JOIN

Wszystko z prawej + dopasowania z lewej.

users     orders

A A
B B
D

Result:
A
B
D (NULL)

🔹 4. FULL OUTER JOIN

Wszystko z obu tabel.

users     orders

A A
B B
C D

Result:
A
B
C (NULL)
D (NULL)
SELECT *
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;

👉 MySQL: trzeba robić UNION


🔹 5. CROSS JOIN

Każdy z każdym (iloczyn kartezjański).

users: A, B
orders: X, Y

Result:
A-X
A-Y
B-X
B-Y
SELECT *
FROM users
CROSS JOIN orders;

🔹 6. SELF JOIN

Tabela łączy się sama ze sobą.

SELECT a.name, b.name
FROM users a
JOIN users b ON a.manager_id = b.id;

👉 używane np. w hierarchiach


🔹 7. LEFT JOIN + WHERE NULL (ANTI JOIN)

Zwraca rekordy bez dopasowania.

users     orders

A A
B
C

Result:
B
C
SELECT users.*
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.id IS NULL;

🔹 8. INNER JOIN z dodatkowymi warunkami

JOIN + filtr logiczny.

SELECT *
FROM users
JOIN orders
ON users.id = orders.user_id
AND orders.status = 'paid';

🔹 9. UNION jako alternatywa FULL JOIN

(MySQL workaround)

SELECT * FROM users
LEFT JOIN orders ON users.id = orders.user_id

UNION

SELECT * FROM users
RIGHT JOIN orders ON users.id = orders.user_id;

🔥 Podsumowanie (ważne w praktyce)

  • INNER JOIN → najczęściej używany
  • LEFT JOIN → backend standard
  • RIGHT JOIN → rzadko potrzebny
  • FULL JOIN → raporty / analizy
  • CROSS JOIN → prawie nigdy w produkcji
  • SELF JOIN → relacje hierarchiczne
  • ANTI JOIN → bardzo przydatny (np. brakujące dane)

💡 Bonus (Laravel)

W Laravelu INNER JOIN to:

User::join('orders', 'users.id', '=', 'orders.user_id')->get();

ale często lepiej używać:

eager loading (with())

relacji Eloquent

LEFT JOIN:
User::leftJoin('orders', 'users.id', '=', 'orders.user_id')->get();

RIGHT JOIN
User::rightJoin('orders', 'users.id', '=', 'orders.user_id')->get();

⚠️ Ważna rzecz (Laravel mindset)

To nie jest „Eloquent w pełni”, tylko:

👉 Query Builder przez Eloquent

Bo:

  • tracisz relacje (hasMany, belongsTo)
  • tracisz modele w czystej formie
  • dostajesz bardziej „SQL-like” wynik

🧠 Lepsze podejście w Laravel (często)

Zamiast JOIN:

User::with('orders')->get();

Comments are closed!