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:
osoba | kwota |
---|---|
Joe | 1000 |
Alex | 2000 |
Pion | 5000 |
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
- Dokumentacja MSDN dotycząca UNION w Transact-SQL dla SQL Server
- Nazywanie elementów listy wyboru w operacjach na zbiorach
- UNION w MySQL z przykładami
- UNIA w MySQL
- Klauzula UNION w PostgreSQL
- SQL UNION i UNION ALL
- Kolejność sortowania w ramach instrukcji UNION
- Projektowanie przepływu danych ładującego tabelę hurtowni
- Dokumentacja Oracle 11g dla UNION (ALL), INTERSECT i MINUS
- Operatory zestawów SQL