
SQL Server operacje na zbiorach
W artykule przedstawiam operatory UNION, UNION ALL, EXCEPT i INTERSECT, które używane są w bazach danych MS SQL Server do łączenia wyników zapytań.
Relacyjne bazy danych umożliwiają łączenie tabel oraz łączenie wyników zapytań.
Złączenia tabel a operacje na zbiorach
Łączenie tabel
Za pomocą złączeń tabel łączymy rekordy w poziomie w bazie danych. Każda dołączana tabela zwiększa ilość wyświetlanych kolumn. Więcej informacji na temat złączeń tabel znajdziesz w artykule MS SQL złączenia tabel
W przykładzie poniżej łączymy dwie tabele – tabelę Customers z tabelą Orders z bazy danych Northwind. W tabeli wynikowej otrzymujemy wszystkie kolumny z obydwu złączonych tabel.
SELECT * FROM Customers a JOIN Orders b ON a.CustomerID = b.CustomerID;
Łączenie wyników zapytań
Za pomocą operacji na zbiorach łączymy wiersze w pionie. Zachowujemy liczbę kolumn i zwiększamy liczbę wierszy.
Przykład złączenia dwóch wyników zapytań za pomocą operatora UNION ALL.
W pierwszym zapytaniu z tabeli Customers w bazie Northwind wybieramy:
- dwa rekordy
- trzy kolumny – CustomerID, City, Country
W drugim zapytaniu z tabeli Orders w bazie Northwind wybieramy:
- dwa rekordy
- trzy kolumny – CustomerID, ShipCity, ShipCountry
Wyniki obydwu zapytań łączymy za pomocą operatora UNION ALL. W rezultacie otrzymamy wszystkie rekordy z pierwszego zapytania oraz wszystkie rekordy z drugiego zapytania.
SELECT TOP 2 CustomerID, City, Country FROM Customers UNION ALL SELECT TOP 2 CustomerID, ShipCity, ShipCountry FROM Orders;
Zasady łączenia wyników zapytań
Jeśli chcemy połączyć wyniki zapytań, we wszystkich łączonych zapytaniach SQL:
- ilość kolumn musi być taka sama
- typy danych w kolumnach muszą być zgodne
W wyniku złączenia wyświetlą się nazwy kolumn z pierwszego zapytania.
Operator UNION ALL
W poniższych przykładach używam tabel Customers i Employees, które możesz utworzyć i wypełnić danymi za pomocą poniższych zapytań.
Tworzenie tabeli Customers:
CREATE TABLE Customers (FirstName NVARCHAR(50), LastName NVARCHAR(50), City NVARCHAR(50)) GO INSERT INTO Customers VALUES ('Tomasz','Ząbek','Kraków'), ('Piotr','Wiosna','Lublin'), ('Anna','Wspaniała','Bydgoszcz'), ('Tomasz','Borek','Warszawa')
Tworzenie tabeli Employees:
CREATE TABLE Employees (FirstName NVARCHAR(50), LastName NVARCHAR(50), City NVARCHAR(50)) GO INSERT INTO Employees VALUES ('Izabela','Mąka','Kraków'), ('Tomasz','Borek','Warszawa'), ('Irena','Wielka','Lublin')
Za pomocą operatora UNION ALL otrzymamy wszystkie rekordy występujące w obydwu łączonych wynikach zapytania.
Operator ten nie powoduje usunięcia duplikatów.
W przykładzie poniżej:
- pierwsze zapytanie zwraca wszystkie rekordy z tabeli Customers
- drugie zapytanie zwraca wszystkie rekordy z tabeli Employees
SELECT * FROM Customers SELECT * FROM Employees
Za pomocą operatora UNION ALL łączymy obydwa zapytania. W wyniku otrzymujemy wszystkie rekordy, które były w jednym i w drugim zapytaniu.
SELECT * FROM Customers UNION ALL SELECT * FROM Employees
Operator UNION
Zapytania z poniższego przykładu wyświetlają wszystkie rekordy z tabeli Customers oraz z tabeli Employees. Jeden rekord zawiera takie same dane w obydwu tabelach.
Łączymy wyniki zapytań za pomocą operatora UNION.
Operator UNION usuwa duplikaty. W związku z tym rekord, który powtarzał się w obydwu wynikach zapytań, po ich złączeniu zobaczymy tylko raz.
SELECT * FROM Customers UNION SELECT * FROM Employees
Operator EXCEPT
Operator EXCEPT zwraca te rekordy, które są w wyniku pierwszego zapytania, a nie ma ich w wyniku drugiego zapytania.
W przykładzie, w klauzuli SELECT wybieramy tylko kolumnę City.
SELECT City FROM Customers SELECT City FROM Employees
W pierwszym wyniku zapytania jest Bydgoszcz, a w drugim jej nie ma. Po złączeniu wyników za pomocą operatora EXCEPT otrzymamy następujący rezultat:
SELECT City FROM Customers EXCEPT SELECT City FROM Employees;
Operator INTERSECT
Operator INTERSECT zwraca część wspólną wyników zapytań. Za jego pomocą wyświetlimy te rekordy, które były zarówno w pierwszym jak i w drugim wyniku zapytania. Wyświetlana jest tylko część wspólna z obydwu wyników.
W dwóch zapytaniach wybieramy miasto z tabel Customers oraz Employees.
SELECT City FROM Customers SELECT City FROM Employees;
Po złączeniu wyników za pomocą operatora INTERSECT zobaczymy tylko te miasta, które były w obydwu zapytaniach tj. Kraków, Lublin i Warszawę.
SELECT City FROM Customers INTERSECT SELECT City FROM Employees;
Operatory zbiorowe (ang. set operators) UNION, EXCEPT i INTERSECT pozwalają na usunięcie powtórzeń. Operator UNION ALL nie usuwa duplikatów.
