UNION i UNION ALL w SQL

Kacper Sieradziński
Kacper Sieradziński
30 września 2025SQL3 min czytania

W SQL często musimy połączyć dane z kilku zapytań w jeden wynik. Czasem chodzi o scalenie rekordów z tabel rocznych, czasem o zebranie danych z różnych źródeł w jeden raport. Do tego służą operatory UNION i UNION ALL — proste w składni, ale z kluczową różnicą, która wpływa zarówno na wynik, jak i wydajność zapytania. W tym artykule zobaczysz, czym się różnią, jak działają pod spodem, i kiedy warto używać którego.

Obraz główny UNION i UNION ALL w SQL

Zapisz się na nasz newsletter

Otrzymuj regularne aktualizacje, specjalne oferty i porady od ekspertów, które pomogą Ci osiągnąć więcej w krótszym czasie.

Czym jest UNION

UNION w SQL łączy wiersze z co najmniej dwóch zapytań, zwracając jeden zbiorczy wynik. Każde podzapytanie musi zwracać taką samą liczbę kolumn w tej samej kolejności, a typy muszą być zgodne lub możliwe do rzutowania. To „sklejanie pionowe” wyników, w odróżnieniu od JOIN, który łączy wiersze „w poziomie”.

Przykład podstawowy łączący osoby z dwóch tabel kontaktowych (unikalne wiersze):

SQL
1 2 3 SELECT imie, email FROM klienci UNION SELECT imie, email FROM leady;

Jeśli dopiero zaczynasz, warto przeczytać: Podstawy SQL: SELECT, WHERE, JOIN, GROUP BY.

MySQL — Jak zacząć? Darmowy e-book

MySQL — Jak zacząć? Darmowy e-book

Praktyczny przewodnik po świecie SQL. Poznaj typy danych, zapytania SELECT, JOIN, funkcje agregujące i nie tylko.

Czym różni się UNION od UNION ALL

UNION usuwa duplikaty, więc ten operator wykonuje dodatkowy krok deduplikacji (zwykle sortowanie lub hash). UNION ALL w SQL nie deduplikuje, zachowuje wszystkie wiersze, jest więc szybszy i bardziej przewidywalny w liczeniu.

Prosty kontrast na krótkim przykładzie (te same wartości wejściowe, różny wynik):

SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 -- 2 wiersze w wyniku: 'A', 'B' SELECT 'A' AS x UNION SELECT 'A' UNION SELECT 'B'; -- 3 wiersze w wyniku: 'A', 'A', 'B' SELECT 'A' AS x UNION ALL SELECT 'A' UNION ALL SELECT 'B';

UNION vs UNION ALL: wybierz UNION ALL w SQL, gdy duplikaty są oczekiwane lub chcesz zachować dokładne liczby; UNION w SQL, gdy potrzebujesz unikalnych wierszy.

Zasady działania

Liczba kolumn i ich kolejność muszą być identyczne w każdym SELECT. Nazwy kolumn w wyniku pochodzą wyłącznie z pierwszego SELECT — używaj aliasów w pierwszej części zapytania, jeśli chcesz je kontrolować.

Typy danych muszą być zgodne lub możliwe do bezpiecznego rzutowania. W wielu silnikach jeden operand wyznacza „typ docelowy”, a pozostałe są rzutowane. Gdy automatyczne rzutowanie jest niejasne, rzutuj jawnie:

SQL
1 2 3 4 5 SELECT id, CAST(kwota AS DECIMAL(12,2)) AS kwota FROM sprzedaz_2023 UNION ALL SELECT id, kwota FROM sprzedaz_2024;

Różnice między systemami (np. reguły promocji typów) omówiłem tu: Typy danych w SQL: PostgreSQL vs MySQL.

Przykłady praktyczne

Lista kontrahentów tworzona z klientów i dostawców. Dodajemy kolumnę „zrodlo”, by wiedzieć, skąd pochodzi rekord. Tu zwykle wybierzesz UNION ALL w SQL, a ewentualną deduplikację zrobisz później po kluczu:

SQL
1 2 3 SELECT id, nazwa, 'klient' AS zrodlo FROM klienci UNION ALL SELECT id, nazwa, 'dostawca' AS zrodlo FROM dostawcy;

Archiwum sprzedaży w tabelach partycjonowanych per rok. Najpierw łączymy, potem filtrujemy i sortujemy:

SQL
1 2 3 4 SELECT data, klient_id, kwota FROM sprzedaz_2023 UNION ALL SELECT data, klient_id, kwota FROM sprzedaz_2024 ORDER BY data DESC;

UNION czy JOIN? UNION łączy pionowo (więcej wierszy, te same kolumny), JOIN łączy poziomo (więcej kolumn na wiersz). Gdy potrzebujesz dalej obrabiać wynik, przyda się CTE: Podzapytania i CTE w SQL.

Potencjalne problemy

Duplikaty: UNION usuwa duplikaty globalnie po wszystkich kolumnach. Jeśli chcesz zachować wszystkie wiersze, użyj UNION ALL, a deduplikację wykonaj świadomie (np. po kluczach z ROW_NUMBER()). Pamiętaj, że różne białe znaki/małe-wielkie litery mogą wpływać na „równość” wierszy w zależności od kolacji.

ORDER BY tylko raz na końcu całego wyrażenia. ORDER BY wewnątrz podzapytań ma sens tylko z LIMIT/TOP, by ograniczyć próbkę przed scaleniem:

SQL
1 2 3 4 (SELECT id, kwota FROM sprzedaz_2023 ORDER BY kwota DESC LIMIT 5) UNION ALL (SELECT id, kwota FROM sprzedaz_2024 ORDER BY kwota DESC LIMIT 5) ORDER BY kwota DESC;

Wydajność: UNION w SQL wymaga deduplikacji (koszt CPU/pamięci), a UNION ALL w SQL jest zazwyczaj liniowy. Przy dużych danych wybieraj UNION ALL i deduplikuj później selektywnie lub po mniejszym zestawie kolumn. Więcej praktyk: Optymalizacja zapytań i plany wykonania.

Podsumowanie

UNION = unikalne wiersze dzięki deduplikacji; UNION ALL = wszystkie wiersze bez dodatkowego kosztu. Różnice UNION vs UNION ALL sprowadzają się do duplikatów i wydajności.

Pamiętaj o zasadach: taka sama liczba kolumn, zgodne typy i pojedynczy ORDER BY na końcu. UNION vs UNION ALL dobieraj do celu analitycznego: dokładne liczenie i pełna historia → UNION ALL; raport unikalnych rekordów → UNION.

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa

Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.