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