Indstil operationer (SQL) - Set operations (SQL)
Sætoperationer gør det muligt at kombinere resultaterne af flere forespørgsler til et enkelt resultatsæt . Set operatører inkluderer UNION, INTERSECTog EXCEPT.
UNION-operatør
I SQL den UNIONklausul kombinerer resultaterne af to SQL-forespørgsler i en enkelt tabel over alle matchende rækker . De to forespørgsler skal resultere i det samme antal kolonner og kompatible datatyper for at blive samlet. Eventuelle duplikater fjernes automatisk, medmindre de UNION ALLbruges.
UNIONkan være nyttigt i datalagerapplikationer , hvor tabeller ikke er perfekt normaliserede . Et simpelt eksempel ville være en database, der har tabeller, sales2005og sales2006som har identiske strukturer, men som er adskilt på grund af præstationsovervejelser. En UNIONforespørgsel kunne kombinere resultater fra begge tabeller.
Bemærk, at UNION ALLdet ikke garanterer rækkefølgen af rækker. Rækker fra den anden operand kan vises før, efter eller blandet med rækker fra den første operand. I situationer, hvor en bestemt ordre ønskes, ORDER BYskal der bruges.
Bemærk, at det UNION ALLkan være meget hurtigere end almindeligt UNION.
Eksempler
Givet disse to tabeller:
| person | beløb |
|---|---|
| Joe | 1000 |
| Alex | 2000 |
| Bob | 5000 |
| person | beløb |
|---|---|
| Joe | 2000 |
| Alex | 2000 |
| Zach | 35000 |
Udførelse af denne erklæring:
SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;
giver dette resultatsæt, selvom rækkefølgen på rækken kan variere, fordi der ikke ORDER BYblev leveret en klausul:
| person | beløb |
|---|---|
| Joe | 1000 |
| Alex | 2000 |
| Bob | 5000 |
| Joe | 2000 |
| Zach | 35000 |
Bemærk, at der er to rækker til Joe, fordi disse rækker er forskellige på tværs af deres kolonner. Der er kun en række for Alex, fordi disse rækker ikke er forskellige for begge kolonner.
UNION ALLgiver forskellige resultater, fordi det ikke fjerner duplikater. Udførelse af denne erklæring:
SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;
ville give disse resultater og igen tillade varians for manglen på en ORDER BYerklæring:
| person | beløb |
|---|---|
| Joe | 1000 |
| Joe | 2000 |
| Alex | 2000 |
| Alex | 2000 |
| Bob | 5000 |
| Zach | 35000 |
Diskussionen af fulde ydre sammenføjninger har også et eksempel, der bruger UNION.
INTERSECT-operatør
SQL- INTERSECToperatøren tager resultaterne af to forespørgsler og returnerer kun rækker, der vises i begge resultatsæt. Med henblik på dobbelt fjernelse INTERSECTskelner operatøren ikke mellem NULLs. Den INTERSECTfjerner operatøren gentagne rækker fra det endelige resultat sæt. Den INTERSECT ALLoperatør fjerner ikke dublerede rækker fra det endelige resultat sæt, men hvis en række vises X gange i første forespørgsel og Y gange i den anden, vises det min (X, Y) gange i resultatsættet.
Eksempel
Følgende eksempler på INTERSECTforespørgsel returnerer alle rækker fra ordretabellen, hvor mængden er mellem 50 og 100.
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100
INTERSECT
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 200;
Bortset fra operatør
SQL- EXCEPToperatøren tager de forskellige rækker i en forespørgsel og returnerer de rækker, der ikke vises i et andet resultatsæt. Med henblik på eliminering af række og fjernelse af duplikat EXCEPTskelner operatøren ikke mellem NULLs. Den EXCEPT ALLoperatør fjerner ikke dubletter, men hvis en række vises X gange i den første forespørgsel og Y gange i den anden, vises den max (X - Y, 0) gange i resultatsættet.
Især Oracle platformen er en MINUSoperatør, som er funktionelt ækvivalent med den SQL standard EXCEPT DISTINCT operatør [1] .
Eksempel
Følgende eksempelforespørgsel EXCEPTreturnerer alle rækker fra ordretabellen, hvor mængden er mellem 1 og 49, og dem med en mængde mellem 76 og 100.
Formuleret på en anden måde; forespørgslen returnerer alle rækker, hvor mængden er mellem 1 og 100, bortset fra rækker, hvor mængden er mellem 50 og 75.
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100
EXCEPT
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 75;
Eksempel
Følgende eksempel svarer til ovenstående eksempel, men uden brug af EXCEPToperatøren.
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
Se også
Referencer
eksterne links
- MSDN-dokumentation om UNION i Transact-SQL til SQL Server
- Navngivning af udvalgte listeelementer i sætoperationer
- UNION i MySQL med eksempler
- UNION i MySQL
- UNION-klausul i PostgreSQL
- SQL UNION og UNION ALL
- Sorter rækkefølge inden for UNION-erklæringen
- Design af et dataforløb, der indlæser en lagertabel
- Oracle 11g-dokumentation til UNION (ALL), INTERSECT og MINUS
- SQL-sætoperatører