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, INTERSECTi 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 ALLsą używane.

UNIONmoż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 sales2005i sales2006że mają identyczne struktury, ale są rozdzielone ze względów wydajności. UNIONZapytanie może połączyć wyniki z obu tabel.

Pamiętaj, że UNION ALLnie 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 BYnależy użyć.

Pamiętaj, że UNION ALLmoże być znacznie szybszy niż zwykły UNION.

Przykłady

Biorąc pod uwagę te dwie tabele:

sprzedaż2005
osoba ilość
Joe 1000
Alex 2000
Pion 5000
sprzedaż2006
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 BYpodano 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 ALLdaje 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 BYstwierdzenia:

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

INTERSECTOperator 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 INTERSECToperator nie rozróżnia NULLs. INTERSECTOperator usuwa zduplikowane wiersze z końcowego wyniku. INTERSECT ALLOperator 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 INTERSECTkwerenda 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

EXCEPTOperator 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 EXCEPToperator nie rozróżnia NULLs. EXCEPT ALLOperator 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 MINUSoperator, który jest funkcjonalnie równoważny ze standardowym EXCEPT DISTINCT operatorem SQL [1] .

Przykład

Poniższa przykładowa EXCEPTkwerenda 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 EXCEPToperatora.

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