sql >> Databáze >  >> RDS >> Database

Pochopení rozdílu mezi operátory EXCEPT a NOT IN

Operátory EXCEPT i NOT IN se používají k filtrování záznamů z tabulky na základě konkrétního kritéria. V tomto článku se na tyto operátory podíváme podrobně a prozkoumáme rozdíly mezi nimi.

Než půjdeme dále, vytvořte si fiktivní data, která použijeme v tomto příkladu:

Příprava fiktivních dat

Spusťte následující skript a vytvořte fiktivní databázi a tabulky, které budeme používat v tomto článku.

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
 )

Ve výše uvedeném skriptu vytvoříme databázi ShowRoom se dvěma tabulkami, Cars1 a Cars2.

Pojďme přidat nějaké fiktivní záznamy do tabulek Cars1 a Cars2.

Spusťte následující 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)

Nyní máme užitečný soubor dat.

Podívejme se, jak se pomocí těchto dat od sebe liší operátory EXCEPT a NOT IN.

KROMĚ operátora

Operátor EXCEPT filtruje všechny záznamy z levého výsledku dotazu, které jsou také přítomné ve výsledku pravého dotazu, a vrátí zbývající výsledky z levého dotazu.

Syntaxe operátoru EXCEPT je následující:

Right_Query EXCEPT Left_Query

Před provedením operátoru EXCEPT je třeba splnit dvě podmínky. Jsou to:

  • Pořadí a počet sloupců vrácených oběma dotazy musí být stejné.
  • Datové typy sloupců se musí shodovat nebo být kompatibilní.

Může to znít složitě. Následující příklad to však objasní.

V tabulkách Cars1 a Cars2 jsou záznamy s id 6 až id 10 společné. Pokud použijeme operátor EXCEPT se záznamy z tabulky Cars1 vlevo a tabulky Cars2 vpravo, vrátí se ty záznamy z tabulky Cars1, které nejsou v Cars2.
Podívejme se na operátor EXCEPT v akci.

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

Výsledek výše uvedeného dotazu bude vypadat takto:

Dotaz na levé straně načte všechny záznamy z tabulky Cars1, zatímco dotaz na pravé straně načte všechny záznamy z tabulky Cars2. V tabulce Cars1 jsou záznamy s id 6 až 10 přítomny také v tabulce Cars2, proto operátor EXCEPT vrátil pouze prvních pět řádků z tabulky Cars1.

Podobně, pokud chcete vrátit všechny záznamy z tabulky Cars2, které nejsou přítomné v tabulce Cars1, můžete jednoduše přesunout tabulku Cars2 nalevo od operátoru EXCEPT, jak je znázorněno v následujícím dotazu:

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

Použití EXCEPT operátoru na jednom stole

V předchozích příkladech jsme aplikovali operátor EXCEPT na dvě tabulky. Operátor EXCEPT však lze použít i k filtrování záznamů z jedné tabulky. Pokud například chcete filtrovat všechny záznamy z tabulky Cars1, kde je hodnota výkonu větší než 3 000, můžete použít operátor EXCEPT následovně:

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

Ve výše uvedeném skriptu dotaz na levé straně operátoru EXCEPT načte všechny záznamy z tabulky Cars1. Dotaz na pravé straně operátoru EXCEPT načte pouze ty záznamy z tabulky Cars1, kde je hodnota výkonu menší než 3000. Operátor EXCEPT filtruje záznamy z dotazu vlevo, které existují ve výsledcích z dotazu vpravo. Proto budou všechny záznamy v tabulce Cars1, kde je výkon menší než 3 000, odfiltrovány a zbytek záznamů bude vrácen, jak je uvedeno ve výstupu níže:

NENÍ V Operátoru

Operátor NOT IN se také používá k filtrování řádků. Pojďme najít všechny záznamy z tabulky Cars1, které jsou také přítomné v tabulce Cars2, a vrátíme zbytek záznamů pomocí operátoru NOT IN.

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

Výsledek výše uvedeného dotazu vypadá takto:

To je podobné výsledkům získaným pomocí operátoru EXCEPT.

Rozdíl mezi operátory EXCEPT a NOT IN

Vidíme, že výsledky získané pomocí operátorů EXCEPT a NOT IN jsou podobné. Mezi operátory EXCEPT a NOT IN jsou však dva hlavní rozdíly:

1- NOT IN vrátí duplicitní záznamy, zatímco EXCEPT vrátí pouze odlišné záznamy

Operátor EXCEPT odebere z výsledků duplicitní řádky a vrátí pouze DISTINCT záznamy. Na druhou stranu operátor NOT IN vrátí duplicitní záznamy.
Pojďme se na to podívat na příkladu. Provedením následujícího dotazu vložte duplicitní záznam do tabulky Cars1.

INSERT INTO Cars1

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

Nyní má tabulka Cars1 dva duplicitní záznamy. Můžete to ověřit provedením následujícího dotazu:

SELECT * FROM Cars1

Tabulka Cars1 bude vypadat takto:

Můžete vidět, že řádky 1 a 11 jsou navzájem duplikáty.

Nejprve použijeme operátor EXCEPT k odfiltrování všech záznamů z tabulky Cars1, které jsou přítomné v tabulce Cars2.

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

Výsledek vypadá takto:

Můžete vidět, že ačkoli řádky 1 a 11 byly duplicitní v tabulce Cars1 a nebyly přítomny v tabulce Cars2, operátor EXCEPT nevrátil oba tyto řádky. Vrátil pouze odlišné řádky.

Nyní pro stejný úkol použijeme operátor NOT IN:

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

Výstup výše uvedeného dotazu vypadá takto:

Můžete vidět, že NOT IN vrací duplicitní řádky, tj. řádek 1 a řádek 6.

2- EXCEPT porovnává sloupce, zatímco NOT IN porovnává jednu hodnotu

Operátor EXCEPT porovnává hodnoty v jednom nebo více sloupcích. To znamená, že počet sloupců musí být stejný. Na druhou stranu operátor NOT IN porovnává hodnoty v jednom sloupci.

Nemůžete mít například nestejný počet sloupců pro dotazy nalevo a napravo od operátoru EXCEPT, jak je znázorněno v následujícím příkladu:

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

Výše uvedený dotaz vrací následující chybu:

Pro operátor NOT IN nemůžete mít v dílčím dotazu více než jeden sloupec. To znamená, že následující dotaz vrátí chybu:

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

Ve výše uvedeném skriptu má dílčí dotaz dva sloupce, tj. id a název. Proto bude vyvolána chyba:

Další čtení:

  • Školy W3:příklady IN a NOT IN
  • TechontheNet:EXCEPT Operator
  • YouTube:KROMĚ provozovatele

  1. Autentizační plugin 'caching_sha2_password' nelze načíst

  2. Funkce MySQL pro zjištění počtu pracovních dnů mezi dvěma daty

  3. PostgreSQL kontrolní omezení pro podmínku cizího klíče

  4. MySQL - SELECT WHERE pole IN (poddotaz) - Extrémně pomalé proč?