Zurück zur Artikelliste Artikel
5 Leseminuten

Lernen Sie in 5 Minuten, wie man eine SQL Correlated Subquery schreibt

Wenn Sie mit der berühmten russischen Verschachtelungspuppe vertraut sind, dann sollten SQL korrelierte Subqueries ein Kinderspiel sein - Subqueries sind einfach Abfragen, die in Abfragen verschachtelt sind. Eine SQL-Unterabfrage wird oft als "innere" Abfrage bezeichnet; die Hauptabfrage wird gewöhnlich als "äußere" Abfrage bezeichnet. In diesem Artikel erfahren Sie alles, was Sie über Correlated Subqueries wissen müssen.

Was genau ist eine korrelierte SQL-Subabfrage?

Eine korrelierte SQL-Unterabfrage ist einfach eine Unterabfrage, die viele Male ausgeführt wird - einmal für jeden Datensatz (Zeile), der von der äußeren (Haupt-)Abfrage zurückgegeben wird. Mit anderen Worten: Die äußere Abfrage gibt eine Tabelle mit mehreren Zeilen zurück; die innere Abfrage wird dann einmal für jede dieser Zeilen ausgeführt. Wenn Ihre äußere Abfrage 10 Zeilen zurückgibt, wird die innere Abfrage 10 Mal ausgeführt. Und wenn Ihre äußere Abfrage 100 Zeilen zurückgibt, wird die innere Abfrage 100 Mal ausgeführt.

Wann sollten Sie eine SQL Correlated Subquery verwenden?

Einige Datenfragen können nur mit korrelierten Unterabfragen beantwortet werden. Dies gilt insbesondere für negative Datenfragen.

Negative Datenabfragen entstehen, wenn wir nach Datensätzen suchen, die eine bestimmte Bedingung nicht erfüllen. Ein Beispiel für eine einfache negative Datenfrage ist: "Ermitteln Sie die Namen aller Filme , die nicht von Steven Spielberg produziert wurden."

In diesem Artikel werden wir ein Beispiel für eine negative Datenfrage lösen. Bevor wir das tun, sollten wir uns zunächst die beteiligten Tabellen ansehen. Wir haben zwei Tabellen: die employee Tabelle und die payment_history Tabelle. Die zweite Tabelle hat eine Spalte mit dem Namen payment_type, die angibt, ob eine Zahlung Teil eines regulären Gehalts, eines Bonus oder einer Prämie ist. Schauen wir uns einige Beispieldaten aus den Tabellen an, die wir verwenden werden:

employee

employee_id payment_type amount_paid payment_date
100 salary 2000.00 2018-Mar-02
101 salary 1800.00 2018-Mar-02
102 salary 1900.00 2018-Mar-02
101 award 500.00 2018-Mar-08
102 adjustment 124.70 2018-Mar-10

payment_history

employee_id payment_type amount_paid payment_date
100 salary 2000.00 2018-Mar-02
101 salary 1800.00 2018-Mar-02
102 salary 1900.00 2018-Mar-02
101 award 500.00 2018-Mar-08
102 adjustment 124.70 2018-Mar-10

Hier ist die negative Datenfrage, die wir gerne beantworten würden:

"Ermitteln Sie die Namen der Mitarbeiter, die nie eine Auszeichnung erhalten haben"

Die SQL-Abfrage, die die vorherige Frage beantwortet, ist die folgende:

SELECT last_name, first_name
FROM    employee e1
WHERE NOT EXISTS (SELECT ph.last_name 
                                      FROM payment_history ph 
                                      WHERE ph.employee_id = e1.employee_id 
                                      AND ph.payment_type = 'award')

SQL-Korrelierte Unterabfragen im Vergleich zu einfachen Unterabfragen

Der Hauptunterschied zwischen einer SQL Correlated Subquery und einer einfachen Subquery besteht darin, dass eine SQL Correlated Subquery auf Spalten aus der Tabelle der äußeren Abfrage verweist.

Im obigen Beispiel, ph.employee_id = e1.employee_id ein Verweis auf die Tabelle der äußeren Unterabfrage (e1). Um eine korrelierte Unterabfrage zu identifizieren, suchen Sie einfach nach dieser Art von Verweisen. Wenn Sie mindestens eine finden, haben Sie eine korrelierte Unterabfrage!

Der negative Teil einer Datenfrage wird in einer SQL-Correlated-Subquery oft durch Verwendung des NOT EXISTS -Operators in der WHERE -Klausel gelöst. EXISTS ist ein Operator, dem immer eine Subquery folgt. Wenn die Unterabfrage mindestens einen Datensatz zurückgibt, wird EXISTS zu TRUE ausgewertet. Wenn die Unterabfrage eine leere Menge zurückgibt, wird EXISTS zu FALSE ausgewertet. Beachten Sie, dass wir NOT EXISTS verwenden, was einfach das Gegenteil von EXISTS ist.

Das Ergebnis der vorherigen Abfrage ist:

first_name last_name
John Smith
Alice Johnson

Ein weiteres Beispiel für eine korrelierte Unterabfrage

In diesem Beispiel versuchen wir, die Namen aller Mitarbeiter zu ermitteln, die im März 2018 ein höheres Gehalt als ihr durchschnittliches Monatsgehalt für alle vorangegangenen Monate verdienten, indem wir eine korrelierte SQL-Subquery verwenden. Hier ist die Abfrage, die wir ausführen werden:

SELECT    first_name, last_name 
FROM       employee e1, payment_history ph
WHERE    e1.employee_id = ph.employee_id 
     AND     amount_paid > = (
                               SELECT AVG(amount_paid) FROM payment_history ph2
                               WHERE ph2.employee_id = e1.employee_id
                                     AND ph2.payment_date  < '01/03/2018'
                                     AND ph2.payment_type = 'salary' 
                               )
     AND    month(ph.payment_date) =3 
     AND    year(ph.payment_date) = 2018 
     AND    ph.payment_type ='salary'

Genug der Negativität. Was ist mit positiven Datenfragen?

Müssen wir eine SQL korrelierte Unterabfrage verwenden, um eine positive Datenfrage zu beantworten? Nein, das müssen Sie nicht. Sie können es aber trotzdem tun, wenn Sie es möchten. Für positive Fragen können wir normalerweise einfach eine JOIN Bedingung oder eine Beziehung zwischen zwei Tabellen verwenden.

Ändern wir unsere vorherige Frage in eine positive Frage und lösen sie mit einer JOIN statt einer korrelierten Unterabfrage. Die Frage lautet nun: "Ermitteln Sie die Namen der Mitarbeiter, die Prämienzahlungen erhalten haben." Und die SQL-Abfrage (ohne korrelierte Unterabfragen), die diese Frage beantwortet, lautet:

SELECT    first_name, last_name 
FROM       employee e1 
                 JOIN payment_history ph ON  ph.employee_id = e1.employee_id 
WHERE    ph.payment_type =award'

Das Ergebnis ist:

first_name last_name
Kate Miller

Warnung: Ihre SQL Correlated Subquery wird wahrscheinlich langsam sein

Ich möchte nur erwähnen, dass wir versuchen, SQL Correlated Subqueries möglichst nicht übermäßig zu verwenden. Erinnern Sie sich daran, dass eine korrelierte Unterabfrage für jeden von der äußeren Abfrage zurückgegebenen Datensatz einmal ausgeführt wird. Wenn die äußere Abfrage Tausende von Datensätzen zurückgibt, können Sie sich vorstellen, wie schnell die Leistung Ihrer Abfrage sinkt. Im Allgemeinen sollten Sie eine SQL Correlated Subquery nur dann verwenden, wenn es absolut notwendig ist.

Probieren Sie eine SQL Correlated Subquery selbst aus!

Wir haben gesehen, dass korrelierte Unterabfragen ein wichtiger Bestandteil der SQL-Sprache sind und uns bei der Beantwortung verschiedener Datenfragen helfen können, insbesondere bei negativen Fragen. Wir haben auch erklärt, wie man eine korrelierte SQL-Subquery erkennt und warum man aus Leistungsgründen korrelierte Subqueries nach Möglichkeit vermeiden sollte.

Um Ihre Kenntnisse über Unterabfragen zu verbessern, besuchen Sie den Kurs LearnSQL.de' SQL für Anfänger . Wir haben einen speziellen Abschnitt, der sich mit Unterabfragen befasst, mit vielen praktischen Übungen und Beispielen für korrelierte Unterabfragen, um Ihnen zu helfen, den Inhalt zu beherrschen.