sql >> Database >  >> RDS >> Database

Het verschil begrijpen tussen BEHALVE en NIET IN operators

Zowel de operators EXCEPT als NOT IN worden gebruikt om records uit een tabel te filteren op basis van een specifiek criterium. In dit artikel zullen we deze operators in detail bekijken en de verschillen ertussen onderzoeken.

Laten we, voordat we verder gaan, enkele dummy-gegevens maken die we in dit voorbeeld zullen gebruiken:

Dummy-gegevens voorbereiden

Voer het volgende script uit om een ​​dummy-database en tabellen te maken die we in dit artikel zullen gebruiken.

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
 )

In het bovenstaande script maken we een ShowRoom-database aan met twee tabellen, Cars1 en Cars2.

Laten we wat dummy-records toevoegen aan de tabellen Cars1 en Cars2.

Voer het volgende script uit:

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)

We hebben nu een bruikbare dataset.

Laten we eens kijken hoe de EXCEPT en NOT IN operators van elkaar verschillen met behulp van deze gegevens.

BEHALVE Operator

De EXCEPT-operator filtert alle records uit het linkerqueryresultaat, die ook aanwezig zijn in het resultaat van de rechterquery, en retourneert de resterende resultaten van de linkerquery.

De syntaxis van de EXCEPT-operator is als volgt:

Right_Query EXCEPT Left_Query

Er zijn twee voorwaarden waaraan moet worden voldaan voordat de operator EXCEPT wordt uitgevoerd. Dit zijn:

  • De volgorde en het aantal kolommen dat door beide zoekopdrachten wordt geretourneerd, moet hetzelfde zijn.
  • De gegevenstypen van de kolommen moeten overeenkomen of compatibel zijn.

Dit klinkt misschien lastig. Het volgende voorbeeld zal het echter duidelijk maken.

In de tabellen Cars1 en Cars2 zijn de records met id 6 tot id 10 gebruikelijk. Als we de EXCEPT-operator gebruiken met records uit de Cars1-tabel aan de linkerkant en Cars2-tabel aan de rechterkant, worden die records uit de Cars1-tabel geretourneerd die niet in Cars2 staan.
Laten we de EXCEPT-operator in actie zien.

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

Het resultaat van de bovenstaande zoekopdracht ziet er als volgt uit:

De query aan de linkerkant haalt alle records op uit de Cars1-tabel, terwijl die aan de rechterkant alle records uit de Cars2-tabel haalt. In de Cars1-tabel zijn de records met id 6 tot 10 ook aanwezig in de Cars2-tabel, daarom heeft de EXCEPT-operator alleen de eerste vijf rijen van de Cars1-tabel geretourneerd.

Evenzo, als u alle records uit de Cars2-tabel wilt retourneren die niet aanwezig zijn in de Cars1-tabel, kunt u de Cars2-tabel eenvoudig naar links van de EXCEPT-operator verplaatsen, zoals weergegeven in de volgende query:

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

Behalve operator gebruiken op een enkele tafel

In de vorige voorbeelden hebben we de EXCEPT-operator toegepast op twee tabellen. De operator EXCEPT kan echter ook worden gebruikt om records uit één tabel te filteren. Als u bijvoorbeeld alle records uit de Cars1-tabel wilt filteren waarvan de vermogenswaarde groter is dan 3.000, kunt u de EXCEPT-operator als volgt gebruiken:

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

In het bovenstaande script haalt de query aan de linkerkant van de EXCEPT-operator alle records op uit de Cars1-tabel. De query aan de rechterkant van de EXCEPT-operator haalt alleen die records uit de Cars1-tabel op waarvan de vermogenswaarde kleiner is dan 3.000. De operator EXCEPT filtert records uit de query aan de linkerkant die bestaan ​​in de resultaten van de query aan de rechterkant. Daarom zullen alle records in de Cars1-tabel met een vermogen van minder dan 3.000 worden uitgefilterd en de rest van de records worden geretourneerd zoals weergegeven in de onderstaande uitvoer:

NIET IN Operator

De NOT IN-operator wordt ook gebruikt om rijen te filteren. Laten we alle records uit de Cars1-tabel zoeken die ook aanwezig zijn in de Cars2-tabel en de rest van de records retourneren met de NOT IN-operator.

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

Het resultaat van de bovenstaande zoekopdracht ziet er als volgt uit:

Dit is vergelijkbaar met de resultaten die zijn verkregen met de EXCEPT-operator.

Verschil tussen EXCEPT en NOT IN operators

We kunnen zien dat de resultaten die zijn verkregen met de operator EXCEPT en NOT IN vergelijkbaar zijn. Er zijn echter twee grote verschillen tussen BEHALVE en NIET IN Operators:

1- NOT IN Retourneert dubbele records terwijl EXCEPT alleen verschillende records retourneert

De EXCEPT-operator verwijdert dubbele rijen uit de resultaten en retourneert alleen DISTINCT-records. Aan de andere kant zal de NOT IN-operator dubbele records retourneren.
Laten we dit eens bekijken aan de hand van een voorbeeld. Voer de volgende query uit om een ​​duplicaatrecord in de Cars1-tabel in te voegen.

INSERT INTO Cars1

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

Nu heeft de Cars1-tabel twee dubbele records. U kunt dit verifiëren door de volgende query uit te voeren:

SELECT * FROM Cars1

De Cars1-tabel ziet er zo uit:

Je kunt zien dat rijen 1 en 11 dubbele van elkaar zijn.

Laten we eerst de EXCEPT-operator gebruiken om alle records uit de Cars1-tabel te filteren die aanwezig zijn in de Cars2-tabel.

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

Het resultaat ziet er als volgt uit:

U kunt zien dat hoewel rijen 1 en 11 duplicaten waren in de Cars1-tabel en ze niet aanwezig waren in de Cars2-tabel, de EXCEPT-operator niet beide rijen retourneerde. Het heeft alleen afzonderlijke rijen geretourneerd.

Laten we nu de NOT IN-operator gebruiken voor dezelfde taak:

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

De uitvoer van de bovenstaande query ziet er als volgt uit:

U kunt zien dat NOT IN dubbele rijen retourneert, d.w.z. rij 1 en rij 6.

2- EXCEPT vergelijkt kolommen terwijl NOT IN een enkele waarde vergelijkt

EXCEPT-operator vergelijkt waarden in een of meer kolommen. Dit betekent dat het aantal kolommen gelijk moet zijn. Aan de andere kant vergelijkt de NOT IN-operator waarden in een enkele kolom.

U kunt bijvoorbeeld geen ongelijk aantal kolommen hebben voor de query's links en rechts van een EXCEPT-operator, zoals in het volgende voorbeeld:

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

De bovenstaande query retourneert de volgende fout:

Voor de NOT IN-operator kunt u niet meer dan één kolom in de subquery hebben. Dit betekent dat de volgende zoekopdracht een fout zal opleveren:

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

In het bovenstaande script heeft de subquery twee kolommen, namelijk id en naam. Daarom wordt er een fout gegenereerd:

Verder lezen:

  • W3-scholen:IN en NIET IN voorbeelden
  • TechontheNet:de BEHALVE Operator
  • YouTube:De BEHALVE Operator

  1. Een voorwaardelijke unieke index toevoegen aan PostgreSQL

  2. PostgreSQL- en C#-gegevenstypen

  3. RAWTONHEX() Functie in Oracle

  4. Een GDI-bronlek behandelen