Wstęp
SQL oferuje różne sposoby łączenia danych, ale nie każdy mechanizm działa tak samo. Dwa najczęściej używane sposoby to JOIN i UNION. Oba służą do operowania na wielu tabelach, ale ich działanie znacząco się różni. W tym wpisie z serii „Szybki strzał” przeanalizujemy, różnicę między JOIN a UNION i kiedy warto z nich korzystać.
Podstawowa różnica między JOIN a UNION
W SQL zarówno JOIN, jak i UNION służą do łączenia danych, ale działają na zupełnie innych zasadach.
- JOIN służy do łączenia rekordów z różnych tabel na podstawie relacji między nimi. Wynik zapytania zawiera kolumny z obu tabel, powiązane według określonych warunków.
- UNION pozwala na połączenie wyników dwóch lub więcej zapytań w jeden zestaw wynikowy. Łączone dane muszą mieć taką samą liczbę kolumn i zgodne typy danych.
Kierunek łączenia | Poziomy (kolumny) | Pionowy (wiersze) |
Warunki | Wymaga klucza łączenia | Taka sama struktura wyników |
Duplikaty | Zależą od typu JOIN | UNION je usuwa, UNION ALL nie |
Typowe zastosowanie | Łączenie danych relacyjnych | Scalanie raportów/różnych źródeł |
Przykłady zastosowania
W ramach przykładów będziemy operować na poniższej strukturze tabel:
CREATE TABLE klienci ( id INT PRIMARY KEY, imie VARCHAR(50), nazwisko VARCHAR(50), telefon VARCHAR(15) ); CREATE TABLE zamowienia ( id INT PRIMARY KEY, klient_id INT, nazwa VARCHAR(100), FOREIGN KEY (klient_id) REFERENCES klienci(id) ); CREATE TABLE pracownicy ( id INT PRIMARY KEY, imie VARCHAR(50), nazwisko VARCHAR(50) );Przykład JOIN – pobieranie powiązanych danych
Chcemy pobrać listę klientów oraz nazwę ich zamówienia z tabel klienci i zamowienia.
SELECT klienci.imie, klienci.nazwisko, zamowienia.nazwa FROM klienci JOIN zamowienia ON klienci.id = zamowienia.klient_id;Tutaj JOIN dodatkowo pobiera kolumnę nazwa z tabeli zamowienia, aby uzyskać dodatkowo, oprócz klienta, nazwę jego zamówienia. Mamy tutaj relacje pomiędzy identyfikatorem klienta, a identyfikatorem klienta ustawionym w tabeli zamowienia. Dzięki temu możemy użyć JOIN pomiędzy tabelami.
Możemy oczywiście też w drugą stronę łączyć. Pobieramy dane o zamówieniach oraz chcemy dla wszystkich zamówienia wyciągnąć też numer telefonu klienta, który to zamówienie złożył:
SELECT z.*, k.telefon FROM zamowienia z JOIN klienci k on k.id = z.klient_id;Przykład UNION – scalanie wyników z różnych tabel
UNION stosujemy wtedy, gdy chcemy pobrać dane z kilku tabel, które w jakimś stopniu, merytorycznie są do siebie w jakiś sposób podobne. Poniżej przykład pobrania danych o wszystkich osobach z tabel klienci i pracownicy wraz z oznaczeniem jaką pełnią rolę posortowanymi po imieniu.
SELECT imie, nazwisko, 'Klient' AS rola FROM klienci UNION SELECT imie, nazwisko, 'Pracownik' FROM pracownicy order by imie;Przykład JOIN i UNION w jednym zapytaniu
Oczywiście nic nie stoi na przeszkodzie, aby używać JOIN i UNION w jednym zapytaniu SQL. Możemy najpierw połączyć tabele dzięki JOIN, a następnie scalić wyniki przy użyciu UNION. Przykład zastosowania poniżej.
SELECT k.imie, k.nazwisko, z.nazwa FROM klienci k JOIN zamowienia z ON k.id = z.klient_id UNION SELECT p.imie, p.nazwisko, NULL FROM pracownicy p;W tym przypadku JOIN łączy dane z tabel klienci i zamowienia, a UNION dodaje do wyniku dodatkowe rekordy z tabeli pracownicy, w której nie ma kolumny nazwa zamówienia, więc używamy NULL dla zachowania zgodności struktury wynikowej.
Kiedy używać JOIN, a kiedy UNION?
JOIN – kiedy używać?
- Gdy potrzebujemy połączyć powiązane dane z różnych tabel. Istnieje relacja między tabelami taka, iż jesteśmy wstanie je powiązać pomiędzy sobą.
- Jeśli chcemy zobaczyć zależności między tabelami (np. zamówienia klientów, produkty w kategoriach).
UNION – kiedy używać?
- Gdy chcemy połączyć wyniki z różnych tabel lub zapytań.
- Kiedy dane nie mają bezpośredniego związku kluczami, ale mają tę samą strukturę.
- Jeśli potrzebujemy usunąć duplikaty (lub zostawić je w przypadku UNION ALL).
Podsumowanie
Różnica między JOIN a UNION w SQL jest istotna, ponieważ wpływa na sposób łączenia danych i optymalizację zapytań. Każdy z tych mechanizmów ma swoje konkretne zastosowanie i warto znać ich specyfikę, aby pisać bardziej efektywny kod SQL.
Najważniejsza różnica: JOIN łączy dane z różnych tabel w ramach jednego wiersza, a UNION scala wyniki wielu zapytań w jedną tabelę wynikową.
Znajomość tych mechanizmów pozwala pisać efektywne zapytania SQL i optymalnie przetwarzać dane. Wybór między JOIN a UNION zależy od tego, czy dane są powiązane kluczami (JOIN), czy po prostu chcemy połączyć wyniki kilku zapytań (UNION).
Jeśli chcielibyście bardziej szczegółowy wpis na temat któregoś z tych mechanizmów, dajcie znać w komentarzu!