Ein detaillierter Blick auf SQL JOINs und Set-Operationen
Heute schreibe ich über JOINs, denn warum nicht? Ich fand sie auch etwas verwirrend, als ich sie letzte Woche lernte. Dieser Artikel dient lediglich dazu, sicherzustellen, dass ich sie richtig verstanden habe, und auch als zukünftige Referenz.
In SQL kombiniert eine Join-Operation Zeilen aus zwei oder mehr Tabellen basierend auf einer zugehörigen Spalte zwischen ihnen. Bis letzte Woche hatte ich keine Ahnung, dass es Semi-Joins und Anti-Joins gibt, obwohl ich einige SQL-Kurse besucht habe.
Hier ist eine Aufschlüsselung aller Verknüpfungen, die nach meinem besten Wissen vorhanden sind. Die Joins werden grün dargestellt
- INNER JOIN: Gibt nur die Zeilen zurück, die in beiden Tabellen übereinstimmende Werte haben. Dies ist die am häufigsten verwendete Verknüpfung.
SELECT *
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
CROSS JOIN orders;
Gesamtzahl der Zeilen = Gesamtzahl der Kunden * Gesamtzahl der Bestellungen
Dieser Join-Typ kann zu sehr großen Ergebnismengen führen und sollte daher mit Vorsicht verwendet werden. Meistens reicht INNER, RIGHT oder LEFT JOIN aus.
Semi-Join und Anti-Join
Semi-Join und Anti-Join verwenden eine rechte Tabelle, um zu bestimmen, welche Datensätze in der linken Tabelle gespeichert werden sollen. Mit anderen Worten: Sie verwenden sie ähnlich wie eine WHERE-Klausel abhängig von den Werten einer zweiten Tabelle.
Semi-Joins und Anti-Joins verfügen nicht über dieselbe integrierte SQL-Syntax wie INNER JOIN und LEFT JOIN.
Anti-Join
Ein Anti-Join wählt Datensätze in der ersten Tabelle aus, bei denen in der zweiten Tabelle eine Bedingung NICHT erfüllt ist. Der Anti-Join wählt diejenigen Spalten in der linken Tabelle aus, die nicht der Bedingung in der rechten Tabelle entsprechen.
Anti-Join ist besonders nützlich, um zu ermitteln, welche Datensätze dazu führen, dass in Join-Abfragen eine falsche Anzahl von Datensätzen angezeigt wird. Dies ist sehr nützlich bei der Diagnose von Problemen mit anderen Verknüpfungen, bei denen es zu weniger oder mehr Datensätzen als erwartet kommt.
Als Beispiel verwenden wir zur Veranschaulichung zwei erfundene Tabellen, Kunden und Bestellungen.
SELECT *
FROM orders
WHERE customer_id NOT IN (SELECT customer_id FROM customers WHERE country = 'Kenya');
Semi-Join
Der Semi-Join wählt Datensätze in der ersten Tabelle aus, bei denen in einer zweiten Tabelle eine Bedingung erfüllt ist. Der Semi-Join gleicht Datensätze nach Schlüsselfeld in der rechten Tabelle mit denen in der linken Tabelle ab. Anschließend werden nur die Zeilen in der linken Tabelle ausgewählt, die dieser Bedingung entsprechen.
Wenn Sie Ihre erste Tabelle anhand der für eine zweite Tabelle festgelegten Bedingungen filtern möchten, sollten Sie zur Erfüllung Ihrer Aufgabe einen Semi-Join verwenden. Wenn Sie stattdessen Ihre erste Tabelle basierend auf Bedingungen filtern möchten, die in einer zweiten Tabelle NICHT erfüllt sind, sollten Sie einen Anti-Join verwenden.
SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'Kenya');
Dies sind grundlegende Beispiele für Semi-Join und Anti-Join in SQL. Die spezifische Verwendung und sogar die Syntax können natürlich je nach Kontext und verwendeter Datenbank variieren.
Legen Sie Operationen in SQL fest
In SQL werden Mengenoperationen verwendet, um die Ergebnisse von zwei oder mehr SELECT-Anweisungen in einer einzigen Ergebnismenge zu kombinieren. Im Folgenden werden mehrere davon besprochen.
UNION ist eine Mengenoperation, die die Ergebnisse von zwei oder mehr SELECT-Anweisungen kombiniert. Die Ergebnismenge einer UNION enthält alle Zeilen aus jeder SELECT-Anweisung, wobei doppelte Zeilen entfernt werden.
Die von jeder SELECT-Anweisung zurückgegebenen Spalten müssen dieselben Datentypen haben und in derselben Reihenfolge vorliegen. Dies ist wichtig, da es als einzelnes Feld zurückgegeben wird. Mit anderen Worten: Sie können keine Zahl über ein Zeichenfeld stapeln. Die grundlegende Syntax für eine Union lautet wie folgt:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;
In SQL sind INTERSECT und EXCEPT ebenfalls Mengenoperationen, die UNION ähneln.
INTERSECT gibt nur die Zeilen zurück, die in beiden Ergebnismengen von zwei oder mehr SELECT-Anweisungen vorhanden sind. Die von jeder SELECT-Anweisung zurückgegebenen Spalten müssen dieselben Datentypen haben und in derselben Reihenfolge vorliegen. Die grundlegende Syntax für ein INTERSECT lautet wie folgt:
SELECT column1, column2, ...
FROM table1
INTERSECT
SELECT column1, column2, ...
FROM table2;
SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;
Mit EXCEPT können Sie nur die Datensätze einbeziehen, die sich in einer Tabelle befinden, nicht jedoch in der anderen. EXCEPT ist in der PostgreSQL-Datenbank verfügbar, während MINUS in MySQL und Oracle verfügbar ist.
UNIONkann auch verwendet werden, um alle Vorkommen eines Felds über mehrere Tabellen hinweg zu ermitteln. INTERSECT sucht nach gemeinsamen RECORDS und nicht nach einzelnen Schlüsselfeldern, wie dies bei einem JOIN der Fall ist. Dies ist eine wichtige Unterscheidung.
UNION und UNION ALL bewirken nicht ganz dasselbe wie ein JOIN. Sie binden lediglich Felder in den beiden Tabellen übereinander. INTERSECT funktioniert ähnlich wie UNION und UNION ALL, schließt jedoch nur die Datensätze ein, die beide ausgewählten Tabellen und Felder gemeinsam haben.
UNION ALLextrahiert alle Datensätze aus zwei Tabellen, während INTERSECTnur Datensätze zurückgegeben werden, die beide Tabellen gemeinsam haben. Eine Frage wie: Welche Länder haben auch eine Stadt mit demselben Namen wie ihr Ländername? kann mit INTERSECT beantwortet werden.
Zusammenfassung
- Der Semi-Join wählt Datensätze in der ersten Tabelle aus, bei denen in einer zweiten Tabelle eine Bedingung erfüllt ist.
- Ein Anti-Join wählt Datensätze in der ersten Tabelle aus, bei denen in der zweiten Tabelle eine Bedingung NICHT erfüllt ist.
- UNION berücksichtigt jeden Datensatz in beiden Tabellen, zählt jedoch NICHT die Datensätze in beiden Tabellen doppelt
- UNION ALL repliziert diejenigen, die in beiden Tabellen enthalten sind.
- INTERSECT gibt nur die Datensätze aus, die in beiden Tabellen gefunden wurden.
- EXCEPT gibt nur die Datensätze in einer Tabelle aus, ABER NICHT in der anderen.
Beifall!

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































