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):
SQL1 2 3SELECT 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
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):
SQL1 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:
SQL1 2 3 4 5SELECT 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:
SQL1 2 3SELECT 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:
SQL1 2 3 4SELECT 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:
SQL1 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
Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.



