Verschachtelte Abfragen in SQL
Mit der SQL-Sprache können Sie eine Abfrage in einer anderen Abfrage verschachteln. Dadurch ist es möglich, eine sehr große Abfrage zu schreiben, die etwas Großes und Komplexes ausführt, obwohl die Lesbarkeit des Codes stark eingeschränkt ist.
Abhängig davon, wie viele Werte von Unterabfragen zurückgegeben werden, ändert sich der Bereich, in dem sie angewendet werden können. Insgesamt gibt es drei Möglichkeiten:
- Die Unterabfrage gibt einen einzelnen Wert zurück (eine Spalte und eine Zeile).
- Die Unterabfrage gibt eine Liste von Werten zurück (eine Tabelle mit einer Spalte).
- Die Unterabfrage gibt eine Tabelle zurück (viele Spalten, beliebig viele Zeilen).
Schauen wir uns jeweils ein Beispiel an.
Unterabfrage mit Skalarergebnis
Lassen Sie uns eine Liste aller unserer Mitarbeiter aus der Mitarbeitertabelle finden, deren Gehalt über dem Durchschnitt des Unternehmens liegt. Wie können wir das machen?
Wir können Mitarbeiter leicht filtern, indem wir ihr Gehalt mit dem Durchschnitt vergleichen, wenn wir es im Voraus kennen. Gleichzeitig haben wir bereits eine Abfrage geschrieben, mit der wir das Durchschnittsgehalt der Mitarbeiter des Unternehmens berechnen können. Erinnern wir uns daran:
SELECT AVG(salary) FROM employee
Dann hat uns MySQL den Wert zurückgegeben: 76833.3333 .
Wie finde ich nun eine Liste aller Mitarbeiter, deren Gehalt über dem Durchschnitt liegt? Es ist auch ganz einfach:
SELECT * FROM employee
WHERE salary > 76833.3333
Das Ergebnis dieser Abfrage wird sein:
Ausweis | Name | Beruf | Gehalt |
---|---|---|---|
1 | Iwanow Iwan | Programmierer | 100000 |
2 | Petrov Petr | Programmierer | 80000 |
4 | Rabinovich Moisha | Direktor | 200000 |
Und jetzt kombinieren wir einfach beide Anfragen, indem wir die erste Anfrage anstelle des Wertes 76833 ersetzen:
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee)
Das Ergebnis dieser Abfrage ist dasselbe:
Ausweis | Name | Beruf | Gehalt |
---|---|---|---|
1 | Iwanow Iwan | Programmierer | 100000 |
2 | Petrov Petr | Programmierer | 80000 |
4 | Rabinovich Moisha | Direktor | 200000 |
Unterabfrage mit Werteliste
Erinnern Sie sich, dass wir einmal die Aufgabe hatten, alle Datensätze aus einer Tabelle zu finden, für die es keine entsprechenden Datensätze aus einer anderen Tabelle gibt?
Es gab auch dieses Bild:
![](https://cdn.codegym.cc/images/article/a0eff64c-0bb4-4480-833e-c1305cd03a5e/512.jpeg)
Wenn ich mich nicht irre, lautet die Aufgabe wie folgt: Eine Liste aller Mitarbeiter aus der Mitarbeitertabelle anzeigen, für die in der Aufgabentabelle keine Aufgaben vorhanden sind .
Lassen Sie uns auch in zwei Schritten eine Lösung finden.
Schreiben wir zunächst eine Abfrage, die die ID aller Mitarbeiter zurückgibt, die Aufgaben in der Aufgabentabelle haben. Denken Sie nur an zwei Dinge:
- Duplikate entfernen – verwenden Sie das Schlüsselwort DISTINCT.
- Entfernen Sie NULL-Werte aus dem Ergebnis.
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
Und hier haben wir ein wunderschönes Ergebnis einer solchen Anfrage erhalten:
Angestellten ID |
---|
1 |
2 |
5 |
4 |
6 |
Der Einfachheit halber schreiben wir es vorübergehend als Sequenz auf: 1,2,5,4,6. Schreiben wir nun eine zweite Abfrage – an die Mitarbeitertabelle, die eine Liste der Mitarbeiter zurückgibt, deren ID nicht in der ersten Liste enthalten ist:
SELECT * FROM employee
WHERE id NOT IN (1,2,5,4,6)
Und das Ergebnis dieser Abfrage:
Ausweis | Name | Beruf | Gehalt | Alter | Beitrittsdatum |
---|---|---|---|---|---|
3 | Iwanow Sergej | Prüfer | 40000 | dreißig | 01.01.2014 |
Und jetzt können Sie, wie im vorherigen Beispiel, beide Anfragen kombinieren, indem Sie einfach den Hauptteil der ersten Anfrage anstelle der ID-Liste ersetzen.
SELECT * FROM employee
WHERE id NOT IN (
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
)