Przejdź do głównej treści

Operatory zbiorów w SQL: kompleksowy przewodnik

Opanuj operatory zbiorów w SQL: UNION, UNION ALL, INTERSECT i EXCEPT. Poznaj zasady składni, zobacz praktyczne przykłady i dowiedz się, kiedy używać każdego operatora.
Zaktualizowano 2 cze 2026  · 11 min Czytać

Operacje na zbiorach stanowią podstawę SQL i pozwalają łączyć, porównywać oraz filtrować dane z wielu źródeł. Są niezbędne w zadaniach od integracji i czyszczenia danych po zaawansowaną analitykę i raportowanie.

W tym samouczku poznasz, czym są operatory zbiorów, jak używać ich w SQL, ich praktyczne zastosowania i nie tylko! Jeśli szukasz kompletnego źródła do nauki SQL, zobacz siedmiokursowy ścieżkę umiejętności SQL Fundamentals.

Dla tych, którym się spieszy, zacznijmy od bardzo krótkiej odpowiedzi na to, czym są operacje na zbiorach w SQL.

Czym są operacje na zbiorach w SQL?

Operacje na zbiorach w SQL to techniki łączenia lub porównywania wyników dwóch lub więcej instrukcji SELECT. Działają jak matematyczne operacje na zbiorach, pozwalając znaleźć sumę, część wspólną lub różnicę między wierszami zwróconymi przez zapytania. Dzięki temu są nieodzowne przy analizie danych z wielu źródeł lub perspektyw.

Oto szybki przegląd podstawowych operacji na zbiorach:

  • UNION: Łączy wszystkie unikalne wiersze z dwóch lub więcej instrukcji SELECT, usuwając duplikaty.

  • UNION ALL: Łączy wszystkie wiersze z dwóch lub więcej instrukcji SELECT, zachowując duplikaty.

  • INTERSECT: Zwraca tylko wiersze występujące w obu instrukcjach SELECT.

  • EXCEPT: Zwraca wiersze z pierwszej instrukcji SELECT, które nie występują w drugiej.

Porównanie z algebrą relacyjną

Algebra relacyjna to ramy teoretyczne stanowiące podstawę zrozumienia zapytań bazodanowych. Oferuje abstrakcyjne operacje, takie jak rzutowanie, selekcja i złączenie, osadzone w zasadach matematycznych i niezależne od konkretnych systemów baz danych. Możesz myśleć o niej jak o „logice zza kulis”, która napędza nasze interakcje z bazą.

Operatory zbiorów w SQL zapewniają praktyczną implementację tych koncepcji w środowisku bazy danych. Umożliwiają wykonywanie operacji takich jak suma, część wspólna i różnica bezpośrednio na wynikach zapytań SQL.

Choć algebra relacyjna dostarcza formalnych podstaw dla operacji bazodanowych, operatory zbiorów w SQL oferują ustandaryzowany, przyjazny interfejs do manipulacji danymi.

Zrozumienie relacji między operatorami zbiorów a operacjami algebry relacyjnej daje wgląd w teoretyczne podstawy SQL. Znajomość tego powiązania pomaga pisać zapytania z jaśniejszym modelem mentalnym tego, co dzieje się „pod maską”.

Rodzaje operatorów zbiorów w SQL

W SQL istnieją trzy podstawowe operatory zbiorów:

  • UNION

  • INTERSECT

  • EXCEPT (lub MINUS w niektórych dialektach)

Te operatory odpowiadają matematycznym pojęciom sumy, części wspólnej i różnicy zbiorów.

Zasady używania operatorów zbiorów

Zanim połączysz zapytania operatorami zbiorów, muszą być spełnione cztery wymagania. Jeśli któregokolwiek nie dopilnujesz, zapytanie zakończy się błędem.

  • Taka sama liczba kolumn: Każde SELECT musi zwracać tę samą liczbę kolumn. Jeśli jedno zapytanie zwraca trzy kolumny, a inne dwie, baza zgłosi błąd.

  • Kompatybilne typy danych: Odpowiadające sobie kolumny muszą mieć zgodne typy. Nie możesz połączyć kolumny VARCHAR z imionami z kolumną INTEGER z identyfikatorami w tej samej pozycji.

  • Taka sama kolejność kolumn: SQL mapuje kolumny po pozycji, a nie po nazwie. Pierwsza kolumna pierwszego zapytania odpowiada pierwszej kolumnie drugiego zapytania, niezależnie od ich nazw.

  • ORDER BY tylko na końcu: ORDER BY musi wystąpić raz, na samym końcu złożonego zapytania. Nie możesz go używać wewnątrz poszczególnych instrukcji SELECT.

Jeszcze jedna uwaga: nazwy kolumn w wyniku pochodzą z pierwszej instrukcji SELECT. Aliasy w kolejnych zapytaniach są ignorowane, więc jeśli potrzebujesz własnych nazw wyjściowych, dodaj aliasy tylko w pierwszym zapytaniu.

Jak używać operatora UNION w SQL

Operator UNION łączy wyniki dwóch lub więcej zapytań SELECT w jeden zbiór wyników, domyślnie usuwając duplikaty wierszy.

Załóżmy, że mamy dwie tabele: employees i contractors, każda o podobnych kolumnach, takich jak contractors, department i salary. Na potrzeby nauki rozważmy dwie przykładowe tabele:

employees:

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

contractors:

name

department

salary

David

Marketing

60000

Eva

Sales

68000

Carol

Engineering

75000

Możemy połączyć wyniki obu tabel poleceniem:

-- Using UNION to combine all employees and contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;

To zapytanie wybiera kolumny name, department i salary z tabel employees oraz contractors i łączy je w jeden wynik. Operator UNION automatycznie usuwa zduplikowane wiersze z końcowego zbioru wyników.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

David

Marketing

60000

Eva

Sales

68000

Zauważ, że Carol, która występuje w obu tabelach, jest wymieniona tylko raz w wyniku. Gdybyśmy chcieli zachować oba wystąpienia Carol (z różnymi pensjami), użyjemy UNION ALL.

UNION vs UNION ALL

Operator UNION nie usuwa wartości NULL. Jeśli w jednej kolumnie w jednym zbiorze wyników występują wartości NULL, a w odpowiadającej kolumnie drugiego zbioru wartości nie-NULL, wartości NULL zostaną zachowane w ostatecznym wyniku generowanym przez UNION.

Jeśli chcesz uwzględnić wartości NULL w wynikach i zapobiec ich usunięciu przez UNION, użyj operatora UNION ALL. Ten operator łączy wyniki wielu zapytań SELECT, w tym wszystkie wiersze z każdego zbioru wyników, niezależnie od tego, czy są duplikatami lub zawierają wartości NULL.

Jak używać operatora INTERSECT w SQL

Operator INTERSECT zwraca tylko wiersze, które występują w obu zbiorach wyników. Pomyśl o tym jak o znalezieniu osób należących do obu grup.

Zastosujmy INTERSECT do naszych tabel powyżej. Na potrzeby przykładu zapytajmy tylko kolumny name i department:

-- Using INTERSECT to find common employees
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;

To zapytanie wybiera kolumny name i department z tabel employees i contractors oraz zwraca tylko te wiersze, które istnieją w obu tabelach na podstawie wszystkich wybranych kolumn.

name

department

Carol

Engineering

Operator INTERSECT obsługuje wartości NULL zgodnie ze standardowymi zasadami porównywania, uznając wartości NULL za równe przy porównywaniu odpowiadających sobie kolumn. Skutkuje też pustym zbiorem w przypadku pracy na pustych wynikach.

Innymi słowy, jeśli w jednym zbiorze wyników występuje wartość NULL, a w odpowiadającej kolumnie drugiego zbioru wartość nie-NULL, wiersze nie są uznawane za równe – nie zostaną uwzględnione w wyniku części wspólnej.

Dodatkowo, jeśli jeden ze zbiorów wyników przekazanych do operatora INTERSECT jest pusty, wynik całości też będzie pusty. Nie ma wierszy wspólnych między pustym zbiorem a czymkolwiek innym.

Jak używać operatora UNION w SQL

Operator EXCEPT zwraca wiersze z pierwszego zbioru wyników, których nie ma w drugim.

W Oracle Database EXCEPT zapisuje się jako MINUS; wszystkie pozostałe główne dialekty (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) używają EXCEPT.

Na przykład, załóżmy, że wykonujemy następujące zapytanie:

-- Using EXCEPT to find employees who are not contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;

Kolumny name, department i salary są wybierane z tabeli employees i zwracają tylko te wiersze, które nie istnieją w tabeli contractors.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

John

HR

55000

Operator EXCEPT również podąża za standardowymi zasadami porównywania przy obsłudze wartości NULL. Jego zachowanie względem pustych wyników skutkuje pustym zbiorem, jeśli pierwszy zbiór jest pusty, albo uwzględnieniem wszystkich wierszy z pierwszego zbioru, jeśli drugi zbiór jest pusty.

Operatory zbiorów w SQL: wydajność i optymalizacja

Wpływ operatorów zbiorów na wydajność zapytań w SQL może się różnić w zależności od takich czynników jak rozmiar zbiorów danych, złożoność zapytań oraz używany system zarządzania bazą danych (DBMS).

Przyjrzyjmy się kluczowym czynnikom i strategiom optymalizacji.

Wolumen danych i złożoność zapytań

Praca na dużych ilościach danych może znacząco wpływać na wydajność, ponieważ rozmiar zbiorów wyników do połączenia, przecięcia lub porównania zwiększa czas potrzebny na wykonanie operacji.

Złożone zapytania zawierające wiele podzapytań, złączeń lub operatorów zbiorów mogą generować dodatkowy narzut i pogarszać wydajność. Łańcuchowe lub zagnieżdżone operacje zbiorów mogą jeszcze bardziej potęgować skutki wydajnościowe.

Indeksowanie i techniki optymalizacji

Właściwe indeksowanie kolumn używanych w operacjach zbiorów może znacząco poprawić wydajność. Indeksy pomagają silnikowi bazy szybko zlokalizować i pobrać odpowiednie wiersze, ograniczając pełne skany tabel i skracając czas wykonania.

Aby poprawić wydajność zapytań z operatorami zbiorów, administratorzy i deweloperzy mogą stosować takie techniki jak przepisywanie zapytań, analiza planów wykonania i optymalizacja schematu. Warto też wykorzystywać pamięć podręczną zapytań oraz zmaterializowane widoki do wstępnego obliczenia i przechowywania wyników złożonych zapytań, zmniejszając koszt obliczeniowy operacji na zbiorach.

Silnik bazy i zasoby sprzętowe

Wydajność operacji zbiorów może się różnić w zależności od użytego silnika bazy i jego możliwości optymalizacyjnych. Różne DBMS-y stosują odmienne strategie i algorytmy przetwarzania operacji zbiorów, co może skutkować różnicami w wydajności.

Dostępność zasobów sprzętowych, takich jak CPU, pamięć i I/O dyskowe, również wpływa na wydajność zapytań z operatorami zbiorów. Odpowiednie zasoby pomagają łagodzić wąskie gardła i zapewniają sprawne wykonanie zapytań.

Operatory zbiorów w praktyce

Operatory zbiorów to nie tylko narzędzia teoretyczne; mają realne zastosowania, które mogą istotnie wpływać na decyzje biznesowe. Przejdźmy przez uproszczony przykład, jak firma może użyć operatorów zbiorów do segmentacji bazy klientów pod kątem ukierunkowanych kampanii marketingowych.

Scenariusz

Wyobraź sobie firmę sprzedającą zarówno online, jak i w sklepach stacjonarnych. Mają dwa oddzielne zbiory danych:

  1. Zakupy online: ID klienta, historia zakupów, dane demograficzne i lokalizacja dla kupujących online.
  2. Transakcje w sklepie: Podobne informacje dla klientów robiących zakupy osobiście.

Użycie operatorów zbiorów

Aby uzyskać pełen obraz wszystkich klientów, firma najpierw użyje UNION, by połączyć oba zbiory danych w jedną tabelę, usuwając duplikaty. Daje to jednolity widok całej bazy klientów.

Następnie mogą użyć INTERSECT, aby zidentyfikować klientów, którzy kupowali zarówno online, jak i w sklepach. Ten segment jest szczególnie cenny, bo silnie angażuje się w markę w wielu kanałach.

Aby znaleźć możliwości promocji międzykanałowej, firma może użyć EXCEPT. Na przykład, SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions znajdzie klientów, którzy kupowali tylko online, ale nie w sklepach. Następnie można skierować do nich promocje zachęcające do odwiedzenia lokalizacji fizycznej.

Poza segmentacją

Mając te segmenty, firma może pójść dalej, doprecyzowując je o dodatkowe czynniki, jak demografia czy historia zakupów. Takie granularne zrozumienie klientów pozwala precyzyjniej dopasować kampanie marketingowe.

Operatory zbiorów vs. JOIN-y

Zarówno operatory zbiorów, jak i złączenia SQL (JOIN) łączą dane z wielu zapytań, ale działają inaczej. Kluczowe pytanie brzmi, czy chcesz łączyć wiersze, czy kolumny.

Feature Set Operators JOINs
Combines Rows (stacks queries vertically) Columns (widens rows horizontally)
Requires Same column count and compatible data types A shared key column between tables
Use when Merging similar datasets, finding overlaps or differences between result sets Enriching a row with related data from another table
Duplicate handling UNION removes duplicates; UNION ALL keeps them Depends on join type and the data
Types UNION, UNION ALL, INTERSECT, EXCEPT/MINUS INNER, LEFT, RIGHT, FULL OUTER, CROSS

Ograniczenia i uwagi dotyczące operatorów zbiorów

Korzystając z operatorów zbiorów w SQL, warto wziąć pod uwagę kilka ograniczeń i czynników wpływających na wydajność zapytań, dokładność wyników i ogólną użyteczność.

Zgodność typów danych i wartości NULL

Odpowiadające sobie kolumny w zbiorach wyników muszą mieć kompatybilne typy danych. Sprawdź zgodność typów danych w odpowiadających kolumnach przed połączeniem zapytań. Niezgodności typów powodują błędy, które łatwo przeoczyć.

Operatory zbiorów mogą traktować wartości NULL różnie w zależności od DBMS i konkretnego operatora. Aby uniknąć błędów, deweloperzy muszą rozumieć, jak traktowane są wartości NULL.

Wpływ na wydajność i duplikaty wierszy

Operacje na zbiorach mogą znacząco wpływać na wydajność, zwłaszcza przy dużych lub złożonych zbiorach danych. Na wydajność wpływają m.in. indeksowanie, optymalizacja zapytań i zasoby sprzętowe. Kluczowe są techniki optymalizacji i strojenia, by łagodzić wąskie gardła.

Domyślnie operatory zbiorów usuwają zduplikowane wiersze z wyniku. Jednak w niektórych przypadkach konieczne może być ich zachowanie. Ważne jest zrozumienie zachowania operatorów względem duplikatów i zastosowanie odpowiednich technik ich obsługi w razie potrzeby.

Sortowanie wyników i ograniczenia pamięci

Operatory zbiorów nie gwarantują kolejności wyników w końcowym wyjściu. Aby posortować połączony wynik, dodaj klauzulę ORDER BY na samym końcu całego zapytania, po ostatnim SELECT.

Operacje na zbiorach mogą zużywać sporo pamięci i zasobów, zwłaszcza przy dużych zbiorach danych. Należy uwzględnić ograniczenia pamięci i zasobów, aby uniknąć degradacji wydajności lub niestabilności systemu.

Złożoność, utrzymanie i zgodność między DBMS-ami

Złożone zapytania z wieloma operatorami zbiorów, podzapytaniami i złączeniami mogą być trudne do zrozumienia, utrzymania i debugowania. Aby poprawić czytelność i łatwość utrzymania, zapytania powinny być zwięzłe, dobrze udokumentowane i modułowe.

Operatory zbiorów mogą różnić się składnią i zachowaniem w różnych systemach zarządzania bazami danych (DBMS). Znajomość tych różnic jest kluczowa przy pisaniu zapytań SQL z myślą o kompatybilności międzyplatformowej.

Na zakończenie

Operatory zbiorów rozwiązują konkretny problem: łączenie lub porównywanie zbiorów wyników bez wcześniejszej wiedzy, które wiersze się pokrywają.

Obejmują UNION, INTERSECT i EXCEPT: trzy operatory do łączenia, porównywania i odejmowania zbiorów wyników.

Jeśli chcesz dowiedzieć się więcej, zobacz kurs Joining Data in SQL.

FAQ dotyczące operatorów SQL

Jaka jest różnica między UNION ALL a UNION?

UNION ALL uwzględnia wszystkie wiersze z obu zapytań, nawet jeśli są zduplikowane. UNION eliminuje duplikaty.

Czym UNION różni się od JOIN w SQL?

UNION łączy wyniki zapytań pionowo, doklejając wiersze jednego zapytania do drugiego. JOIN łączy tabele poziomo, dopasowując wiersze na podstawie powiązanej kolumny i tworząc szerszy wynik.

Czy są jakieś kwestie wydajności przy używaniu operacji na zbiorach?

Operacje na zbiorach mogą być kosztowne obliczeniowo, zwłaszcza przy dużych zbiorach danych. Ważne jest optymalizowanie poszczególnych zapytań i używanie indeksów tam, gdzie to możliwe, aby poprawić wydajność.

Jaka jest różnica między EXCEPT a NOT IN?

EXCEPT i NOT IN mogą dawać podobne wyniki, ale inaczej traktują wartości NULL. EXCEPT uznaje wartości NULL za równe przy porównywaniu wierszy, więc dwie wartości NULL w tej samej pozycji kolumny spowodują wykluczenie wiersza. NOT IN natomiast nie zwróci żadnych wierszy, jeśli podzapytanie zawiera jakiekolwiek wartości NULL, ponieważ porównania z NULL w SQL są nieokreślone. Przy dużych zbiorach danych EXCEPT może też być czytelniejszy niż skorelowane podzapytanie NOT IN.

Czy mogę używać ORDER BY z operatorami zbiorów?

Tak, ale tylko raz, na samym końcu całego zapytania. Nie możesz używać ORDER BY wewnątrz poszczególnych instrukcji SELECT w operacji na zbiorach. Aby posortować połączony wynik, dodaj pojedynczą klauzulę ORDER BY po ostatniej instrukcji SELECT.

Przykład:

SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;

Czy MySQL obsługuje INTERSECT i EXCEPT?

MySQL dodał obsługę INTERSECT i EXCEPT w wersji 8.0.31. Jeśli masz starszą wersję, musisz je emulować: użyj INNER JOIN lub podzapytania z IN, aby odtworzyć INTERSECT, oraz LEFT JOIN ... WHERE IS NULL lub podzapytania NOT IN, aby odtworzyć EXCEPT. Oracle używa MINUS zamiast EXCEPT.

Tematy

Dowiedz się więcej o SQL!

Track

Młodszy Inżynier Danych w SQL

30 godz.
Poznaj podstawy inżynierii danych: projektowanie baz danych i hurtownie danych, pracując z technologiami takimi jak PostgreSQL i Snowflake!
Zobacz szczegółyRight Arrow
Rozpocznij kurs
Zobacz więcejRight Arrow