Zurück zur Artikelliste Artikel
8 Leseminuten

Wie man SQL-Unterabfragen übt

Haben Sie sich jemals gefragt, was Anfänger von fortgeschrittenen SQL-Benutzern unterscheidet? Dazu gehören Dinge wie zum Beispiel Unterabfragen. In diesem Artikel erkläre ich ihre Bedeutung und warum Sie SQL-Subqueries üben müssen, um ein Experte zu werden.

Was ist eine SQL-Unterabfrage?

SQL ist eine leicht zu erlernende Sprache. Es gibt jedoch einige komplexe Funktionen und Techniken der Sprache, die geübt werden müssen. Eines dieser Merkmale ist die Subquery, die der Sprache und Ihren Projekten eine große Ausdruckskraft verleiht.

In diesem Artikel stellen wir Beispiele vor, mit denen Sie den ersten Schritt zum Üben von Subqueries machen können. Wir erwähnen auch Artikel und Kurse, in denen Sie weiteres Material wie Vorlesungen und Übungen finden, um die Verwendung von Subqueries weiter zu verbessern.

Wenn Sie nicht wissen, wovon ich spreche, beginnen Sie mit dem SQL für Anfänger Kurs. Er ist der perfekte Ausgangspunkt für das Erlernen von SQL. Wenn Sie bereits ein wenig über das Thema wissen, aber nicht wissen, wie Sie Unterabfragen üben können, lesen Sie weiter.

Einfach ausgedrückt, ist eine Subquery eine Abfrage innerhalb einer Abfrage. SQL erlaubt es uns, Unterabfragen in verschiedene Teile einer SQL-Abfrage einzufügen, wie z. B. in die WHERE- und FROM-Klauseln und andere. Das Erstellen einer Unterabfrage ist sehr einfach, da ihre Struktur die gleiche ist wie die einer normalen Abfrage. Wir müssen nur einige Regeln kennen, wie die Abfrage und die Subquery miteinander verbunden werden.

Bevor wir mit den Beispielen beginnen, sollten wir einige Begriffe klären: Im weiteren Verlauf dieses Artikels bezeichnen wir die externe Abfrage, in der sich eine Subquery befindet, als "äußere Abfrage".

Lassen Sie uns eine einfache Datenbank mit zwei Tabellen vorstellen: employee und department.

Tabelle employee

employee_idlast_namefirst_namesalarydepartment_id
1001SmithJohn145000.00100
1002BelleMary115000.00101
1003DalePeter155000.00102
1004GarrahanSusan195000.00100
1005GarrahanMary94000.00102
1006FiesJulia92000.00101

Tabelle department

department_iddept_namemanager_idbudgetbuilding
100Sales23240000.00CentralPark
101Accounting56130000.00CentralPark
102IT34150000.00Oblivious

Angenommen, wir möchten den Namen der Abteilung mit dem größten Budget ermitteln. Wir können die folgende Abfrage schreiben, die eine Unterabfrage (in blau) enthält:

SELECT dept_name, budget
FROM   department
WHERE budget = ( SELECT MAX(budget) FROM department )

Wir haben eine Unterabfrage (in blau) in der WHERE Klausel, die das größte Budget der department Tabelle zurückgibt. Dann verwenden wir diesen Wert in der WHERE-Klausel der äußeren Abfrage zum Vergleich mit der Budgetspalte. Alle Datensätze in der department Tabelle mit einem Budget, das dem Maximalwert des Budgets entspricht, werden zurückgegeben.

Beachten Sie, dass die Unterabfrage in Klammern eingeschlossen ist. In SQL müssen Unterabfragen immer in Klammern eingeschlossen werden.

Anhand dieses Beispiels haben wir gesehen, wie leicht und einfach es ist, eine Unterabfrage zu erstellen. Es gibt jedoch einige Regeln, wie die Unterabfrage mit der äußeren Abfrage zu verbinden ist. Wir müssen auch wissen, wo eine Subquery innerhalb der Anweisung SELECT stehen soll. Es gibt verschiedene Klauseln (wie WHERE, FROM und HAVING) in der äußeren Abfrage, in die wir eine Subquery einfügen können. Dies sind einige der Gründe, warum die Übung mit Subqueries so wichtig ist.

Abschließend empfehle ich denjenigen, die nach Ressourcen zum Üben ihrer SQL-Kenntnisse suchen, den Kurs SQL-Übungssatz. Hier finden Sie mehr als 80 interaktive Übungen, die von einfachen Aufgaben mit SELECT FROM Anweisungen bis hin zu fortgeschrittenen Problemen mit mehreren Unterabfragen reichen. Eine weitere interessante Reihe von SQL-Übungen finden Sie in den monatlichen SQL-Übungssatzs, wo Sie Ihren SQL-Code in Aktion sehen und sofortiges Feedback erhalten.

Ein weiteres SQL-Subquery-Beispiel

Wir haben eine Subquery gesehen, die eine Ergebnismenge mit einem einzigen Datensatz und einer einzigen Spalte zurückgibt. Diese Art von Subquery ist recht häufig, und es ist einfach, die Subquery mit der äußeren Abfrage zu integrieren oder zu verbinden, indem man den Operator equal (=) verwendet.

Sehen wir uns nun eine Unterabfrage an, die eine einzige Spalte, aber mehrere Datensätze zurückgibt, um sie mit einer Unterabfrage zu vergleichen, die einen einzigen Datensatz liefert.

Angenommen, wir benötigen die Mitarbeiter-IDs und die Namen der Mitarbeiter, die im CentralPark-Gebäude arbeiten. Wir können eine SQL-Abfrage wie die folgende schreiben. Auch hier ist die Unterabfrage in Blau.

SELECT employee_id, last_name, first_name
FROM   employee
WHERE department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

Das erste, was auffällt, ist die Anzahl der Datensätze, die von der Unterabfrage zurückgegeben werden. Sie gibt zwei Datensätze zurück, weil es im CentralPark-Gebäude zwei Abteilungen gibt: Verkauf und Buchhaltung. Die Unterabfrage erzeugt also eine Ergebnismenge mit zwei Abteilungs-IDs, 100 und 101.

Die zweite Sache, die zu beachten ist, ist der IN-Operator, der in der WHERE -Klausel der äußeren Abfrage verwendet wird. Wenn eine Unterabfrage mehrere Zeilen zurückgibt, können wir nicht den Gleichheitsoperator (=) wie im ersten Beispiel verwenden. Stattdessen verwenden wir den IN-Operator, der wie der Operator "gehört zu" funktioniert. Mit anderen Worten, die Bedingung:

department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

gibt TRUE zurück, wenn der Wert von department_id in der Ergebnismenge der Unterabfrage vorhanden ist, und FALSE, wenn der Wert von department_id nicht in der Ergebnismenge der Unterabfrage enthalten ist.

Versuchen Sie immer, im Voraus zu bestimmen, wie viele Datensätze Ihre Unterabfrage zurückgibt. Handelt es sich um eine Multi-Datensatz-Unterabfrage oder um eine Einzel-Datensatz-Unterabfrage? Überlegen Sie auf dieser Grundlage, wie Sie sie mit der äußeren Abfrage verbinden können. Wenn Sie mehr über Multi-Record- und Single-Record-Subqueries erfahren möchten, empfehle ich Ihnen die Artikel "Anleitung für Anfänger zur SQL-Subquery" und "Was sind die verschiedenen Typen von SQL-Unterabfragen?"

Für diejenigen, die sich eingehender mit Unterabfragen befassen möchten, ist ein weiterer interessanter Artikel "Unterabfrage vs. JOIN" interessant, in dem Sie verschiedene Möglichkeiten zur Erstellung gleichwertiger SQL-Abfragen mit Hilfe von Joins und Unterabfragen kennenlernen.

Verwendung von SQL-Unterabfragen in anderen Teilen der Abfrage

Wir haben Beispiele für Unterabfragen in der WHERE-Klausel der Anweisung SELECT gezeigt. In diesem Abschnitt zeigen wir Unterabfragen in anderen Klauseln.

In der FROM Klausel geben wir normalerweise die Tabelle an, die in der Abfrage gelesen werden soll. Wir können jedoch eine Unterabfrage in die FROM -Klausel einfügen, um eine Art Zwischenergebnismenge zu erstellen. Danach kann diese Ergebnismenge von der äußeren Abfrage wie eine virtuelle Tabelle verwendet werden.

Sehen wir uns ein Beispiel an. Angenommen, es gibt Abteilungen, in denen das Gesamtgehalt aller Mitarbeiter das Abteilungsbudget übersteigt. Um diese Fälle zu erkennen, wollen wir das Budget und den Gesamtbetrag der von jeder Abteilung gezahlten Gehälter ermitteln. Außerdem fügen wir dem Bericht einen mathematischen Ausdruck hinzu, um den nicht verwendeten Teil des Budgets zu ermitteln. Schauen wir uns die Abfrage an:

SELECT 	d1.dept_name,
d1.budget,
total.total_salaries,
d1.budget - total.total_salaries AS budget_after_salaries
FROM		( SELECT department_id, SUM(salary) AS total_salaries
		  FROM employee
		 GROUP BY department_id
		) AS total
INNER JOIN    department d1 ON d1.department_id = total.department_id

Die blaue Unterabfrage in der FROM Klausel erstellt eine Zwischentabelle namens total mit den Spalten department_id und total_salaries. Danach führen wir eine JOIN zwischen der Zwischentabelle total und der regulären Tabelle department. In der Liste der Spalten in SELECT berechnen wir die Differenz zwischen dem Abteilungsbudget und dem Gesamtbetrag der Gehälter. Wir nennen diesen Wert budget_after_salaries. Schauen wir uns das Ergebnis der Abfrage an:

dept_namebudgettotal_salariesbudget_after_salaries
Sales240000340000-100000
Accounting28000020700073000
IT2490002500001000

Wir können auch Unterabfragen in andere Klauseln der Anweisung SELECT einfügen, wie die Klausel HAVING, die zum Filtern von Datensatzgruppen verwendet wird. Angenommen, wir möchten die Abteilungen anzeigen, deren Gesamtgehalt größer ist als der Durchschnitt der Abteilungsgesamtbeträge. Wir erhalten den Durchschnitt der Abteilungsgesamtbeträge mit einer Unterabfrage. Schauen wir uns die Abfrage an:

SELECT 	d1.dept_name,
SUM(salary)
FROM		employee e
INNER JOIN  department d1 ON d1.department_id = e.department_id
GROUP BY  d1.dept_name
HAVING SUM(salary) > (
SELECT SUM(salary)/COUNT(distinct department_id)
FROM   employee
   )

Wir erhalten den Gesamtbetrag der Gehälter in jeder Abteilung mit dem Ausdruck SUM(salary). Dann vergleichen wir in der Klausel HAVING diesen Betrag mit der durchschnittlichen Summe der Abteilungen, die wir mit der Unterabfrage erhalten haben. Die Abteilungen, deren SUM(salary) größer ist als das Ergebnis der Unterabfrage, werden im Ergebnis der Abfrage angezeigt, wie wir unten sehen:

dept_nametotal_salaries
Sales340000

Für diejenigen, die wissen wollen, wo die Subquery in SQL unterstützt wird, erklären die nächsten beiden Artikel andere Stellen, an denen Subqueries platziert werden können. Der Artikel "Subquery vs. CTE: A SQL Primer" erklärt CTEs, und im Artikel "Wie man Unterabfragen in INSERT-, UPDATE- und DELETE-Anweisungen verwendet," lernen Sie, wie der Titel schon sagt, SQL-Subqueries in anderen Anweisungen wie INSERT, UPDATE und DELETE.

Üben Sie SQL-Subabfragen, um Ihre Fähigkeiten zu verbessern

Wir haben mehrere SQL-Subqueries in verschiedenen Klauseln gesehen. SQL-Subqueries werden in der Regel in einer SELECT -Anweisung verwendet; es ist jedoch möglich, sie in anderen Anweisungen zu verwenden. Es gibt auch andere Arten von SQL-Subqueries, wie z. B. korrelierte Subqueries und CTEs, die der SQL-Sprache noch mehr Ausdruckskraft verleihen.

SQL ist einfach und intuitiv zu erlernen, vor allem in den ersten Schritten. Aber wie bei jeder anderen Sprache müssen Sie üben, um das Niveau zu erreichen, auf dem Sie alle Arten von Abfragen und Berichten verwalten und erstellen können. Je mehr Zeit Sie mit dem Lösen von Problemen in der SQL-Sprache verbringen, desto mehr SQL-Kenntnisse erwerben Sie.

Abschließend möchte ich Ihnen einige großartige Ressourcen zum Erlernen von SQL vorstellen. Erstens finden Sie hier einige Artikel, die sich auf das Üben von SQL konzentrieren: "Wie viel SQL-Praxis brauchen Sie, um ein Profi zu werden?" und "Warum ist SQL-Übungssatz mein Lieblings-Online-Kurs?" In beiden Artikeln finden Sie viele Vorschläge und Tipps zum Üben von SQL, um das SQL-Master-Niveau zu erreichen. Zweitens finden Sie unter LearnSQL.de in der monatlichen SQL-Praxis im Jahr 2022 verschiedene Möglichkeiten, SQL zu üben. Zu guter Letzt beschreibt der Artikel "5 Tipps von einem erfahrenen SQL-Datenanalysten", wie man Datenanalyst wird, ein Beruf, der solide SQL-Kenntnisse erfordert.

Erweitern Sie Ihre Fähigkeiten und investieren Sie in sich selbst!