sql >> Databasteknik >  >> RDS >> Database

Förstå skillnaden mellan EXCEPT och NOT IN-operatörer

Operatorerna EXCEPT och NOT IN används för att filtrera poster från en tabell baserat på ett specifikt kriterium. I den här artikeln kommer vi att titta på dessa operatörer i detalj och kommer att undersöka skillnaderna mellan dem.

Innan vi går vidare, låt oss skapa lite dummydata som vi kommer att använda i det här exemplet:

Förbereder dummydata

Kör följande skript för att skapa en dummydatabas och tabeller som vi kommer att använda i den här artikeln.

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 skriptet ovan skapar vi en ShowRoom-databas med två tabeller, Cars1 och Cars2.

Låt oss lägga till några dummy-poster till tabellerna Cars1 och Cars2.

Kör följande skript:

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 en användbar datauppsättning.

Låt oss titta på hur operatorerna EXCEPT och NOT IN skiljer sig från varandra med hjälp av denna information.

UTOM Operatör

Operatorn EXCEPT filtrerar alla poster från det vänstra frågeresultatet, som också finns i resultatet av den högra frågan och returnerar de återstående resultaten från den vänstra frågan.

Syntaxen för operatorn EXCEPT är följande:

Right_Query EXCEPT Left_Query

Det finns två villkor som måste uppfyllas innan EXCEPT-operatören utförs. De är:

  • Ordningen och antalet kolumner som returneras av båda frågorna måste vara samma.
  • Datatyperna för kolumnerna måste matcha eller vara kompatibla.

Det här kan låta knepigt. Följande exempel kommer dock att klargöra det.

I tabellerna Cars1 och Cars2 är posterna med id 6 till id 10 vanliga. Om vi ​​använder EXCEPT-operatorn med poster från Cars1-tabellen till vänster och Cars2-tabellen till höger, kommer de poster från Cars1-tabellen att returneras som inte finns i Cars2.
Låt oss se EXCEPT-operatorn i aktion.

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

Resultatet av ovanstående fråga kommer att se ut så här:

Frågan på vänster sida hämtar alla poster från Cars1-tabellen medan den på höger sida hämtar alla poster från Cars2-tabellen. I Cars1-tabellen finns posterna med id 6 till 10 också i Cars2-tabellen, därför returnerade operatorn EXCEPT endast de första fem raderna från Cars1-tabellen.

På liknande sätt, om du vill returnera alla poster från Cars2-tabellen som inte finns i Cars1-tabellen, kan du helt enkelt flytta Cars2-tabellen till vänster om operatorn EXCEPT som visas i följande fråga:

USE ShowRoom
SELECT id, name, company, power FROM  Cars2
Except
SELECT id, name, company, power FROM  Cars1

Använda UTOM Operatör på ett enda bord

I de tidigare exemplen använde vi operatorn EXCEPT på två tabeller. Dock kan operatorn EXCEPT användas för att filtrera poster från en enskild tabell också. Om du till exempel vill filtrera alla poster från Cars1-tabellen där effektvärdet är större än 3 000, kan du använda operatorn EXCEPT enligt följande:

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
Except
SELECT id, name, company, power from Cars1 WHERE power < 3000

I skriptet ovan hämtar frågan till vänster om operatorn EXCEPT alla poster från Cars1-tabellen. Frågan på höger sida av EXCEPT-operatören hämtar endast de poster från Cars1-tabellen där effektvärdet är mindre än 3 000. Operatorn EXCEPT filtrerar poster från frågan till vänster som finns i resultaten från frågan till höger. Därför kommer alla poster i Cars1-tabellen där effekten är mindre än 3 000 att filtreras bort och resten av posterna kommer att returneras som visas i utgången nedan:

INTE I Operatör

NOT IN-operatören används också för att filtrera rader. Låt oss hitta alla poster från Cars1-tabellen som också finns i Cars2-tabellen och returnera resten av posterna med NOT IN-operatorn.

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

Resultatet av ovanstående fråga ser ut så här:

Detta liknar resultaten som erhålls med operatorn EXCEPT.

Skillnad mellan EXCEPT och NOT IN Operators

Vi kan se att resultaten som erhålls med EXCEPT och NOT IN-operatorn är liknande. Det finns dock två stora skillnader mellan EXCEPT och NOT IN Operators:

1- NOT IN returnerar dubbletter av poster medan EXCEPT returnerar endast distinkta poster

Operatören EXCEPT tar bort dubbletter av rader från resultaten och returnerar endast DISTINCT-poster. Å andra sidan kommer NOT IN-operatören att returnera dubbletter av poster.
Låt oss ta en titt på detta med hjälp av ett exempel. Kör följande fråga för att infoga en dubblettpost i Cars1-tabellen.

INSERT INTO Cars1

VALUES
(1, 'Corrolla', 'Toyota', 1800)

Nu har Cars1-tabellen två dubbletter. Du kan verifiera detta genom att utföra följande fråga:

SELECT * FROM Cars1

Tabellen Cars1 kommer att se ut så här:

Du kan se att raderna 1 och 11 är dubbletter av varandra.

Låt oss först använda operatorn EXCEPT för att filtrera alla poster från Cars1-tabellen som finns i Cars2-tabellen.

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

Resultatet ser ut så här:

Du kan se att även om raderna 1 och 11 var dubbletter i Cars1-tabellen och de inte fanns i Cars2-tabellen, returnerade EXCEPT-operatorn inte båda dessa rader. Det har bara returnerat distinkta rader.

Låt oss nu använda NOT IN-operatorn för samma uppgift:

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

Utdata från ovanstående fråga ser ut så här:

Du kan se att NOT IN returnerar dubbla rader, dvs rad 1 och rad 6.

2- EXCEPT jämför kolumner medan NOT IN jämför ett enstaka värde

EXCEPT operatorn jämför värden i en eller flera kolumner. Det betyder att antalet kolumner måste vara detsamma. Å andra sidan jämför NOT IN-operatorn värden i en enda kolumn.

Du kan till exempel inte ha ett ojämnt antal kolumner för frågorna till vänster och höger om en EXCEPT-operator som visas i följande exempel:

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name,power FROM Cars2

Ovanstående fråga returnerar följande fel:

För NOT IN-operatorn kan du inte ha mer än en kolumn i underfrågan. Det betyder att följande fråga kommer att returnera ett fel:

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id, name from Cars2)

I skriptet ovan har underfrågan två kolumner, dvs id och namn. Därför kommer ett fel att visas:

Mer läsning:

  • W3 Schools:IN och NOT IN Exempel
  • TechontheNet:UTOM operatören
  • YouTube:UTOM operatören

  1. Skillnad mellan språk sql och språk plpgsql i PostgreSQL-funktioner

  2. Vilka är stegen i databasdesign?

  3. #1139 - Fick felet 'repetition-operator operand invalid' från regexp

  4. Databasen tas inte bort när du avinstallerar Android-appen