Operacje na zestawach (SQL) - Set operations (SQL)
Operacje na zestawach umożliwiają łączenie wyników wielu zapytań w jeden zestaw wyników . Set operatorzy należą UNION
, INTERSECT
i EXCEPT
.
Operator UNII
W SQLUNION
klauzula łączy wyniki dwóch zapytań SQL w jednej tabeli wszystkich pasujących wierszy . Dwa zapytania muszą dawać taką samą liczbę kolumn i zgodne typy danych, aby można było je połączyć. Wszelkie zduplikowane rekordy są automatycznie usuwane, chyba że UNION ALL
są używane.
UNION
może być przydatny w aplikacjach hurtowni danych, w których tabele nie są idealnie znormalizowane . A Przykład prosty byłby bazie posiadające tabele sales2005
i sales2006
że mają identyczne struktury, ale są rozdzielone ze względów wydajności. UNION
Zapytanie może połączyć wyniki z obu tabel.
Pamiętaj, że UNION ALL
nie gwarantuje to kolejności wierszy. Wiersze z drugiego operandu mogą pojawić się przed, po lub zmieszane z wierszami z pierwszego operandu. W sytuacjach, w których pożądana jest konkretna kolejność, ORDER BY
należy użyć.
Pamiętaj, że UNION ALL
może być znacznie szybszy niż zwykły UNION
.
Przykłady
Biorąc pod uwagę te dwie tabele:
osoba | ilość |
---|---|
Joe | 1000 |
Alex | 2000 |
Pion | 5000 |
osoba | ilość |
---|---|
Joe | 2000 |
Alex | 2000 |
Zach | 35000 |
Wykonując to oświadczenie:
SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;
zwraca ten zestaw wyników, chociaż kolejność wierszy może się różnić, ponieważ nie ORDER BY
podano klauzuli:
osoba | ilość |
---|---|
Joe | 1000 |
Alex | 2000 |
Pion | 5000 |
Joe | 2000 |
Zach | 35000 |
Zauważ, że są dwa wiersze dla Joe, ponieważ te wiersze są różne w swoich kolumnach. Jest tylko jeden wiersz dla Alexa, ponieważ te wiersze nie są różne dla obu kolumn.
UNION ALL
daje różne wyniki, ponieważ nie wyeliminuje duplikatów. Wykonując to oświadczenie:
SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;
dałoby te wyniki, ponownie dopuszczając wariancję w przypadku braku ORDER BY
stwierdzenia:
osoba | ilość |
---|---|
Joe | 1000 |
Joe | 2000 |
Alex | 2000 |
Alex | 2000 |
Pion | 5000 |
Zach | 35000 |
Omówienie pełnych sprzężeń zewnętrznych ma również przykład, który używa UNION
.
Operator INTERSECT
INTERSECT
Operator SQL pobiera wyniki dwóch zapytań i zwraca tylko wiersze, które pojawiają się w obu zestawach wyników. Do celów usuwania duplikatów INTERSECT
operator nie rozróżnia NULLs
. INTERSECT
Operator usuwa zduplikowane wiersze z końcowego wyniku. INTERSECT ALL
Operator nie usunąć zduplikowane wiersze od ostatecznego wyniku, ale jeżeli rząd wydaje X razy w pierwszym zapytania i Y razy na sekundę, to pojawiają min (x, y) razy w zbiorze wyników.
Przykład
Poniższa przykładowa INTERSECT
kwerenda zwraca wszystkie wiersze z tabeli Orders, w której Quantity wynosi od 50 do 100.
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100
INTERSECT
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 200;
Z WYJĄTKIEM operatora
EXCEPT
Operator SQL pobiera różne wiersze jednego zapytania i zwraca wiersze, które nie pojawiają się w drugim zestawie wyników. Do celów usuwania wierszy i usuwania duplikatów EXCEPT
operator nie rozróżnia NULLs
. EXCEPT ALL
Operator nie usuwa duplikatów, ale jeżeli rząd wydaje X razy w pierwszym zapytania i Y razy na sekundę, będzie się wydawać, max (x - r, 0) razy w zbiorze wyników.
Warto zauważyć, że platforma Oracle udostępnia MINUS
operator, który jest funkcjonalnie równoważny ze standardowym EXCEPT DISTINCT
operatorem SQL [1] .
Przykład
Poniższa przykładowa EXCEPT
kwerenda zwraca wszystkie wiersze z tabeli Orders, w których Quantity wynosi od 1 do 49, a te z Quantity od 76 do 100.
Sformułowane w inny sposób; zapytanie zwraca wszystkie wiersze, w których ilość mieści się w przedziale od 1 do 100, z wyjątkiem wierszy, w których ilość mieści się w przedziale od 50 do 75.
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100
EXCEPT
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 75;
Przykład
Poniższy przykład jest odpowiednikiem powyższego przykładu, ale bez użycia EXCEPT
operatora.
SELECT o1.*
FROM (
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100) o1
LEFT JOIN (
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 75) o2
ON o1.id = o2.id
WHERE o2.id IS NULL
Zobacz też
Bibliografia
Linki zewnętrzne
- Dokumentacja MSDN na temat UNION w Transact-SQL dla SQL Server
- Nazywanie pozycji listy wyboru w operacjach zestawu set
- UNION w MySQL z przykładami
- UNION w MySQL
- Klauzula UNION w PostgreSQL
- SQL UNION i UNION ALL
- Porządek sortowania w oświadczeniu UNION
- Projektowanie przepływu danych, który ładuje tabelę hurtowni
- Dokumentacja Oracle 11g dla UNION (ALL), INTERSECT i MINUS
- Operatory zbiorów SQL