Łączenie wyników zapytań SQL Server
Bazy danych

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;

MS SQL Server przykład złączenia tabel

Łą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;

MS SQL Server łączenie wyników zapytań przykład

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

MS SQL Server łączenie wyników zapytań dane wejściowe

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

MS SQL łączenie wyników zapytań operator UNION ALL

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.

MS SQL Server łączenie wyników zapytań dane wejściowe

Łą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

MS SQL łączenie wyników zapytań operator UNION

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

SQL Server łączenie wyników zapytań operator EXCEPT dane wejściowe

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;

SQL Server łączenie wyników zapytań operator EXCEPT wynik działania

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;

SQL Server łączenie wyników zapytań operator INTERSECT dane wejściowe

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;

SQL Server łączenie wyników zapytań operator INTERSECT wynik działania

Operatory zbiorowe (ang. set operators) UNION, EXCEPT i INTERSECT pozwalają na usunięcie powtórzeń. Operator UNION ALL nie usuwa duplikatów.

Jarek Olechno

Programista SQL, Cloud Developer
Udostępnij wpis: udostępnij Facebook udostępnij Linkedin udostępnij e-mail

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

    Podobne artykuły z kategorii: Bazy danych

    Może Cię zainteresować