🎯 Cele lekcji

🔗

1. Po co JOIN? Rodzaje JOIN

JOIN łączy wiersze z dwóch lub więcej tabel na podstawie wspólnej kolumny (najczęściej klucza obcego). Umożliwia odczytanie danych z powiązanych tabel w jednym zapytaniu.
Typ JOINCo zwraca
INNER JOINTylko wiersze z dopasowaniem w obu tabelach
LEFT JOINWszystkie wiersze z lewej tabeli + dopasowania z prawej (NULL gdy brak)
RIGHT JOINWszystkie wiersze z prawej tabeli + dopasowania z lewej (NULL gdy brak)
FULL OUTER JOINWszystkie wiersze z obu tabel (MySQL: UNION LEFT+RIGHT)
CROSS JOINIloczyn kartezjański — każdy z każdym
SELF JOINTabela łączona sama ze sobą
-- INNER JOIN — tylko klienci, którzy złożyli zamówienie
SELECT k.imie, k.nazwisko, z.data, z.kwota
FROM klienci k
INNER JOIN zamowienia z ON k.id_klienta = z.id_klienta;

-- LEFT JOIN — wszyscy klienci, nawet bez zamówień (NULL gdy brak)
SELECT k.imie, k.nazwisko, z.data, z.kwota
FROM klienci k
LEFT JOIN zamowienia z ON k.id_klienta = z.id_klienta;

-- Klienci BEZ żadnego zamówienia (antyłączenie)
SELECT k.imie, k.nazwisko
FROM klienci k
LEFT JOIN zamowienia z ON k.id_klienta = z.id_klienta
WHERE z.id_zamowienia IS NULL;
🏗️

2. JOIN wielu tabel — kompletny przykład

-- Zamówienia: klient + data + produkt + ilość
SELECT k.imie, k.nazwisko,
       z.data,
       p.nazwa AS produkt,
       pz.ilosc,
       pz.cena_jedn * pz.ilosc AS wartosc
FROM klienci k
INNER JOIN zamowienia z  ON k.id_klienta = z.id_klienta
INNER JOIN pozycje_zamowien pz ON z.id_zamowienia = pz.id_zamowienia
INNER JOIN produkty p  ON pz.id_produktu = p.id_produktu
WHERE z.data >= '2024-01-01'
ORDER BY z.data DESC, k.nazwisko;
Aliasy tabel (k, z, pz, p) skracają zapis i są niezbędne przy self-join. Używaj krótkich, logicznych skrótów nazw tabel.

CROSS JOIN i Self-Join:

-- CROSS JOIN — każdy produkt z każdą kategorią (rzadko używany)
SELECT p.nazwa, k.nazwa AS kat
FROM produkty p CROSS JOIN kategorie k;

-- SELF JOIN — pracownicy i ich przełożeni (w tej samej tabeli)
SELECT e.imie AS pracownik,
       m.imie AS przelozony
FROM pracownicy e
LEFT JOIN pracownicy m ON e.id_przelozonego = m.id_pracownika;

-- FULL OUTER JOIN w MySQL (przez UNION)
SELECT k.imie, z.kwota FROM klienci k LEFT JOIN zamowienia z ON k.id_klienta=z.id_klienta
UNION
SELECT k.imie, z.kwota FROM klienci k RIGHT JOIN zamowienia z ON k.id_klienta=z.id_klienta;
✏️

Zadania interaktywne

Zadanie 1Quiz: LEFT JOIN vs INNER JOIN

Masz tabele: klienci (100 rekordów) i zamowienia. 30 klientów złożyło co najmniej 1 zamówienie. Ile wierszy zwróci SELECT ... FROM klienci k LEFT JOIN zamowienia z ON ... (zakładając 50 zamówień łącznie)?

  • 30 wierszy (tylko klienci z zamówieniami)
  • 50 wierszy (liczba zamówień)
  • Minimum 100 wierszy (wszyscy klienci, więcej jeśli mają kilka zamówień)
  • 100 wierszy dokładnie (jeden wiersz per klient)
Zadanie 2Dobierz typ JOIN do opisu

Dopasuj typ JOIN do opisu wyniku:

Chcę wszystkich pracowników, nawet tych bez przypisanego działu
Chcę tylko pary produkt-zamówienie, gdzie produkt istnieje w obu tabelach
Pracownicy i ich przełożeni — obie kolumny z tej samej tabeli
Zadanie 3Uzupełnij brakujący JOIN

Poniższe zapytanie ma zwrócić nazwy produktów wraz z ich kategoriami. Uzupełnij brakującą klauzulę JOIN:

SELECT p.nazwa, k.nazwa AS kategoria
FROM produkty p
/* ? */ kategorie k ON p.id_kategorii = k.id_kategorii;
  • WHERE JOIN
  • INNER JOIN
  • SELECT JOIN
  • FROM JOIN

📌 Zapamiętaj