Operacje na zestawach (SQL)

Operacje na zestawach umożliwiają łączenie wyników wielu zapytań w jeden zestaw wyników . Do operatorów zbiorów należą UNION , INTERSECT i EXCEPT .

Operator UNII

W języku SQL klauzula UNION łączy wyniki dwóch zapytań SQL w jedną tabelę zawierającą wszystkie pasujące wiersze . Dwa zapytania muszą skutkować taką samą liczbą kolumn i zgodnymi typami danych, aby można je było połączyć. Wszelkie zduplikowane rekordy są automatycznie usuwane, chyba że użyto UNION ALL .

UNION może być przydatny w aplikacjach hurtowni danych , w których tabele nie są idealnie znormalizowane . Prostym przykładem może być baza danych zawierająca tabele sales2005 i sales2006 , które mają identyczną strukturę, ale są rozdzielone ze względu na wydajność. Zapytanie UNION może łączyć wyniki z obu tabel.

Należy pamiętać, że UNION ALL nie gwarantuje kolejności wierszy. Wiersze z drugiego operandu mogą pojawiać się przed, po lub mieszać z wierszami z pierwszego operandu. W sytuacjach, gdy wymagana jest konkretna kolejność, należy użyć ORDER BY .

Zauważ, że UNION ALL może być znacznie szybszy niż zwykły UNION .

Przykłady

Biorąc pod uwagę te dwie tabele:

sprzedaż2005
osoba kwota
Joe 1000
Alex 2000
Pion 5000
sprzedaż2006
osoba kwota
Joe 2000
Alex 2000
Zach 35000

Wykonanie tej instrukcji:

   

    WYBIERZ  *  ZE  sprzedaży 2005  WYBIERZ  UNII  *  ZE  sprzedaży 2006  ; 

daje ten zestaw wyników, chociaż kolejność wierszy może się różnić, ponieważ nie podano klauzuli ORDER BY :

osoba kwota
Joe 1000
Alex 2000
Pion 5000
Joe 2000
Zach 35000

Zauważ, że Joe ma dwa wiersze, 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 eliminuje duplikatów. Wykonanie tej instrukcji:

   
 
    SELECT  *  FROM  sales2005  UNION  ALL  SELECT  *  FROM  sales2006  ; 

dałoby te wyniki, ponownie dopuszczając wariancję dla braku instrukcji ORDER BY :

osoba kwota
Joe 1000
Joe 2000
Alex 2000
Alex 2000
Pion 5000
Zach 35000

Omówienie pełnych sprzężeń zewnętrznych zawiera również przykład wykorzystujący UNION .

operatora INTERSECT

SQL INTERSECT pobiera wyniki dwóch zapytań i zwraca tylko te wiersze, które pojawiają się w obu zestawach wyników. W celu usunięcia duplikatów INTERSECT nie rozróżnia wartości NULL . Operator INTERSECT usuwa zduplikowane wiersze z końcowego zestawu wyników. Operator INTERSECT ALL nie usuwa zduplikowanych wierszy z ostatecznego zestawu wyników, ale jeśli wiersz pojawi się X razy w pierwszym zapytaniu i Y razy w drugim, pojawi się razy w zestawie wyników.

Przykład

Poniższe przykładowe zapytanie INTERSECT zwraca wszystkie wiersze z tabeli Zamówienia, w których Ilość wynosi od 50 do 100.

 
   
      



 
   
       WYBIERZ  *  Z  Zamówienia  GDZIE  Ilość  MIĘDZY  1  A  100  PRZECIĘCIE  WYBIERZ  *  Z  Zamówienia  GDZIE  Ilość  MIĘDZY  50  A  200  ; 

Z WYJĄTKIEM operatora

SQL EXCEPT bierze odrębne wiersze jednego zapytania i zwraca wiersze, które nie pojawiają się w drugim zestawie wyników. Do celów eliminacji wierszy i usuwania duplikatów EXCEPT nie rozróżnia wartości NULL . Operator EXCEPT ALL nie usuwa duplikatów, ale jeśli wiersz pojawi się X razy w pierwszym zapytaniu i Y razy w drugim, pojawi się razy w zestaw wyników.

Warto zauważyć, że platforma Oracle zapewnia operator MINUS , który jest funkcjonalnie równoważny standardowemu operatorowi SQL EXCEPT DISTINCT .

Przykład

Poniższe przykładowe zapytanie EXCEPT zwraca wszystkie wiersze z tabeli Zamówienia, w których Ilość zawiera się w przedziale od 1 do 49, oraz te, w których Ilość zawiera się w przedziale od 76 do 100.

Sformułowane w inny sposób; zapytanie zwróci wszystkie wiersze, w których Ilość zawiera się w przedziale od 1 do 100, z wyjątkiem wierszy, w których Ilość mieści się w przedziale od 50 do 75.

 
   
      



 
   
       WYBIERZ  *  Z  Zamówienia  GDZIE  Ilość  MIĘDZY  1  A  100  Z WYJĄTKIEM  WYBIERZ  *  Z  Zamówienia  GDZIE  Ilość  MIĘDZY  50  A  75  ; 

Przykład

Poniższy przykład jest odpowiednikiem powyższego przykładu, ale bez użycia operatora EXCEPT .

 
 
     
     
          
  
     
     
          
   
   WYBIERZ  o1  .  *  FROM  (  WYBIERZ  *  Z  Zamówienia  GDZIE  Ilość  MIĘDZY  1  A  100  )  o1  LEWA  DOŁĄCZ  (  WYBIERZ  *  FROM  Zamówienia  GDZIE  Ilość  MIĘDZY  50  A  75  )  o2  ON  o1  .  identyfikator  =  o2  .  id  GDZIE  o2  .  identyfikator  IS   ZERO 

Zobacz też

Linki zewnętrzne