Dies ist eine sehr gute Frage, deshalb habe ich beschlossen, einen sehr detaillierten Artikel zu diesem Thema in meinem Blog zu schreiben .
Datenbanktabellenmodell
Nehmen wir an, wir haben die folgenden zwei Tabellen in unserer Datenbank, die eine Eins-zu-Viele-Tabellenbeziehung bilden.
Die student
Tabelle ist die übergeordnete und die student_grade
untergeordnete Tabelle, da sie eine Fremdschlüsselspalte student_id enthält, die auf die ID-Primärschlüsselspalte in der Schülertabelle verweist.
Das student table
enthält die folgenden zwei Datensätze:
| id | first_name | last_name | admission_score |
|----|------------|-----------|-----------------|
| 1 | Alice | Smith | 8.95 |
| 2 | Bob | Johnson | 8.75 |
In der student_grade
Tabelle sind die Noten aufgeführt, die die Schüler erhalten haben:
| id | class_name | grade | student_id |
|----|------------|-------|------------|
| 1 | Math | 10 | 1 |
| 2 | Math | 9.5 | 1 |
| 3 | Math | 9.75 | 1 |
| 4 | Science | 9.5 | 1 |
| 5 | Science | 9 | 1 |
| 6 | Science | 9.25 | 1 |
| 7 | Math | 8.5 | 2 |
| 8 | Math | 9.5 | 2 |
| 9 | Math | 9 | 2 |
| 10 | Science | 10 | 2 |
| 11 | Science | 9.4 | 2 |
SQL EXISTIERT
Nehmen wir an, wir möchten alle Schüler erreichen, die im Mathematikunterricht eine Note von 10 erhalten haben.
Wenn wir nur an der Studentenkennung interessiert sind, können wir eine Abfrage wie diese ausführen:
SELECT
student_grade.student_id
FROM
student_grade
WHERE
student_grade.grade = 10 AND
student_grade.class_name = 'Math'
ORDER BY
student_grade.student_id
Die Anwendung ist jedoch daran interessiert, den vollständigen Namen von a anzuzeigen student
, nicht nur den Bezeichner. Daher benötigen wir auch Informationen aus der student
Tabelle.
Um die student
Datensätze mit einer Note von 10 in Mathematik zu filtern , können Sie den EXISTS SQL-Operator wie folgt verwenden:
SELECT
id, first_name, last_name
FROM
student
WHERE EXISTS (
SELECT 1
FROM
student_grade
WHERE
student_grade.student_id = student.id AND
student_grade.grade = 10 AND
student_grade.class_name = 'Math'
)
ORDER BY id
Wenn Sie die obige Abfrage ausführen, sehen Sie, dass nur die Alice-Zeile ausgewählt ist:
| id | first_name | last_name |
|----|------------|-----------|
| 1 | Alice | Smith |
Die äußere Abfrage wählt die student
Zeilenspalten aus, die an den Client zurückgegeben werden sollen. Die WHERE-Klausel verwendet jedoch den EXISTS-Operator mit einer zugehörigen inneren Unterabfrage.
Der EXISTS-Operator gibt true zurück, wenn die Unterabfrage mindestens einen Datensatz zurückgibt, und false, wenn keine Zeile ausgewählt ist. Das Datenbankmodul muss die Unterabfrage nicht vollständig ausführen. Wenn ein einzelner Datensatz übereinstimmt, gibt der EXISTS-Operator true zurück und die zugehörige andere Abfragezeile wird ausgewählt.
Die innere Unterabfrage ist korreliert, da die Spalte student_id der student_grade
Tabelle mit der Spalte id der äußeren Schülertabelle abgeglichen wird.
SQL existiert nicht
Angenommen, wir möchten alle Schüler auswählen, deren Note nicht niedriger als 9 ist. Dazu können wir NOT EXISTS verwenden, wodurch die Logik des EXISTS-Operators negiert wird.
Daher gibt der Operator NOT EXISTS true zurück, wenn die zugrunde liegende Unterabfrage keinen Datensatz zurückgibt. Wenn jedoch ein einzelner Datensatz mit der inneren Unterabfrage übereinstimmt, gibt der Operator NOT EXISTS false zurück und die Ausführung der Unterabfrage kann gestoppt werden.
Um alle Schülerdatensätze, denen kein student_grade zugeordnet ist, mit einem Wert unter 9 abzugleichen, können Sie die folgende SQL-Abfrage ausführen:
SELECT
id, first_name, last_name
FROM
student
WHERE NOT EXISTS (
SELECT 1
FROM
student_grade
WHERE
student_grade.student_id = student.id AND
student_grade.grade < 9
)
ORDER BY id
Wenn Sie die obige Abfrage ausführen, sehen Sie, dass nur der Alice-Datensatz übereinstimmt:
| id | first_name | last_name |
|----|------------|-----------|
| 1 | Alice | Smith |
Der Vorteil der Verwendung der SQL EXISTS- und NOT EXISTS-Operatoren besteht also darin, dass die Ausführung der inneren Unterabfrage gestoppt werden kann, solange ein übereinstimmender Datensatz gefunden wird.