Database
 sql >> Datenbank >  >> RDS >> Database

Den Unterschied zwischen EXCEPT- und NOT IN-Operatoren verstehen

Sowohl die Operatoren EXCEPT als auch NOT IN werden verwendet, um Datensätze aus einer Tabelle basierend auf einem bestimmten Kriterium zu filtern. In diesem Artikel werden wir uns diese Operatoren im Detail ansehen und die Unterschiede zwischen ihnen untersuchen.

Bevor wir fortfahren, erstellen wir einige Dummy-Daten, die wir in diesem Beispiel verwenden werden:

Dummy-Daten vorbereiten

Führen Sie das folgende Skript aus, um eine Dummy-Datenbank und Tabellen zu erstellen, die wir in diesem Artikel verwenden werden.

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
 )

Im obigen Skript erstellen wir eine ShowRoom-Datenbank mit zwei Tabellen, Cars1 und Cars2.

Fügen wir den Tabellen Cars1 und Cars2 einige Dummy-Datensätze hinzu.

Führen Sie das folgende Skript aus:

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)

Wir haben jetzt einen nützlichen Datensatz.

Sehen wir uns an, wie sich die Operatoren EXCEPT und NOT IN anhand dieser Daten voneinander unterscheiden.

AUSSER Operator

Der EXCEPT-Operator filtert alle Datensätze aus dem linken Abfrageergebnis, die auch im Ergebnis der rechten Abfrage vorhanden sind, und gibt die restlichen Ergebnisse der linken Abfrage zurück.

Die Syntax des EXCEPT-Operators lautet wie folgt:

Right_Query EXCEPT Left_Query

Vor der Ausführung des EXCEPT-Operators müssen zwei Bedingungen erfüllt sein. Sie sind:

  • Die Reihenfolge und Anzahl der Spalten, die von beiden Abfragen zurückgegeben werden, müssen identisch sein.
  • Die Datentypen der Spalten müssen übereinstimmen oder kompatibel sein.

Das mag schwierig klingen. Das folgende Beispiel wird es jedoch verdeutlichen.

In den Tabellen „Cars1“ und „Cars2“ sind die Datensätze mit den IDs 6 bis 10 üblich. Wenn wir den EXCEPT-Operator mit Datensätzen aus der Cars1-Tabelle links und der Cars2-Tabelle rechts verwenden, werden diejenigen Datensätze aus der Cars1-Tabelle zurückgegeben, die nicht in Cars2 enthalten sind.
Sehen wir uns den EXCEPT-Operator in Aktion an.

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

Das Ergebnis der obigen Abfrage sieht folgendermaßen aus:

Die Abfrage auf der linken Seite ruft alle Datensätze aus der Tabelle Cars1 ab, während die Abfrage auf der rechten Seite alle Datensätze aus der Tabelle Cars2 abruft. In der Cars1-Tabelle sind die Datensätze mit den IDs 6 bis 10 auch in der Cars2-Tabelle vorhanden, daher hat der EXCEPT-Operator nur die ersten fünf Zeilen aus der Cars1-Tabelle zurückgegeben.

Wenn Sie alle Datensätze aus der Cars2-Tabelle zurückgeben möchten, die nicht in der Cars1-Tabelle vorhanden sind, können Sie die Cars2-Tabelle einfach links neben den EXCEPT-Operator verschieben, wie in der folgenden Abfrage gezeigt:

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

Except-Operator für eine einzelne Tabelle verwenden

In den vorherigen Beispielen haben wir den EXCEPT-Operator auf zwei Tabellen angewendet. Der EXCEPT-Operator kann jedoch auch zum Filtern von Datensätzen aus einer einzelnen Tabelle verwendet werden. Wenn Sie beispielsweise alle Datensätze aus der Tabelle Cars1 filtern möchten, deren Leistungswert größer als 3.000 ist, können Sie den Operator EXCEPT wie folgt verwenden:

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

Im obigen Skript ruft die Abfrage auf der linken Seite des EXCEPT-Operators alle Datensätze aus der Cars1-Tabelle ab. Die Abfrage auf der rechten Seite des EXCEPT-Operators ruft nur die Datensätze aus der Cars1-Tabelle ab, bei denen der Leistungswert kleiner als 3.000 ist. Der EXCEPT-Operator filtert Datensätze aus der Abfrage auf der linken Seite, die in den Ergebnissen der Abfrage auf der rechten Seite vorhanden sind. Daher werden alle Datensätze in der Cars1-Tabelle mit einer Leistung von weniger als 3.000 herausgefiltert, und die restlichen Datensätze werden wie in der folgenden Ausgabe gezeigt zurückgegeben:

NICHT IM Operator

Der NOT IN-Operator wird auch zum Filtern von Zeilen verwendet. Lassen Sie uns alle Datensätze aus der Cars1-Tabelle finden, die auch in der Cars2-Tabelle vorhanden sind, und die restlichen Datensätze mit dem NOT IN-Operator zurückgeben.

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

Das Ergebnis der obigen Abfrage sieht so aus:

Dies ähnelt den Ergebnissen, die mit dem EXCEPT-Operator erhalten werden.

Unterschied zwischen EXCEPT- und NOT IN-Operatoren

Wir können sehen, dass die Ergebnisse mit den Operatoren EXCEPT und NOT IN ähnlich sind. Es gibt jedoch zwei Hauptunterschiede zwischen EXCEPT- und NOT IN-Operatoren:

1- NOT IN gibt doppelte Datensätze zurück, während EXCEPT nur unterschiedliche Datensätze zurückgibt

Der EXCEPT-Operator entfernt doppelte Zeilen aus den Ergebnissen und gibt nur DISTINCT-Datensätze zurück. Auf der anderen Seite gibt der NOT IN-Operator doppelte Datensätze zurück.
Sehen wir uns das anhand eines Beispiels an. Führen Sie die folgende Abfrage aus, um einen doppelten Datensatz in die Cars1-Tabelle einzufügen.

INSERT INTO Cars1

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

Jetzt hat die Cars1-Tabelle zwei doppelte Datensätze. Sie können dies überprüfen, indem Sie die folgende Abfrage ausführen:

SELECT * FROM Cars1

Die Cars1-Tabelle sieht folgendermaßen aus:

Sie können sehen, dass die Zeilen 1 und 11 Duplikate sind.

Lassen Sie uns zuerst den EXCEPT-Operator verwenden, um alle Datensätze aus der Cars1-Tabelle zu filtern, die in der Cars2-Tabelle vorhanden sind.

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

Das Ergebnis sieht so aus:

Sie können sehen, dass, obwohl die Zeilen 1 und 11 Duplikate in der Cars1-Tabelle waren und sie nicht in der Cars2-Tabelle vorhanden waren, der EXCEPT-Operator diese beiden Zeilen nicht zurückgegeben hat. Es hat nur eindeutige Zeilen zurückgegeben.

Lassen Sie uns nun den NOT IN-Operator für die gleiche Aufgabe verwenden:

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

Die Ausgabe der obigen Abfrage sieht folgendermaßen aus:

Sie können sehen, dass NOT IN doppelte Zeilen zurückgibt, d. h. Zeile 1 und Zeile 6.

2- EXCEPT vergleicht Spalten, während NOT IN einen einzelnen Wert vergleicht

Der EXCEPT-Operator vergleicht Werte in einer oder mehreren Spalten. Das bedeutet, dass die Anzahl der Spalten gleich sein muss. Andererseits vergleicht der NOT IN-Operator Werte in einer einzelnen Spalte.

Sie können beispielsweise nicht links und rechts von einem EXCEPT-Operator eine ungleiche Anzahl von Spalten für die Abfragen haben, wie im folgenden Beispiel gezeigt:

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

Die obige Abfrage gibt den folgenden Fehler zurück:

Für den NOT IN-Operator darf die Unterabfrage nicht mehr als eine Spalte enthalten. Das bedeutet, dass die folgende Abfrage einen Fehler zurückgibt:

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

Im obigen Skript hat die Unterabfrage zwei Spalten, d. h. ID und Name. Daher wird ein Fehler ausgegeben:

Weiterführende Literatur:

  • W3-Schulen:IN- und NICHT-IN-Beispiele
  • TechontheNet:Der EXCEPT-Operator
  • YouTube:Der EXCEPT-Operator