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:

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 
   )