Różnica między JOIN a UNION w SQL

uprogramisty.pl 2 dni temu

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.
CechaJOINUNION
Kierunek łączeniaPoziomy (kolumny)Pionowy (wiersze)
WarunkiWymaga klucza łączeniaTaka sama struktura wyników
DuplikatyZależą od typu JOINUNION je usuwa,
UNION ALL nie
Typowe zastosowanieŁączenie danych relacyjnychScalanie raportów/różnych
źródeł
Podstawowa różnica między JOIN a UNION

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!

Idź do oryginalnego materiału