Inneres und linkes Äußeres verbinden sich mit Where-Klausel vs. ON-Klausel

Das Filtern der Ergebnisse mit der Klausel [ON] und der Klausel [Where] mit LEFT OUTER JOIN und INNER JOIN ist eine sehr leistungsfähige Technik.

Ein INNER JOIN gibt Zeilen aus, die mit den Werten in gemeinsamen Spalten von zwei oder mehr Tabellen übereinstimmen, wobei ein Operator wie (=) gleich verwendet wird.

EIN LEFT JOIN oder LEFT OUTER JOIN gibt alle Zeilen aus der linken Tabelle mit übereinstimmenden Zeilen aus beiden Tabellen aus. Wenn eine Zeile in der linken Tabelle keine übereinstimmenden Zeilen in der rechten Tabelle enthält, enthält die zugehörige Ergebnissatzzeile Nullwerte für alle Auswahllistenspalten, die aus der rechten Tabelle stammen.

Nun werden wir zeigen, wie diese funktionieren.

Wir erstellen zwei Tabellen: OBST und FRUIT_COLOR.

WENN OBJECT_ID ('FRUIT') NICHT NULL DROP TABLE FRUIT IST; GO CREATE TABLE FRUIT (Name VARCHAR (25), Farbe INT); GO IF OBJECT_ID ('FRUIT_COLOR') IST NICHT NULL DROP TABLE FRUIT_COLOR; GO CREATE TABLE FRUIT_COLOR (id INT, Name VARCHAR (25)); GEHEN


Bezüglich der Struktur der erstellten Tabellen hat die Tabelle FRUIT_COLOR eine eindeutige Spalte (ID) und Farbe (Name).

Die FRUIT-Tabelle besteht aus Frucht (Namen) und ihrer jeweiligen (Farbe).

Ich habe keine Primärschlüssel- und Fremdschlüsselbeziehungen erstellt, um es einfach zu halten, aber Sie können leicht verstehen, dass der Primärschlüssel FRUIT_COLOR (ID) ein Fremdschlüssel für FRUIT (Farbe) ist.

Füllen Sie diese Tabellen mit einigen Daten.

INSERT in FRUIT_COLOR VALUES (1, 'orange'); INSERT in FRUIT_COLOR VALUES (2, 'gelb'); INSERT in FRUIT_COLOR VALUES (3, 'red'); INSERT in FRUIT_COLOR VALUES (4, 'blue'); GO INSERT in FRUCHTWERTE ('Banane', 2); INSERT IN FRUCHTWERTE ('Mango', 2); INSERT in FRUCHTWERTE ('orange', 1); INSERT in FRUCHTWERTE ('Apfel', 3); INSERT in FRUCHTWERTEN ('trauben', null); INSERT in FRUCHTWERTE ('avocado', null); GO SELECT * von FRUIT; SELECT * von FRUIT_COLOR; GEHEN

Wir werden verschiedene Szenarien mit einem Left Outer Join demonstrieren.

Abfrage 1.1 - Eine einfache, einfache äußere Verbindung

SELECT * FROM FRUIT F LINKE äußere Verbindung FRUIT_COLOR FC ON F.color = FC.id; GEHEN


Da wir das Konzept eines LEFT OUTER JOIN kennen, wissen wir, dass alle Zeilen der linken Tabelle angezeigt werden. In diesem Fall ist FRUIT die linke Tabelle. Wenn mit der rechten Tabelle mit dem Namen FRUIT_COLOR eine Übereinstimmung gefunden wird, werden die entsprechenden Zeilen angezeigt. Andernfalls wird NULL zurückgegeben.

Im obigen Beispiel haben Trauben und Avocados die Farbe NULL. Der NULL-Vergleich schlägt daher fehl und gibt NULL zurück.

Abfrage 1.2 - Linke äußere Verknüpfung mit der Where-Klausel

SELECT * FROM FRUIT F LINKE äußere Verbindung FRUIT_COLOR FC ON F.color = FC.id WHERE F.name = 'apple'; GEHEN


Wenn wir eine where-Klausel mit einem Left-Outer-Join hinzufügen, verhält es sich wie ein Inner-Join, bei dem der Filter nach der ON-Klausel angewendet wird. Dabei werden nur die Zeilen angezeigt, die Früchte mit dem Namen "Apfel" haben.

Abfrage 1.3 - Ein Left Outer Join mit der ON-Klausel

SELECT * von FRUIT F LINKS äußerer Join FRUIT_COLOR FC ON F.color = FC.id AND F.name = 'apple'; GEHEN


In der obigen Abfrage werden die meisten Benutzer verwirrt, wie diese Abfrage ausgewertet wird. Sie können die Ergebnisse unter allen Zeilen der linken Tabelle sehen, die in der Ergebnismenge als einfache linke äußere Join-Abfrage enthalten sind, die wir in Query 1.1 gesehen haben. In der zweiten Tabelle (dh fruit_color) werden jedoch nur die Zeilen angezeigt, die die Zeilen enthalten Übereinstimmung mit der Bedingung f.name = 'Apfel'. Ansonsten wird es als NULL angezeigt.

Dies ist nützlich, wenn Sie Daten mit einem Left Outer Join filtern. Die [ON] -Klausel kann nützlich sein, wenn alle Zeilen aus der linken Tabelle und nur die Zeilen aus der rechten Tabelle zurückgegeben werden müssen, die der Bedingung der On-Klausel entsprechen.


- Abfrage 1.4 - Eine innere Verbindung mit der Where-Klausel

SELECT * FROM FRUIT F INNER beitreten FRUIT_COLOR FC ON F.color = FC.id WHERE F.name = 'orange'; GEHEN


- Abfrage 1.5 - Ein Inner Join mit der ON-Klausel

SELECT * FROM FRUIT F INNER beitreten FRUIT_COLOR FC ON F.color = FC.id AND F.name = 'orange'; GEHEN


Sie können sowohl die Abfrage 1.4 als auch die Abfrage 1.5 mit einem inneren Join anzeigen und dasselbe Ergebnis zurückgeben, da es egal ist, wo Sie die Zeilen mit einem inneren Join filtern. Mit der on-Klausel oder der where-Klausel erhalten Sie in beiden Fällen dieselben Ergebnisse.