Ställ in operationer (SQL)
Uppsättningsoperationer gör att resultaten från flera frågor kan kombineras till en enda resultatuppsättning . Setoperatorerna inkluderar UNION
, INTERSECT
och EXCEPT
.
UNION operatör
I SQL kombinerar UNION -
satsen resultaten av två SQL-frågor till en enda tabell med alla matchande rader . De två frågorna måste resultera i samma antal kolumner och kompatibla datatyper för att kunna förenas. Alla dubbletter tas bort automatiskt om inte UNION ALL
används.
UNION
kan vara användbart i datalagerapplikationer där tabeller inte är perfekt normaliserade . Ett enkelt exempel skulle vara en databas med tabeller sales2005
och sales2006
som har identiska strukturer men är separerade på grund av prestandaskäl. En UNION-
fråga kan kombinera resultat från båda tabellerna.
Observera att UNION ALL
inte garanterar ordningen på raderna. Rader från den andra operanden kan visas före, efter eller blandas med rader från den första operanden. I situationer där en specifik beställning önskas ORDER BY
användas.
Observera att UNION ALL
kan vara mycket snabbare än vanlig UNION
.
Exempel
Med tanke på dessa två tabeller:
person | belopp |
---|---|
Joe | 1000 |
Alex | 2000 |
Guppa | 5 000 |
person | belopp |
---|---|
Joe | 2000 |
Alex | 2000 |
Zach | 35 000 |
Utför detta uttalande:
VÄLJ * FRÅN försäljning2005 UNION VÄLJ * FRÅN försäljning 2006 ;
ger denna resultatuppsättning, även om ordningen på raderna kan variera eftersom ingen ORDER BY-
sats tillhandahölls:
person | belopp |
---|---|
Joe | 1000 |
Alex | 2000 |
Guppa | 5 000 |
Joe | 2000 |
Zach | 35 000 |
Observera att det finns två rader för Joe eftersom dessa rader är olika över sina kolumner. Det finns bara en rad för Alex eftersom dessa rader inte är distinkta för båda kolumnerna.
UNION ALL
ger olika resultat, eftersom det inte kommer att eliminera dubbletter. Utför detta uttalande:
VÄLJ * FRÅN försäljning 2005 UNION ALLA VÄLJ * FRÅN försäljning 2006 ;
skulle ge dessa resultat, återigen tillåta varians för avsaknaden av en ORDER BY
-sats:
person | belopp |
---|---|
Joe | 1000 |
Joe | 2000 |
Alex | 2000 |
Alex | 2000 |
Guppa | 5 000 |
Zach | 35 000 |
Diskussionen om fullständiga yttre sammanfogningar har också ett exempel som använder UNION
.
INTERSECT-operatör
SQL INTERSECT
-operatorn tar resultaten av två frågor och returnerar endast rader som visas i båda resultatuppsättningarna. I syfte att ta bort dubbletter skiljer INTERSECT- operatören inte på
NULL
. INTERSECT -
operatorn tar bort dubbletter av rader från den slutliga resultatuppsättningen. Operatören INTERSECT ALL
tar inte bort dubbletter av rader från den slutliga resultatuppsättningen, men om en rad visas X gånger i den första frågan och Y gånger i den andra kommer den att visas min ( X , Y ) { gånger i resultatuppsättningen.
Exempel
Följande exempel INTERSECT-
fråga returnerar alla rader från ordertabellen där Kvantitet är mellan 50 och 100.
VÄLJ * FRÅN Beställningar WHERE Kvantitet MELLAN 1 OCH 100 INTERSECT VÄLJ * FRÅN Beställningar WHERE Kvantitet MELLAN 50 OCH 200 ;
UTOM operatör
SQL EXCEPT-
operatorn tar de distinkta raderna i en fråga och returnerar de rader som inte visas i en andra resultatuppsättning. För radeliminering och dubblettborttagning skiljer inte operatorn EXCEPT mellan
NULLs
. Operatören EXCEPT ALL
tar inte bort dubbletter, men om en rad visas X gånger i den första frågan och Y gånger i den andra kommer den att visas gånger i resultatuppsättningen.
Oracle-plattformen tillhandahåller en MINUS-
operator som är funktionellt likvärdig med SQL-standarden EXCEPT DISTINCT-
operatorn.
Exempel
Följande exempel EXCEPT-
frågan returnerar alla rader från ordertabellen där Kvantitet är mellan 1 och 49, och de med en Kvantitet mellan 76 och 100.
Uttryckt på ett annat sätt; frågan returnerar alla rader där kvantiteten är mellan 1 och 100, förutom rader där kvantiteten är mellan 50 och 75.
VÄLJ * FRÅN Beställningar VAR Kvantitet MELLAN 1 OCH 100 FÖRUTOM VÄLJ * FRÅN Beställningar VAR Kvantitet MELLAN 50 OCH 75 ;
Exempel
Följande exempel motsvarar exemplet ovan men utan att använda operatorn EXCEPT .
VÄLJ o1 . * FRÅN ( VÄLJ * FRÅN Beställningar VAR Kvantitet MELLAN 1 OCH 100 ) o1 VÄNSTER JOIN ( VÄLJ * FRÅN Beställningar DÄR Kvantitet MELLAN 50 OCH 75 ) o2 PÅ o1 . id = o2 . id VAR o2 . ID ÄR NULL
Se även
externa länkar
- MSDN-dokumentation om UNION i Transact-SQL för SQL Server
- Namngivning av valda listobjekt i uppsättningsoperationer
- UNION i MySQL med exempel
- UNION i MySQL
- UNION-klausul i PostgreSQL
- SQL UNION och UNION ALL
- Sorteringsordning inom UNION-satsen
- Designa ett dataflöde som laddar en lagertabell
- Oracle 11g-dokumentation för UNION (ALL), INTERSECT och MINUS
- SQL Set-operatörer