| Typ JOIN | Co zwraca |
|---|---|
INNER JOIN | Tylko wiersze z dopasowaniem w obu tabelach |
LEFT JOIN | Wszystkie wiersze z lewej tabeli + dopasowania z prawej (NULL gdy brak) |
RIGHT JOIN | Wszystkie wiersze z prawej tabeli + dopasowania z lewej (NULL gdy brak) |
FULL OUTER JOIN | Wszystkie wiersze z obu tabel (MySQL: UNION LEFT+RIGHT) |
CROSS JOIN | Iloczyn kartezjański — każdy z każdym |
SELF JOIN | Tabela łą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;
-- 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;
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 — 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;
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)?
Dopasuj typ JOIN do opisu wyniku:
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;
INNER JOIN — tylko wiersze z dopasowaniem w obu tabelachLEFT JOIN — wszystkie z lewej + NULL dla niepasujących z prawejLEFT JOIN ... WHERE prawa.id IS NULL — antyłączenie (rekordy bez pary)k, z) skracają kod i są niezbędne w self-joinLEFT JOIN UNION RIGHT JOIN