Lekcja 26: Operatory na zbiorach - UNION i UNION ALL

Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Lekcja 26: Operatory na zbiorach - UNION i UNION ALL
Required In Progress

Łączenie wierszy z dwóch lub więcej zapytań SELECT

Musimy rozróżnić dwie operacje łączenia:

  • JOIN (Lekcja 14): Łączy dane w poziomie (dodaje kolumny z innych tabel).
  • Operatory zbiorów (UNION): Łączą dane w pionie (dodają wiersze z innych zapytań, „sztaplują” wyniki jeden na drugim).

Wymagania (ta sama liczba kolumn, zgodne typy danych)

Aby UNION lub UNION ALL mogły zadziałać, zapytania SELECT po obu stronach operatora muszą spełniać dwa ścisłe warunki:

  1. Muszą zwracać tę samą liczbę kolumn.
  2. Kolumny w tej samej pozycji muszą mieć zgodne typy danych (np. nie można łączyć kolumny tekstowej z liczbową; ale można INT z DECIMAL).

Różnica między UNION (unikalne wiersze) a UNION ALL (wszystkie wiersze)

To jest krytyczna różnica, mająca ogromny wpływ na wydajność.

UNION ALL: Jest to prosta operacja. Baza danych wykonuje pierwsze zapytanie, wykonuje drugie zapytanie i po prostu „dokleja” wyniki drugiego na koniec wyników pierwszego. Duplikaty są zachowywane. Jest to operacja bardzo szybka.

UNION: Działa inaczej. Baza danych pobiera wyniki obu zapytań, łączy je, a następnie wykonuje kosztowną operację sortowania i usuwania duplikatów (zwraca tylko unikalne wiersze). Jest to operacja znacznie wolniejsza.

Dobra praktyka: Zawsze należy używać UNION ALL, chyba że jawnie i świadomie chcemy usunąć duplikaty (co zdarza się znacznie rzadziej niż potrzeba prostego połączenia zbiorów).

Przykład: Chcemy stworzyć jedną listę kontaktową wszystkich osób w szkole (uczniów i nauczycieli).

SELECT Imie, Nazwisko, Email, 'Uczen' AS Rola
FROM Uczniowie
UNION ALL
SELECT Imie, Nazwisko, Email, 'Nauczyciel' AS Rola
FROM Nauczyciele;

(Opcjonalnie) INTERSECT i EXCEPT

  • INTERSECT: Zwraca tylko te wiersze, które występują w obu zestawach wyników (część wspólna).
  • EXCEPT (lub MINUS w dialekcie Oracle): Zwraca wiersze z pierwszego zestawu, które nie występują w drugim (różnica zbiorów).