track
Mängdoperationer utgör grunden i SQL och gör att vi kan kombinera, jämföra och filtrera data från flera källor. Dessa operationer är oumbärliga för allt från dataintegration och datarensning till avancerad analys och rapportering.
I den här handledningen går vi igenom vad mängdoperatorer är, hur de används i SQL, deras praktiska tillämpningar och mer! Om du letar efter en komplett SQL-resurs, kolla in den här sjudelade SQL Fundamentals-färdighetsvägen.
För dig som har bråttom börjar vi med ett mycket kort svar på vad mängdoperationer i SQL är.
Vad är mängdoperationer i SQL?
Mängdoperationer i SQL är tekniker för att kombinera eller jämföra resultaten från två eller flera SELECT-satser. De fungerar som matematiska mängdoperationer och låter oss hitta unionen, snittet eller differensen mellan raderna som returneras av våra frågor. Det gör dem oumbärliga när man analyserar data från flera källor eller perspektiv.
Här är en snabb översikt över de centrala mängdoperationerna:
-
UNION: Slår ihop alla unika rader från två eller flerSELECT-satser och tar bort dubbletter. -
UNION ALL: Slår ihop alla rader från två eller flerSELECT-satser och behåller dubbletter. -
INTERSECT: Returnerar endast de rader som förekommer i bådaSELECT-satserna. -
EXCEPT: Returnerar rader från den förstaSELECT-satsen som inte finns i den andra.
Jämförelse med relationell algebra
Relationell algebra är ett teoretiskt ramverk som ligger till grund för hur databasfrågor fungerar. Det erbjuder abstrakta operationer som projektion, selektion och join, förankrade i matematiska principer och oberoende av specifika databassystem. Tänk på det som den logik bakom kulisserna som driver våra databasinteraktioner.
Mängdoperatorer i SQL är en praktisk implementation av dessa koncept i en databasmiljö. De gör att vi kan utföra mängdoperationer som union, snitt och differens direkt på resultatmängderna från SQL-frågor.
Medan relationell algebra ger en formell grund för databasoperationer, erbjuder mängdoperatorer i SQL ett standardiserat och användarvänligt gränssnitt för uppgifter inom datamanipulering.
Att förstå sambandet mellan mängdoperatorer och operationer i relationell algebra ger insikter i de teoretiska grunderna för SQL. Denna koppling hjälper dig att skriva frågor med en tydligare mental modell av vad som händer under huven.
Typer av mängdoperatorer i SQL
Det finns tre primära mängdoperatorer i SQL:
-
UNION -
INTERSECT -
EXCEPT(ellerMINUSi vissa dialekter)
Dessa operatorer motsvarar matematiskt begreppen union, snitt och mängddifferens.
Regler för att använda mängdoperatorer
Innan du kombinerar frågor med mängdoperatorer måste fyra krav vara uppfyllda. Missar du något av dem kommer din fråga att ge fel.
-
Samma antal kolumner: Varje
SELECTmåste returnera samma antal kolumner. Om en fråga returnerar tre och en annan två kastar databasen ett fel. -
Kompatibla datatyper: Motsvarande kolumner måste ha matchande typer. Du kan inte kombinera en
VARCHAR-namnkolumn med ettINTEGER-ID på samma position. -
Samma kolumnordning: SQL mappar kolumner efter position, inte efter namn. Den första kolumnen i fråga ett mappar till den första kolumnen i fråga två, oavsett vad kolumnerna heter.
-
ORDER BYendast sist:ORDER BYfår bara förekomma en gång, allra sist i den kombinerade frågan. Du kan inte använda det inne i enskildaSELECT-satser.
En detalj till: kolumnnamnen i utdata kommer från den första SELECT-satsen. Alias i efterföljande frågor ignoreras, så lägg bara till alias i den första frågan om du behöver anpassade namn i resultatet.
Så använder du operatorn UNION i SQL
Operatorn UNION kombinerar resultaten från två eller fler SELECT-frågor till en enda resultatmängd och tar bort dubblettrader som standard.
Anta till exempel att vi har två tabeller, employees och contractors, var och en med liknande kolumner såsom contractors, department och salary. För lärandets skull tittar vi på dessa två exempeltabeller:
employees:
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
Carol |
Engineering |
80000 |
|
John |
HR |
55000 |
contractors:
|
name |
department |
salary |
|
David |
Marketing |
60000 |
|
Eva |
Sales |
68000 |
|
Carol |
Engineering |
75000 |
Vi kan kombinera resultaten från båda tabellerna med följande kommando:
-- Using UNION to combine all employees and contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;
Den här frågan väljer kolumnerna name, department och salary från både tabellen employees och contractors och kombinerar dem till en enda resultatmängd. Operatorn UNION tar automatiskt bort dubblettrader från den slutliga resultatmängden.
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
Carol |
Engineering |
80000 |
|
John |
HR |
55000 |
|
David |
Marketing |
60000 |
|
Eva |
Sales |
68000 |
Observera att Carol, som förekommer i båda tabellerna, bara listas en gång i resultatet. Om vi ville behålla båda förekomsterna av Carol (med hennes olika löner) skulle vi använda UNION ALL.
UNION vs UNION ALL
Operatorn UNION tar inte bort NULL-värden. Om en kolumn innehåller NULL-värden i en resultatmängd och icke-NULL-värden i den motsvarande kolumnen i en annan resultatmängd kommer NULL-värdena att finnas kvar i den slutliga resultatmängden som produceras av operatorn UNION.
Om vi vill inkludera NULL-värden i resultatmängden och förhindra att de tas bort av operatorn UNION kan vi i stället använda UNION ALL. Denna operator kombinerar resultaten av flera SELECT-frågor och inkluderar alla rader från varje resultatmängd, oavsett om de är dubbletter eller innehåller NULL-värden.
Så använder du operatorn INTERSECT i SQL
Operatorn INTERSECT returnerar endast de rader som förekommer i båda resultatmängderna. Tänk på det som att hitta personerna som tillhör båda grupperna.
Låt oss använda INTERSECT för att fråga våra tabeller ovan. För enkelhetens skull frågar vi bara efter kolumnerna name och department:
-- Using INTERSECT to find common employees
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;
Den här frågan väljer kolumnerna name och department från både employees- och contractors-tabellerna och returnerar endast de rader som finns i båda tabellerna baserat på alla valda kolumner.
|
name |
department |
|
Carol |
Engineering |
Operatorn INTERSECT hanterar NULL-värden enligt standardregler för jämförelser och betraktar NULL-värden som lika vid jämförelse av motsvarande kolumner. Den ger också en tom mängd när den hanterar tomma resultatmängder.
Med andra ord, om ett NULL-värde finns i en resultatmängd och den motsvarande kolumnen i den andra resultatmängden innehåller ett icke-NULL-värde anses raderna inte vara lika – de tas inte med i snittresultatet.
Dessutom, om en av resultatmängderna som ges till operatorn INTERSECT är tom, blir det övergripande resultatet också tomt. Det finns inga gemensamma rader mellan en tom mängd och något annat.
Så använder du operatorn EXCEPT i SQL
Operatorn EXCEPT returnerar rader från den första resultatmängden som inte finns i den andra.
I Oracle Database skrivs EXCEPT som MINUS; alla andra stora dialekter (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) använder EXCEPT.
Anta till exempel att vi kör följande fråga:
-- Using EXCEPT to find employees who are not contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;
Kolumnerna name, department och salary väljs från tabellen employees och returnerar endast de rader som inte finns i tabellen contractors.
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
John |
HR |
55000 |
Operatorn EXCEPT följer också standardregler för hantering av NULL-värden. Dess beteende med tomma resultatmängder resulterar i en tom mängd om den första resultatmängden är tom, eller inkluderar alla rader från den första resultatmängden om den andra resultatmängden är tom.
SQL:s mängdoperatorer: prestanda och optimering
Effekten av mängdoperatorer på frågeprestanda i SQL kan variera beroende på faktorer som storleken på de involverade datamängderna, komplexiteten i frågorna och vilken databashanterare (DBMS) som används.
Låt oss bryta ned de viktigaste faktorerna och strategierna för optimering.
Datavolym och frågekomplexitet
När du arbetar med stora datamängder kan mängdoperatorer ha en betydande inverkan på frågeprestandan eftersom storleken på de resultatmängder som måste kombineras, snittas eller jämföras ökar den bearbetningstid som krävs för att utföra operationen.
Komplexa frågor som innehåller flera underfrågor, joins eller mängdoperatorer kan leda till ytterligare bearbetningsöverhead och påverka frågeprestandan. Kedjade operationer eller nästlade mängdoperationer kan ytterligare förvärra prestandakonsekvenserna.
Indexering och optimeringstekniker
Korrekt indexering av de kolumner som ingår i mängdoperationer kan avsevärt förbättra frågeprestandan. Index hjälper databasmotorn att snabbt hitta och hämta relevanta rader, vilket minskar behovet av fullständiga tabellgenomsökningar och förbättrar exekveringstiden.
För att förbättra prestandan för frågor som involverar mängdoperatorer kan databashanterare och utvecklare tillämpa tekniker som omskrivning av frågor, analys av exekveringsplaner och schemaoptimering. Tekniker som frågecache och materialiserade vyer kan också användas för att förberäkna och lagra resultaten av komplexa frågor, vilket minskar den beräkningsmässiga overheaden för mängdoperationer.
Databasmotor och hårdvaruresurser
Prestandan för mängdoperationer kan variera beroende på underliggande databasmotor och dess optimeringsmöjligheter. Olika DBMS:er kan använda olika optimeringsstrategier och algoritmer för att bearbeta mängdoperationer, vilket leder till variationer i prestanda.
Tillgången på hårdvaruresurser som CPU, minne och disk-I/O påverkar också prestandan för frågor som involverar mängdoperatorer. Tillräckliga hårdvaruresurser kan hjälpa till att mildra flaskhalsar och säkerställa effektiv exekvering av frågor.
SQL:s mängdoperatorer i praktiken
Mängdoperatorer är inte bara teoretiska verktyg; de har verkliga användningsområden som kan påverka affärsbeslut påtagligt. Låt oss gå igenom ett förenklat exempel på hur ett företag kan använda mängdoperatorer för att segmentera sin kundbas för riktade marknadsföringskampanjer.
Scenariot
Föreställ dig ett företag som säljer både online och i fysiska butiker. De har två separata datamängder:
- Onlinköp: Kund-ID, köphistorik, demografi och plats för onlineshoppare.
- Butikstransaktioner: Liknande information för kunder som handlat i butik.
Använda mängdoperatorer
För att få en komplett bild av alla kunder skulle företaget först använda UNION för att kombinera båda datamängderna till en enda tabell och ta bort eventuella dubbletter. Detta ger en enhetlig vy över hela kundbasen.
Därefter kan de använda INTERSECT för att identifiera kunder som har handlat både online och i butik. Detta segment är särskilt värdefullt eftersom de är starkt engagerade i varumärket över flera kanaler.
För att hitta möjligheter till marknadsföring över kanaler kan företaget använda EXCEPT. Till exempel skulle SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions hitta kunder som bara har handlat online men inte i butik. Företaget kan sedan rikta in sig på dessa kunder med erbjudanden som uppmuntrar dem att besöka en fysisk butik.
Bortom segmentering
Med dessa segment identifierade kan företaget gå vidare och förfina dem baserat på ytterligare faktorer som demografi eller köphistorik. Denna detaljerade förståelse av kunderna gör det möjligt att skräddarsy marknadsföringskampanjer med större precision.
Mängdoperatorer vs. JOINs
Både mängdoperatorer och SQL JOINs kombinerar data från flera frågor, men de fungerar olika. Kärnfrågan är om du vill kombinera rader eller kolumner.
| Funktion | Mängdoperatorer | JOINs |
|---|---|---|
| Kombinerar | Rader (staplar frågor vertikalt) | Kolumner (gör rader bredare horisontellt) |
| Kräver | Samma antal kolumner och kompatibla datatyper | En gemensam nyckelkolumn mellan tabeller |
| Använd när | Sammanfoga liknande datamängder, hitta överlapp eller skillnader mellan resultatmängder | Berika en rad med relaterad data från en annan tabell |
| Hantering av dubbletter | UNION tar bort dubbletter; UNION ALL behåller dem |
Beror på join-typ och data |
| Typer | UNION, UNION ALL, INTERSECT, EXCEPT/MINUS |
INNER, LEFT, RIGHT, FULL OUTER, CROSS |
Begränsningar och överväganden för mängdoperatorer
När du använder mängdoperatorer i SQL är det viktigt att beakta flera begränsningar och faktorer som kan påverka frågeprestanda, resultatens korrekthet och den övergripande användbarheten.
Datatypskompatibilitet och NULL-värden
Motsvarande kolumner i resultatmängderna måste ha kompatibla datatyper. Kontrollera att motsvarande kolumner har kompatibla datatyper innan du kombinerar frågor. Typkonflikter orsakar fel som är lätta att missa.
Mängdoperatorer kan behandla NULL-värden olika beroende på DBMS och den specifika operatorn. För att undvika fel måste utvecklare förstå hur NULL-värden hanteras.
Prestandapåverkan och dubblettrader
Mängdoperationer kan ha stor påverkan på frågeprestandan, särskilt när man hanterar stora eller komplexa datamängder. Faktorer som indexering, frågeoptimering och hårdvaruresurser kan påverka prestandan. Optimeringstekniker och prestandatrimning är viktiga för att minska flaskhalsar.
Som standard tar mängdoperatorer bort dubblettrader från resultatmängden. Men i vissa fall kan det vara nödvändigt att behålla dubbletter. Det är viktigt att förstå hur mängdoperatorer hanterar dubbletter och att använda lämpliga tekniker för att hantera dem vid behov.
Sortering av resultat och minnesbegränsningar
Mängdoperatorer garanterar inte ordningen på resultaten i den slutliga utdata. För att sortera den kombinerade resultatmängden, lägg till en ORDER BY-klausul allra sist i hela frågan, efter den sista SELECT-satsen.
Mängdoperationer kan förbruka mycket minne och resurser, särskilt vid arbete med stora datamängder. Minnesbegränsningar och resursbrist måste beaktas för att undvika prestandaförsämring eller systeminstabilitet.
Komplexitet, underhållbarhet och kompatibilitet mellan DBMS
Komplexa frågor som involverar flera mängdoperatorer, underfrågor och joins kan vara svåra att förstå, underhålla och felsöka. För att förbättra läsbarhet och underhållbarhet bör frågorna vara koncisa, väl dokumenterade och modulära.
Mängdoperatorer kan ha variationer i syntax och beteende mellan olika databashanterare (DBMS). Att känna till dessa skillnader är avgörande när du skriver SQL-frågor för kompatibilitet mellan plattformar.
Avslutande tankar
Mängdoperatorer löser ett specifikt problem: att kombinera eller jämföra resultatmängder utan att på förhand veta vilka rader som överlappar.
De omfattar UNION, INTERSECT och EXCEPT: de tre operatorerna för att kombinera, jämföra och subtrahera resultatmängder.
Om du vill lära dig mer, kolla in den här kursen om Att sammanfoga data i SQL.
Vanliga frågor om SQL-operatorer
Vad är skillnaden mellan UNION ALL och UNION?
UNION ALL inkluderar alla rader från båda frågorna, även om det finns dubbletter. UNION tar bort dubblettrader.
Hur skiljer sig UNION från JOIN i SQL?
UNION kombinerar resultaten av frågor vertikalt genom att lägga till rader från en fråga till en annan. JOIN kombinerar tabeller horisontellt genom att matcha rader baserat på en relaterad kolumn och skapar en bredare resultatmängd.
Finns det några prestandaöverväganden när man använder mängdoperationer?
Mängdoperationer kan vara beräkningsmässigt kostsamma, särskilt vid arbete med stora datamängder. Det är viktigt att optimera de enskilda frågorna och använda index där det är möjligt för att förbättra prestandan.
Vad är skillnaden mellan EXCEPT och NOT IN?
EXCEPT och NOT IN kan ge liknande resultat, men de beter sig olika med NULL-värden. EXCEPT behandlar NULL-värden som lika vid jämförelse av rader, så två NULL-värden på samma kolumnposition gör att en rad utesluts. NOT IN returnerar däremot inga rader alls om underfrågan innehåller något NULL-värde, eftersom NULL-jämförelser är odefinierade i SQL. För stora datamängder kan EXCEPT också vara mer läsbart än en korrelerad NOT IN-underfråga.
Kan jag använda ORDER BY med mängdoperatorer?
Ja, men bara en gång, allra sist i hela frågan. Du kan inte använda ORDER BY inne i enskilda SELECT-satser inom en mängdoperation. För att sortera den kombinerade resultatmängden, lägg till en enda ORDER BY-klausul efter den sista SELECT-satsen.
Exempel:
SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;Stöder MySQL INTERSECT och EXCEPT?
MySQL lade till stöd för INTERSECT och EXCEPT i version 8.0.31. Om du använder en äldre version måste du emulera dem: använd en INNER JOIN eller en underfråga med IN för att replikera INTERSECT, och en LEFT JOIN ... WHERE IS NULL eller en NOT IN-underfråga för att replikera EXCEPT. Oracle använder MINUS i stället för EXCEPT.