23rd Jun 2022 9 Leseminuten Was bewirken die SQL-Klauseln INTERSECT und MINUS? Andrew Bone SQL-Mengenoperatoren Inhaltsverzeichnis SQL INTERSECT SQL-MINUS MINUS vs. INTERSECT: Beispiele Weitere SQL INTERSECT und MINUS Beispiele Eine Tabelle ist eine Teilmenge der Daten der anderen Tabelle Beide Tabellen haben die gleichen Daten Eine Tabelle enthält keine Daten INTERSECT, MINUS und weitere SQL-Set-Operatoren 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: 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: 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. Tags: SQL-Mengenoperatoren