SQL: Łączenie tabel

Baza danych do pobrania: sklep
UNION / UNION ALL
Łączy wyniki dwóch lub więcej zapytań SELECT.
SELECT nazwy_kolumn FROM nazwa_tabeli UNION SELECT nazwy_kolumn FROM nazwa_tabeli2
Wypiszmy listę nazwisk znajdujących się w tabelach klient i pracownik.
SELECT nazwisko FROM klient UNION SELECT nazwisko FROM pracownik ORDER by nazwisko;
+-------------+ | nazwisko | +-------------+ | Augustowski | | Barcicki | | Bartos | | Basta | | Brózda | | Bruzda | | Bryja | | Bugaj | | Buś | ...
Różnica pomiędzy UNION, a UNION ALL polega na tym, że UNION zwraca listę niepowtarzających się elementów, natomiast UNION ALL wszystkich.
INNER JOIN
Wybiera z iloczynu kartezjańskiego te wiersze, dla których spełniony jest warunek.
SELECT nazwy_kolumn FROM nazwa_tabeli INNER JOIN nazwa_tabeli2 ON tabela1.nazwa_kolumny = tabela2.nazwa_kolumny;
Wypiszmy listę nazwisk klientów wraz z numerami id transakcji, których dokonali.
SELECT klient.nazwisko, transakcja.id FROM transakcja INNER JOIN klient ON transakcja.klient_id = klient.id;
+----------+-----+ | nazwisko | id | +----------+-----+ | Dulęba | 33 | | Dulęba | 61 | | Dulęba | 134 | | Dulęba | 212 | | Dulęba | 309 | | Dulęba | 350 | | Dulęba | 370 | | Dulęba | 483 | | Dulęba | 535 | | Dulęba | 562 | | Dulęba | 585 | | Dulęba | 709 | | Dulęba | 754 | | Dulęba | 851 | | Dulęba | 982 | | Martin | 76 | | Martin | 207 | | Martin | 246 | ...
Ten sam efekt uzyskamy wykonując zapytanie bez użycia INNERJOIN:
SELECT klient.nazwisko, transakcja.id FROM klient, transakcja WHERE klient.id = transakcja.klient_id;
LEFT JOIN / RIGHT JOIN / CROSS JOIN
LEFT JOIN – zwraca wszystkie wiersze lewej relacji i uzupełnia danymi z prawej, natomiast RIGHT JOIN odwrotnie. CROSS JOIN natomiast zwraca wszystkie możliwe kombinacje (iloczyn kartezjański) elementów relacji z lewej i prawej strony wyrażenia.
SELECT nazwy_kolumn FROM nazwa_tabeli LEFT JOIN nazwa_tabeli2 ON tabela1.nazwa_kolumny = tabela2.nazwa_kolumny;
SELECT nazwy_kolumn FROM nazwa_tabeli RIGHT JOIN nazwa_tabeli2 ON tabela1.nazwa_kolumny = tabela2.nazwa_kolumny;
SELECT nazwy_kolumn FROM nazwa_tabeli CROSS JOIN nazwa_tabeli2 ON tabela1.nazwa_kolumny = tabela2.nazwa_kolumny;
Wypiszmy listę id transakcji oraz imiona i nazwiska pracowników, którzy ich dokonali. Zależy nam na wypisaniu wszystkich transakcji.
SELECT transakcja.id, pracownik.nazwisko, pracownik.imie FROM transakcja LEFT JOIN pracownik ON transakcja.pracownik_id = pracownik.id ORDER BY transakcja.id;