Zurück zur Artikelliste Artikel
9 Leseminuten

Was bewirken die SQL-Klauseln INTERSECT und MINUS?

Kennen Sie den Unterschied zwischen den INTERSECT- und MINUS-Klauseln in SQL und wissen Sie, wie Sie sie verwenden können? In diesem Artikel finden Sie Beispiele und Erklärungen.

SQL INTERSECT und MINUS sind nützliche Klauseln, um schnell den Unterschied zwischen zwei Tabellen zu ermitteln und die gemeinsamen Zeilen zu finden.

INTERSECT vergleicht die Daten zwischen Tabellen und gibt nur die Datenzeilen zurück, die in beiden Tabellen vorhanden sind.

MINUS vergleicht die Daten zwischen Tabellen und gibt die Datenzeilen zurück, die nur in der ersten von Ihnen angegebenen Tabelle vorhanden sind.

Sowohl SQL INTERSECT als auch MINUS (oder EXCEPT, je nach Ihrem SQL-Dialekt) sind Teil des SQL-Grundlagenkurses von LearnSQL.de.

SQL INTERSECT

Der SQL INTERSECT Operator wird verwendet, um die Ergebnisse von zwei oder mehr SELECT Anweisungen zurückzugeben. Er gibt jedoch nur die von allen Abfragen oder Datensätzen ausgewählten Zeilen zurück. Wenn ein Datensatz in einer Abfrage vorhanden ist und in der anderen nicht, wird er in den Ergebnissen von INTERSECT ausgelassen.

Die Anzahl und Reihenfolge der Spalten muss in allen SELECT Abfragen gleich sein.

Die Datentypen der Spalten müssen gleich oder zumindest miteinander kompatibel sein. INTERSECT filtert Duplikate und gibt nur eindeutige Zeilen zurück, die allen Abfragen gemeinsam sind.

Hier ist die Syntax für den INTERSECT Operator:

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

INTERSECT

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Alles, was innerhalb der eckigen Klammern steht, ist völlig optional. Das Konzept von INTERSECT wird durch das folgende Diagramm näher erläutert:

INTERSECT

Die Abfrage INTERSECT gibt die Datensätze im schattierten Bereich zurück. Dies sind die Datensätze, die in beiden Datensätzen vorhanden sind.

INTERSECT ist nur eine Möglichkeit, die Ergebnisse verschiedener SQL-Abfragen zusammenzuführen. Wenn Sie mehr darüber erfahren möchten, lesen Sie diesen Artikel über die verschiedenen Methoden zur Kombination der Ergebnisse von SQL-Abfragen.

SQL-MINUS

Die SQL MINUS -Klausel wird verwendet, um zwei SELECT -Anweisungen zu kombinieren, aber sie gibt Zeilen aus der ersten SELECT -Anweisung zurück, die von der zweiten SELECT -Anweisung nicht zurückgegeben werden. SQL MINUS gibt nur Zeilen zurück, die in der zweiten SELECT Anweisung nicht verfügbar sind.

Jede SELECT -Anweisung innerhalb einer MINUS -Abfrage muss die gleiche Anzahl von Feldern in den Ergebnismengen sowie ähnliche Datentypen enthalten.

Der Operator MINUS wird nicht von allen SQL-Datenbanken unterstützt. Er kann in Datenbanken wie MySQL und Oracle verwendet werden. Für Datenbanken wie SQL Server, PostgreSQL und SQLite verwenden Sie den Operator EXCEPT, um diese Art von Abfrage durchzuführen.

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

MINUS

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Der in den eckigen Klammern angegebene SQL-Code ist völlig optional. Das Konzept von SQL MINUS wird in diesem Diagramm näher erläutert:

MINUS

Die Abfrage MINUS gibt die Datensätze im roten Bereich zurück. Dies sind die Datensätze, die im ersten Datensatz und nicht im zweiten Datensatz vorhanden sind.

MINUS vs. INTERSECT: Beispiele

Lassen Sie uns die Klauseln INTERSECT und MINUS auf ein praktisches Beispiel anwenden. Stellen Sie sich vor, wir haben die folgenden Tabellen.

customers - Enthält Details über unsere Kunden

idcustomer_namecountry
1Infotech SolutionsGermany
2Corpway IndustriesIreland
3Fenway IncEngland
4Fairview LtdFrance

suppliers - Enthält Details über unsere Lieferanten.

idcustomer_namecountry
1Carbon Way SuppliersSpain
2Alloy IncFrance
3Materials Delivered LtdIreland
4Concrete CrewPoland
5Conglorito SystemsItaly

Schreiben wir nun eine INTERSECT Abfrage. Wir wollen die Länder finden, die unsere Lieferanten und Kunden gemeinsam haben.

SELECT country
FROM customers
INTERSECT
SELECT country
FROM suppliers

Wir geben die Länderspalte in jeder SELECT Klausel an. Die Ausführung dieser Abfrage ergibt den folgenden Datensatz:

country
France
Ireland

Ein Blick zurück auf die customers und suppliers Tabellen zurück, können wir sehen, dass dieses Ergebnis korrekt ist. Nur die Länder Frankreich und Irland sind in den Tabellen enthalten.

Wenden wir nun den Operator MINUS auf die gleichen Tabellen an. Dadurch erhalten wir die Länder in unserer customers Tabelle, die nicht in unserer suppliers Tabelle sind:

SELECT country
FROM customers
MINUS
SELECT country
FROM suppliers

Das Ausführen dieser Abfrage ergibt das folgende Ergebnis:

country
England
Germany

Da haben wir sie: die Länder, die nur in unserer customers Tabelle. Die Reihenfolge der SELECT Klauseln ist hier sehr wichtig, und das ist etwas, worauf Sie achten müssen, wenn Sie den MINUS Operator verwenden. Lassen Sie uns die Reihenfolge unserer SELECT Klauseln umkehren und sehen, was passiert.

SELECT country
FROM suppliers
EXCEPT
SELECT country
FROM customers

Das Ausführen dieser Abfrage ergibt die folgenden Daten:

country
Italy
Poland
Spain

Wie Sie sehen können, war unsere Ergebnismenge völlig anders. SQL beginnt mit unserer suppliers Tabelle und entfernt dann alle Länder, die in der customers Tabelle.

Wenn Sie sich überfordert fühlen, sollten Sie den SQL-Grundlagen Track von LearnSQL.com ausprobieren, der Ihnen eine solide SQL-Grundlage vermittelt. Hier lernen Sie die grundlegenden SQL-Anweisungen wie WHERE, GROUP BY, ORDER BY und HAVING kennen. Außerdem erfahren Sie, wie Sie JOIN Tabellen erstellen und Daten in einer Datenbank hinzufügen, ändern oder entfernen können.

Dies war ein einfaches Beispiel, das Ihnen zeigt, wie die Operatoren INTERSECT und MINUS verwendet werden können, um schnell bestimmte Datensätze abzurufen. Schauen wir uns einige weitere Beispiele an, die Ihnen zeigen, wie diese Operatoren in drei verschiedenen Szenarien funktionieren:

  • Eine Tabelle ist die Teilmenge der Daten der anderen Tabelle.
  • Beide Tabellen haben die gleichen Daten.
  • Eine Tabelle in Ihrer Abfrage enthält keine Daten.

Weitere SQL INTERSECT und MINUS Beispiele

Eine Tabelle ist eine Teilmenge der Daten der anderen Tabelle

Stellen Sie sich für dieses Szenario vor, wir hätten zwei Tabellen namens employees und planning_committee. Wie Sie sehen können, ist die planning_committee Tabelle eine Teilmenge von employeesd.h. alle Daten sind auch in employees.

employees - Alle in unserem Unternehmen beschäftigten Mitarbeiter.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

planning_committee - Alle Mitarbeiter im Planungsausschuss unseres Unternehmens.

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Schauen wir uns an, wie sich die INTERSECT Klausel in diesem Szenario verhält.

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM planning_committee

Der folgende Datensatz wird zurückgegeben:

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Wie Sie sehen können, wird nur die Teilmenge zurückgegeben. Das liegt daran, dass die planning_committee Tabelle eine Teilmenge der employees Tabelle ist; daher ist das Ergebnis einfach die planning_committee Tabelle.

Was passiert, wenn wir stattdessen die MINUS-Klausel verwenden? Stellen Sie sich vor, Sie möchten alle Mitarbeiter finden, die nicht im Planungsausschuss waren. Dies lässt sich mit der folgenden Abfrage erreichen:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM planning_committee

Die Ausführung dieser Abfrage führt zu folgendem Ergebnis:

employee_idfirst_namelast_name
321873JohnSmith
832923ChristinaGrey

Sie können sehen, dass diese Mitarbeiter nicht in der planning_committee Tabelle sind; dies ist das gewünschte Ergebnis! Auch hier ist die Reihenfolge der Tabellen wichtig. Wenn wir die Reihenfolge der SELECT -Klauseln umkehren würden, würde das so aussehen ...

SELECT employee_id, first_name, last_name
FROM planning_committee
EXCEPT
SELECT employee_id, first_name, last_name
FROM employees

... die Ausführung dieser Abfrage würde ein ganz anderes Ergebnis liefern:

employee_idfirst_namelast_name

Da alle Daten in der Tabelle planning_committee Tabelle enthalten sind, in der employees Tabelle enthalten sind, wird nichts zurückgegeben. SQL MINUS gibt nur eindeutige Daten zurück.

Schauen wir uns unser nächstes Szenario an.

Beide Tabellen haben die gleichen Daten

Es kann eine Situation eintreten, in der zwei SQL-Tabellen identische Daten haben. Wie gehen die Klauseln INTERSECT und MINUS mit dieser Situation um, und welche Ergebnisse sollten Sie erwarten? Finden wir es heraus!

Für dieses Szenario werden wir die folgenden Tabellen verwenden:

payroll - Alle Arbeitnehmer, die derzeit in unserem Unternehmen auf der Gehaltsliste stehen.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

employees - Alle Mitarbeiter unserer Firma.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Sie sehen, dass alle Mitarbeiter unseres Unternehmens derzeit auf der Gehaltsliste stehen und wie vorgesehen bezahlt werden. Dies führt dazu, dass diese Tabellen identische Daten enthalten.

Schauen wir uns an, wie die INTERSECT Klausel diesen Fall behandelt:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM payroll

Die Ausführung dieser Abfrage liefert dieses Ergebnis:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Da alle Daten zwischen den beiden Tabellen ausgetauscht wurden, wird alles zurückgegeben!

Schauen wir uns nun an, wie die MINUS Klausel mit Tabellen umgeht, die identische Daten enthalten:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM payroll

Die Ausführung dieser Abfrage zeigt das folgende Ergebnis:

employee_idfirst_namelast_name

Es werden keine Daten zurückgegeben! SQL beginnt mit der Auswahl der Daten in unserer employees Tabelle und subtrahiert dann die Daten, die in der payroll Tabelle. In diesem Fall wird alles entfernt.

Dies führt zu unserem letzten Szenario. Was passiert, wenn eine der Tabellen, die Teil einer INTERSECT oder MINUS Klausel ist, keine Daten enthält?

Eine Tabelle enthält keine Daten

Für dieses Szenario werden wir die folgenden Tabellen verwenden:

employees - Alle Mitarbeiter, die in unserem Unternehmen beschäftigt sind.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

on_vacation - Alle Mitarbeiter unseres Unternehmens, die derzeit im Urlaub sind.

employee_idfirst_namelast_name

Lassen Sie uns herausfinden, wie die INTERSECT -Klausel mit einer leeren Tabelle umgeht:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM on_vacation

Nach der Ausführung dieser Abfrage erhalten wir das folgende Ergebnis:

employee_idfirst_namelast_name

Keine Ergebnisse! Wenn wir eine leere Tabelle als Teil der INTERSECT Klausel verwenden, erhalten wir einen leeren Datensatz. Dies liegt daran, dass keine Übereinstimmungen zwischen den beiden Tabellen gefunden werden konnten.

Wie die MINUS Klausel durch die Einbeziehung einer leeren Tabelle beeinflusst wird, hängt ganz von der Reihenfolge ab, die Sie angeben. Zum Beispiel ergibt diese Abfrage ...

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM on_vacation

... ergibt das folgende Ergebnis:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Die MINUS -Klausel hat hier nur eine sehr geringe Auswirkung, da Sie im Wesentlichen nichts (einen leeren Datensatz) aus der employees Tabelle.

Wenn wir jedoch die Reihenfolge der SELECT -Klauseln umkehren, etwa so ...

SELECT employee_id, first_name, last_name
FROM on_vacation
MINUS
SELECT employee_id, first_name, last_name
FROM employees

... erhalten wir ein ganz anderes Ergebnis:

employee_idfirst_namelast_name
Smith

Ein weiterer leerer Datensatz! Dies geschieht, weil die erste SELECT Klausel die Daten aus der Tabelle on_vacation Tabelle abruft, was in diesem Fall nichts ist. Dann weisen wir SQL an, die Daten aus dem employees Daten aus unserem leeren Datensatz zu entfernen. Dies hat keine Wirkung, da der Datensatz bereits leer ist!

INTERSECT, MINUS und weitere SQL-Set-Operatoren

In diesem Artikel haben wir SQL INTERSECT und MINUS sehr ausführlich behandelt. Diese sind als SQL-Mengenoperatoren bekannt, zu denen auch UNION und UNION ALL gehören. Eine Einführung in SQL-Mengenoperatoren und wie man Ergebnisse mit Mengenoperatoren weiter verfeinern kann, finden Sie hier.