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:
usersorders
🔹 1. INNER JOIN
Zwraca tylko wspólne dane.
users orders
A A
B B
C
Result:
A
BSELECT *
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-YSELECT *
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
CSELECT 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!