Både EXCEPT og NOT IN-operatorerne bruges til at filtrere poster fra en tabel baseret på et specifikt kriterium. I denne artikel vil vi se på disse operatører i detaljer og vil undersøge forskellene mellem dem.
Før vi går videre, lad os oprette nogle dummy-data, som vi vil bruge i dette eksempel:
Forberedelse af dummy-data
Udfør følgende script for at oprette en dummy-database og tabeller, som vi vil bruge i denne artikel.
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars1 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) CREATE TABLE Cars2 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
I scriptet ovenfor opretter vi en ShowRoom-database med to tabeller, Cars1 og Cars2.
Lad os tilføje nogle dummy-poster til Cars1- og Cars2-tabellerne.
Udfør følgende script:
USE ShowRoom INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 1500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200) INSERT INTO Cars2 VALUES (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200), (11, 'Atlas', 'Volkswagen', 5000), (12, '110', 'Bugatti', 8000), (13, 'Landcruiser', 'Toyota', 3000), (14, 'Civic', 'Honda', 1800), (15, 'Accord', 'Honda', 2800)
Vi har nu et nyttigt datasæt.
Lad os se på, hvordan operatorerne EXCEPT og NOT IN adskiller sig fra hinanden ved at bruge disse data.
UNDTAGET operatør
Operatoren EXCEPT filtrerer alle poster fra det venstre forespørgselsresultat, som også er til stede i resultatet af den højre forespørgsel og returnerer de resterende resultater fra venstre forespørgsel.
Syntaksen for operatoren EXCEPT er som følger:
Right_Query EXCEPT Left_Query
Der er to betingelser, der skal være opfyldt før udførelsen af EXCEPT-operatøren. De er:
- Rækkefølgen og antallet af kolonner, der returneres af begge forespørgsler, skal være den samme.
- Datatyperne for kolonnerne skal matche eller være kompatible.
Det kan lyde vanskeligt. Det følgende eksempel vil dog gøre det klart.
I tabellerne Cars1 og Cars2 er posterne med id 6 til id 10 fælles. Hvis vi bruger EXCEPT-operatoren med poster fra Cars1-tabellen til venstre og Cars2-tabellen til højre, returneres de poster fra Cars1-tabellen, som ikke er i Cars2.
Lad os se EXCEPT-operatoren i aktion.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Resultatet af ovenstående forespørgsel vil se således ud:
Forespørgslen på venstre side henter alle posterne fra Cars1-tabellen, mens den på højre side henter alle posterne fra Cars2-tabellen. I Cars1-tabellen er posterne med id 6 til 10 også til stede i Cars2-tabellen, derfor returnerede EXCEPT-operatoren kun de første fem rækker fra Cars1-tabellen.
På samme måde, hvis du vil returnere alle poster fra Cars2-tabellen, som ikke er til stede i Cars1-tabellen, kan du blot flytte Cars2-tabellen til venstre for UNDTAGELSE-operatoren som vist i følgende forespørgsel:
USE ShowRoom SELECT id, name, company, power FROM Cars2 Except SELECT id, name, company, power FROM Cars1
Brug af UNDTAGET operatør på et enkelt bord
I de foregående eksempler anvendte vi operatoren EXCEPT på to tabeller. Operatoren EXCEPT kan dog også bruges til at filtrere poster fra en enkelt tabel. Hvis du f.eks. vil filtrere alle poster fra Cars1-tabellen, hvor effektværdien er større end 3.000, kan du bruge EXCEPT-operatoren som følger:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power from Cars1 WHERE power < 3000
I ovenstående script henter forespørgslen i venstre side af EXCEPT-operatoren alle poster fra Cars1-tabellen. Forespørgslen på højre side af EXCEPT-operatøren henter kun de poster fra Cars1-tabellen, hvor effektværdien er mindre end 3.000. Operatoren EXCEPT filtrerer poster fra forespørgslen til venstre, der findes i resultaterne fra forespørgslen til højre. Derfor vil alle posterne i Cars1-tabellen, hvor effekten er mindre end 3.000, blive filtreret fra, og resten af posterne vil blive returneret som vist i outputtet nedenfor:
IKKE I operatør
NOT IN-operatøren bruges også til at filtrere rækker. Lad os finde alle posterne fra Cars1-tabellen, der også er til stede i Cars2-tabellen, og returnere resten af posterne med NOT IN-operatoren.
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Resultatet af ovenstående forespørgsel ser således ud:
Dette svarer til resultaterne opnået ved hjælp af operatoren EXCEPT.
Forskel mellem EXCEPT og NOT IN Operators
Vi kan se, at resultaterne opnået med EXCEPT og NOT IN-operatoren er ens. Der er dog to store forskelle mellem UNDTAGET og IKKE I operatører:
1- NOT IN returnerer duplikerede poster, mens EXCEPT returnerer kun distinkte poster
Operatoren EXCEPT fjerner duplikerede rækker fra resultaterne og returnerer kun DISTINCT-poster. På den anden side vil NOT IN-operatøren returnere duplikerede poster.
Lad os tage et kig på dette ved hjælp af et eksempel. Udfør følgende forespørgsel for at indsætte en dubletpost i Cars1-tabellen.
INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800)
Nu har Cars1-tabellen to duplikerede poster. Du kan bekræfte dette ved at udføre følgende forespørgsel:
SELECT * FROM Cars1
Biler1-tabellen vil se sådan ud:
Du kan se, at række 1 og 11 er dubletter af hinanden.
Lad os først bruge EXCEPT-operatoren til at filtrere alle poster fra Cars1-tabellen, der findes i Cars2-tabellen.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Resultatet ser således ud:
Du kan se, at selvom række 1 og 11 var dubletter i Cars1-tabellen, og de ikke var til stede i Cars2-tabellen, returnerede EXCEPT-operatøren ikke begge disse rækker. Det har kun returneret distinkte rækker.
Lad os nu bruge NOT IN-operatoren til den samme opgave:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Outputtet af ovenstående forespørgsel ser sådan ud:
Du kan se, at NOT IN returnerer duplikerede rækker, dvs. række 1 og række 6.
2- UNDTAGET sammenligner kolonner, mens NOT IN sammenligner en enkelt værdi
UNDTAGET operator sammenligner værdier i en eller mere end én kolonne. Det betyder, at antallet af kolonner skal være det samme. På den anden side sammenligner NOT IN-operatoren værdier i en enkelt kolonne.
For eksempel kan du ikke have et ulige antal kolonner for forespørgslerne til venstre og højre for en UNDTAGELSE-operator som vist i følgende eksempel:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name,power FROM Cars2
Ovenstående forespørgsel returnerer følgende fejl:
For NOT IN-operatoren kan du ikke have mere end én kolonne i underforespørgslen. Det betyder, at følgende forespørgsel vil returnere en fejl:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id, name from Cars2)
I ovenstående script har underforespørgslen to kolonner, dvs. id og navn. Derfor vil en fejl blive kastet:
Yderligere læsning:
- W3-skoler:IN- og NOT IN-eksempler
- TechontheNet:UNDTAGET operatøren
- YouTube:UNDTAGET operatøren