Zurück zur Artikelliste Artikel
7 Leseminuten

Was sind die verschiedenen Typen von SQL-Unterabfragen?

Unterabfragen können in vielen Geschäftsfällen verwendet werden. Welche Subquery-Typen gibt es in SQL? Und wie kann man sie effizient nutzen? In diesem Artikel führe ich Sie durch verschiedene Subquery-Typen und die typischen Situationen, in denen sie nützlich sind.

Was ist eine SQL-Subabfrage?

Eine Subquery oder verschachtelte Abfrage ist eine Abfrage, die innerhalb einer anderen SQL-Abfrage platziert wird. Es gibt viele verschiedene Szenarien, in denen Sie eine Abfrage in die WHERE-, FROM- oder SELECT-Klauseln Ihrer Hauptabfrage aufnehmen möchten.

Es ist immer einfacher, neue Konzepte zu begreifen, wenn sie anhand von Beispielen vorgestellt werden. Also, fangen wir einfach an! Stellen Sie sich vor, wir betreiben mehrere Kunstgalerien und haben die folgenden Tabellen in unserer Datenbank:

galleries

idcity
1London
2New York
3Munich

paintings

idnamegallery_idprice
1Patterns35000
2Ringer14500
3Gift13200
4Violin Lessons26700
5Curiosity29800

sales_agents

idlast_namefirst_namegallery_idagency_fee
1BrownDenis22250
2WhiteKate33120
3BlackSarah21640
4SmithHelen14500
5StewartTom32130

managers

idgallery_id
12
23
41

Einer der einfachsten Anwendungsfälle für Subqueries ist die Aufnahme in die WHERE-Klausel, um die Ergebnisse zu filtern. Wenn Sie z. B. nur Informationen über die Handelsvertreter anzeigen möchten, die im letzten Monat eine überdurchschnittlich hohe Vermittlungsgebühr erhalten haben, könnten Sie die folgende SQL-Abfrage verwenden:

SELECT *
FROM sales_agents
WHERE agency_fee > 
(SELECT AVG(agency_fee)
 FROM sales_agents);

Hier berechnet Ihre Unterabfrage die durchschnittliche Vermittlungsgebühr, die Ihr Vertriebsteam im letzten Monat erhalten hat, und gibt einen einzigen Wert zurück (2728 $). Anschließend verwenden Sie diesen Wert, um die Ergebnisse Ihrer Hauptabfrage zu filtern und nur die Informationen für diejenigen Vermittler zurückzugeben, deren Vermittlungsgebühr über dem Durchschnitt lag:

idlast_namefirst_namegallery_idagency_fee
2WhiteKate33120
4SmithHelen14500

SQL-Unterabfragen können einzelne Werte oder ganze Tabellen zurückgeben. Es kann verschachtelte Unterabfragen oder korrelierte Unterabfragen geben. Jeder dieser Subquery-Typen eignet sich für bestimmte Anwendungsfälle. Wenn Sie genauere Informationen dazu wünschen, lesen Sie unseren Leitfaden für Einsteiger zu SQL-Unterabfragen. In diesem Artikel werde ich Beispiele für verschiedene Subquery-Typen in SQL geben und Sie durch die typischen Szenarien führen, in denen diese Art von Subquery besonders praktisch ist.

Skalare Unterabfragen

Wenn eine Subquery einen einzigen Wert oder genau eine Zeile und genau eine Spalte zurückgibt, nennt man sie eine skalare Subquery. Diese Art von Unterabfrage wird häufig in der WHERE-Klausel verwendet, um die Ergebnisse der Hauptabfrage zu filtern. Die Unterabfrage in unserem vorherigen Beispiel ist eine skalare Unterabfrage, da sie einen einzigen Wert zurückgibt (d. h. die durchschnittliche Agenturgebühr).

Skalare Unterabfragen können auch in der SELECT-Anweisung der Hauptabfrage verwendet werden. Nehmen wir zum Beispiel an, wir möchten den Durchschnittspreis aller unserer Gemälde neben dem Preis jedes einzelnen Gemäldes sehen.

SELECT name AS painting,
	 price,
	 (SELECT AVG(price)
  FROM paintings) AS avg_price
FROM paintings;

Die Unterabfrage gibt hier einen Einzelwert (5840 $) zurück, der einfach zu jeder Zeile der resultierenden Tabelle hinzugefügt wird:

paintingpriceavg_price
Patterns50005840
Ringer45005840
Gift32005840
Violin Lessons67005840
Curiosity98005840

Beachten Sie, dass die Unterabfrage (auch innere Abfrage genannt) in diesem Beispiel völlig unabhängig von der Hauptabfrage (auch äußere Abfrage genannt) ist - Sie können die innere Abfrage allein ausführen und erhalten ein aussagekräftiges Ergebnis.

Mehrzeilige Unterabfragen

Wenn Ihre Unterabfrage mehr als eine Zeile zurückgibt, kann sie als mehrzeilige Unterabfrage bezeichnet werden. Beachten Sie, dass dieser Subquery-Typ (1) Subqueries, die eine Spalte mit mehreren Zeilen zurückgeben (d. h. eine Liste von Werten) und (2) Subqueries, die mehrere Spalten mit mehreren Zeilen zurückgeben (d. h. Tabellen), umfasst.

Unterabfragen, die eine Spalte und mehrere Zeilen zurückgeben, werden oft in die WHERE-Klausel aufgenommen, um die Ergebnisse der Hauptabfrage zu filtern. In diesem Fall werden sie normalerweise mit Operatoren wie IN, NOT IN, ANY, ALL, EXISTS oder NOT EXISTS verwendet, die es dem Benutzer ermöglichen, einen bestimmten Wert mit den Werten in der von der Unterabfrage zurückgegebenen Liste zu vergleichen.

Möchten Sie mehr über SQL-Unterabfragen mit dem IN-Operator erfahren? Sehen Sie sich eine Episode unserer We Learn SQL-Serie auf Youtube an. Vergessen Sie nicht, unseren Kanal zu abonnieren.

Nehmen wir an, Sie möchten die durchschnittliche Vermittlungsgebühr für die Vertreter berechnen, die keine Manager sind. Sie können die folgende Unterabfrage verwenden, um diese Frage zu beantworten:

SELECT AVG(agency_fee)
FROM sales_agents
WHERE id NOT IN (SELECT id
                 FROM managers);

Die innere Abfrage gibt eine Liste mit allen Manager-IDs zurück. Die äußere Abfrage filtert dann nur die Vermittler heraus, die nicht in der Managerliste enthalten sind, und berechnet die durchschnittliche Vermittlungsgebühr für diese Vermittler. Die Abfrage gibt einen einzigen Wert zurück - die durchschnittliche Vermittlungsgebühr, die an Nicht-Manager gezahlt wird (1885 $).

In unserem SQL-Leitfaden für Unterabfragen finden Sie weitere Beispiele für Unterabfragen mit mehreren Zeilen.

Korrelierte Unterabfragen

Es gibt auch SQL-Unterabfragen, bei denen sich die innere Abfrage auf Informationen stützt, die von der äußeren Abfrage stammen. Dies sind korrelierte Unterabfragen. Aufgrund der gegenseitigen Abhängigkeit zwischen der Hauptabfrage und der inneren Abfrage kann diese Art von Unterabfrage schwieriger zu verstehen sein. Lesen Sie diesen anfängerfreundlichen Leitfaden, um mehr über korrelierte Unterabfragen in SQL zu erfahren.

Noch einmal: Kommen wir direkt zu den Beispielen! Korrelierte Unterabfragen werden häufig in den SELECT-, WHERE- und FROM-Anweisungen verwendet.

Wenn wir die Anzahl der in jeder unserer Galerien gefundenen Gemälde berechnen wollen, können wir die folgende Abfrage verwenden. Beachten Sie die korrelierte Unterabfrage in der SELECT-Anweisung:

SELECT city, 
 (SELECT count(*)
  FROM paintings p
  WHERE g.id = p.gallery_id) total_paintings
FROM galleries g;

Hier gibt die Unterabfrage einen Einzelwert mit der Gesamtzahl der Gemälde in der entsprechenden Galerie zurück. Die Hauptabfrage zeigt diese Information zusammen mit der Stadt an, in der sich die Kunstgalerie befindet.

citytotal_paintings
London2
New York2
Munich1

Sie können auch sehen, dass im Gegensatz zu unseren vorherigen Beispielen hier die innere Abfrage von der äußeren Abfrage abhängt. Wir beziehen die Galerie-ID aus der Tabelle galleries Tabelle, die sich in der äußeren Abfrage befindet. Mit anderen Worten: Sie können die innere Abfrage nicht als unabhängige Abfrage ausführen - sie würde nur einen Fehler auslösen.

Beachten Sie auch, dass Sie in diesem Fall JOIN anstelle einer Unterabfrage verwenden könnten, um das gleiche Ergebnis zu erhalten:

SELECT g.city, count(p.name) AS total_paintings
FROM galleries g
JOIN paintings p
ON g.id = p.gallery_id
GROUP BY g.city;

JOINs sind in der Regel schneller als Unterabfragen. Wenn Sie jedoch Unterabfragen für Ihren speziellen Fall intuitiver finden, können Sie sie ruhig verwenden. Weitere Informationen zur Verwendung von Unterabfragen und JOINs finden Sie in unserem umfassenden Leitfaden.

Schließlich können korrelierte Unterabfragen auch in der WHERE-Anweisung verwendet werden. Nehmen wir zum Beispiel an, wir möchten Informationen über diejenigen Handelsvertreter erhalten, deren Vermittlungsgebühr gleich oder höher als die durchschnittliche Gebühr für ihre Galerie war. Wir können die folgende Abfrage ausführen, um das gewünschte Ergebnis zu erhalten:

SELECT last_name, 
       first_name, 
       agency_fee
FROM sales_agents sa1
WHERE sa1.agency_fee >= (SELECT avg(agency_fee)
                         FROM sales_agents sa2 
                         WHERE sa2.gallery_id = sa1.gallery_id);

Die innere Abfrage gibt in diesem Fall die durchschnittliche Vermittlungsgebühr für die Galerie des jeweiligen Vermittlers zurück. Die äußere Abfrage gibt nur die Informationen über diejenigen Vermittler zurück, die die in der WHERE-Anweisung enthaltene Bedingung erfüllen (d. h. eine Vermittlungsgebühr, die gleich oder größer ist als der Durchschnitt ihrer Galerie).

last_namefirst_nameagency_fee
BrownDenis2250
WhiteKate3120
SmithHelen4500

Auch in diesem Beispiel ist die Unterabfrage eine korrelierte Unterabfrage, da sie nicht unabhängig von der äußeren Abfrage ausgeführt werden kann. Wenn Sie mehr darüber erfahren möchten, sehen Sie sich diesen leicht verständlichen Lehrgang zum Schreiben von korrelierten Unterabfragen an.

Auch wenn die verschiedenen SQL-Subquery-Typen viele typische Situationen abdecken, gibt es einige Fälle, in denen Sie Common Table Expressions (CTEs) anstelle von Subqueries verwenden sollten. Wenn Sie mehr über CTEs erfahren möchten, lesen Sie diesen Artikel, der Sie durch die Unterschiede zwischen Unterabfragen und CTEs führt.

Zeit zum Üben verschiedener SQL-Subquery-Typen!

Sie haben gelernt, dass es viele Arten von Unterabfragen in SQL gibt. Je nach Aufgabe können Sie skalare, mehrzeilige oder korrelierte Unterabfragen verwenden, um das gewünschte Ergebnis zu erhalten.

Wir haben bereits einige Beispiele für Unterabfragen durchgespielt und herausgefunden, wo Sie sie einsetzen können. Um jedoch ein wirklich leistungsfähiger SQL-Benutzer zu werden, brauchen Sie mehr Übung im Umgang mit verschiedenen Subquery-Typen. Es ist Zeit für interaktive Übungen!

Unser SQL für Anfänger Kurs hat einen umfassenden Abschnitt über Unterabfragen, in dem detaillierte Erklärungen und Beispiele mit Dutzenden von Übungen kombiniert werden. Probieren Sie es aus! Um zusätzliche Übung zu bekommen, empfehle ich auch den Abschnitt über Unterabfragen in der SQL-Übungssatz.

Mehr Übung = mehr professionelle SQL-Abfragen! Viel Spaß beim Lernen!