Zurück zur Artikelliste Artikel
7 Leseminuten

SQL-Reihenfolge der Operationen

SQL ist keine herkömmliche Programmiersprache, in der Sie eine Folge von Anweisungen in einer bestimmten Ausführungsreihenfolge schreiben. Stattdessen ist SQL eine "deklarative" Sprache, d.h. beim Schreiben einer SQL-Abfrage geben Sie an, welche Daten Sie als Ergebnis der Abfrage erwarten, aber Sie geben nicht an, wie Sie sie erhalten.

Sechs Operationen in Reihenfolge: SELECT, FROM, WHERE, GROUP BY, HAVING und ORDER BY

Anhand von Beispielen werden wir die Ausführungsreihenfolge der sechs häufigsten Operationen oder Teile einer SQL-Abfrage erklären. Da die Datenbank die Abfragekomponenten in einer bestimmten Reihenfolge ausführt, ist es für den Entwickler hilfreich, diese Reihenfolge zu kennen. Es ist ähnlich wie bei einem Kochrezept: Sie müssen die Zutaten kennen und wissen, was mit den Zutaten zu tun ist. Aber Sie müssen auch wissen, in welcher Reihenfolge Sie die Aufgaben ausführen. Wenn die Datenbank in einer anderen Reihenfolge arbeitet, kann die Leistung der Abfrage drastisch sinken.

Der beste Weg, die SQL-Operationsreihenfolge zu lernen, ist die Praxis. Ich empfehle den LearnSQL.de's SQL-Praxis Kurs. Er enthält über 600 praktische Übungen, mit denen Sie Ihre SQL-Kenntnisse trainieren können. Oder wählen Sie aus den über 30 interaktiven SQL-Kursen, die wir für verschiedene Leistungsniveaus anbieten, den für Sie besten Kurs aus.

Die Mitarbeiterdatenbank

In diesem Artikel werden wir mit einer Datenbank für ein typisches Unternehmen arbeiten, in dem die Mitarbeiter auf verschiedene Abteilungen verteilt sind. Jeder Mitarbeiter hat eine ID, einen Namen und ein Gehalt und gehört zu einer Abteilung, wie wir in den folgenden Tabellen sehen können.

Beispiel für die EMPLOYEE Tabelle:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Beispiel für die DEPARTMENT Tabelle:

DEPT_NAMEMANAGERBUDGET
ACCOUNTING100300,000
IT 101250,000
SALES 104700,000

In diesem Artikel werden wir auch häufige SQL-Abfragen verwenden, die in einem Unternehmen verwendet werden: "Ermitteln Sie die Namen der Mitarbeiter der IT-Abteilung" oder "Ermitteln Sie die Anzahl der Mitarbeiter in jeder Abteilung mit einem Gehalt von mehr als 80.000". Für jede dieser Abfragen werden wir die Reihenfolge der Ausführung ihrer Komponenten analysieren.

Beginnen wir mit einer einfachen Abfrage, um die Namen der Mitarbeiter der IT-Abteilung zu erhalten:

SELECT LAST_NAME, FIRST_NAME
  FROM EMPLOYEE
 WHERE DEPARTMENT = 'IT'

Zuerst führen wir FROM EMPLOYEEaus, die diese Daten abruft:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Dann führen wir WHERE DEPARTMENT = 'IT' aus, was die Suche auf diese Datensätze eingrenzt:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
101Mary Sexton82,000IT
103AgnesMiller95,000IT

Schließlich wenden wir SELECT FIRST_NAME, LAST_NAME an, was das Endergebnis der Abfrage ergibt:

FIRST_NAMELAST_NAME
Mary Sexton
AgnesMiller

Großartig! Nachdem wir die erste Zerlegung einer Abfrage abgeschlossen haben, können wir feststellen, dass die Reihenfolge der Ausführung für einfache Abfragen mit SELECT, FROM und WHERE ist:

SELECT, FROM und WHERE

Änderungen in der Reihenfolge der Operationen, wenn wir ORDER BY hinzufügen

Angenommen, Ihr Chef erhält einen Bericht, der auf der Abfrage im vorherigen Beispiel basiert, und lehnt ihn ab, weil die Namen der Mitarbeiter nicht in alphabetischer Reihenfolge stehen. Um dies zu beheben, müssen Sie der vorherigen Abfrage eine ORDER BY -Klausel hinzufügen:

  SELECT LAST_NAME, FIRST_NAME
    FROM EMPLOYEE
   WHERE DEPARTMENT = 'IT'
ORDER BY FIRST_NAME

Der Ausführungsprozess dieser Abfrage ist fast derselbe wie im vorherigen Beispiel. Die einzige Änderung findet am Ende statt, wenn die ORDER BY Klausel verarbeitet wird. Das Endergebnis dieser Abfrage ordnet die Einträge nach FIRST_NAME, wie unten gezeigt:

FIRST_NAMELAST_NAME
AgnesMiller
Mary Sexton

Wenn wir also SELECT mit FROM, WHERE und ORDER BY haben, ist die Reihenfolge der Ausführung:

SELECT mit FROM, WHERE und ORDER BY

Hinzufügen von GROUP BY- und HAVING-Klauseln zur Abfrage

In diesem Beispiel werden wir eine Abfrage mit GROUP BY verwenden. Angenommen, wir möchten herausfinden, wie viele Mitarbeiter in jeder Abteilung ein Gehalt von mehr als 80.000 haben, und wir möchten das Ergebnis in absteigender Reihenfolge nach der Anzahl der Personen in jeder Abteilung. Die Abfrage für diese Situation lautet:

  SELECT DEPARTMENT, COUNT(*)
    FROM EMPLOYEES
   WHERE SALARY > 80000
GROUP BY DEPARTMENT
ORDER BY COUNT(*) DESC

Wiederum führen wir zuerst FROM EMPLOYEE aus, wodurch diese Daten abgerufen werden:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Als Zweites führen wir WHERE SALARY > 80000 aus, was die Abfrage auf diese Ergebnismenge eingrenzt:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Drittens wird GROUP BY ausgeführt, wodurch ein Datensatz für jeden eindeutigen Wert in den Spalten GROUP BY erzeugt wird. In unserem Beispiel erstellen wir einen Datensatz für jeden eindeutigen Wert in DEPARTMENT:

DEPARTMENT
ACCOUNTING
IT
SALES

Viertens wenden wir SELECT mit COUNT(*) an, was zu diesem Zwischenergebnis führt:

DEPARTMENTCOUNT(*)
ACCOUNTING1
IT 2
SALES 1

Schließlich wenden wir die Klausel ORDER BY an und erhalten das Endergebnis der Abfrage:

DEPARTMENTCOUNT(*)
IT 2
ACCOUNTING1
SALES 1

Die Reihenfolge der Ausführung in diesem Beispiel ist:

1-VON 2-WO 3-GRUPPIEREN NACH 4-AUSWÄHLEN 5-ORDNEN NACH

In dem nächsten Beispiel fügen wir die Klausel HAVING hinzu. HAVING wird in SQL nicht so häufig verwendet wie die anderen Klauseln, die wir bisher betrachtet haben. Am besten lässt sich HAVING so beschreiben, dass sie wie die WHERE Klausel für GROUP BY ist. Mit anderen Worten, es ist eine Möglichkeit, einige der von GROUP BY erstellten Datensatzgruppen zu filtern oder zu verwerfen.

Nehmen wir nun an, dass wir alle Abteilungen mit einem Durchschnittsgehalt von mehr als 80.000 erhalten möchten, mit Ausnahme der Abteilung SALES. Die Abfrage für diese Situation lautet:

  SELECT DEPARTMENT
    FROM EMPLOYEES
   WHERE DEPARTMENT <> 'SALES'
GROUP BY DEPARTMENT
  HAVING AVG(SALARY) > 80000

Wiederum führen wir zuerst FROM EMPLOYEE aus, was diese Daten abruft:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100 James Smith 78,000 ACCOUNTING
101 Mary Sexton 82,000 IT
102 Chun Yen 80,500 ACCOUNTING
103 Agnes Miller 95,000 IT
104 Dmitry Komer 120,000 SALES

Zweitens wird die WHERE-Klausel verarbeitet, wobei die SALES-Datensätze ausgeschlossen werden:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100 James Smith 78,000 ACCOUNTING
101 Mary Sexton 82,000 IT
102 Chun Yen 80,500 ACCOUNTING
103 Agnes Miller 95,000 IT

Drittens wird GROUP BY angewendet, wodurch die folgenden Datensätze erzeugt werden:

DEPARTMENTAVG(SALARY)
ACCOUNTING 79,250
IT 88,500

Viertens wird HAVING AVG(SALARY) > 80000 angewendet, um die Gruppe der durch GROUP BY erzeugten Datensätze zu filtern:

DEPARTMENTAVG(SALARY)
IT 88,500

Schließlich wird die Klausel SELECT angewandt, was das Endergebnis der Abfrage ergibt:

DEPARTMENT
IT

Die Reihenfolge der Ausführung in diesem Beispiel ist:

1 - VON, 2 - WO, 3 - GRUPPIEREN NACH, 4 - HABEN, 5 - AUSWÄHLEN

Hinzufügen einer neuen Operation: Die JOIN-Klausel

Die vorherigen Beispiele haben sich mit einer Tabelle befasst. Fügen wir nun eine zweite Tabelle hinzu, indem wir die JOIN Klausel verwenden. Angenommen, wir möchten die Nachnamen und Mitarbeiter-IDs von Mitarbeitern erhalten, die für Abteilungen mit einem Budget von mehr als 275.000 arbeiten. Die Abfrage für dieses Beispiel lautet:

SELECT EMPLOYEE_ID, LAST_NAME
  FROM EMPLOYEES
  JOIN DEPARTMENT
    ON DEPARTMENT = DEPT_NAME
 WHERE BUDGET > 275000

Wiederum führen wir zuerst FROM EMPLOYEE aus, das diese Daten abruft:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Zweitens wenden wir die JOIN-Klausel an und erzeugen ein neues Zwischenergebnis, das beide Tabellen kombiniert:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENTDEPT_NAMEMANAGERBUDGET
100James Smith 78,000 ACCOUNTINGACCOUNTING100300,000
101Mary Sexton82,000 IT IT 101250,000
102Chun Yen 80,500 ACCOUNTINGACCOUNTING100300,000
103Agnes Miller95,000 IT IT 101250,000
104DmitryKomer 120,000SALES SALES 104700,000

Drittens wird WHERE BUDGET > 275000 angewendet:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENTDEPT_NAMEMANAGERBUDGET
100James Smith78,000 ACCOUNTINGACCOUNTING100300,000
102Chun Yen 80,500 ACCOUNTINGACCOUNTING100300,000
104DmitryKomer120,000SALES SALES 104700,000

Schließlich wird SELECT EMPLOYEE_ID, LAST_NAME ausgeführt, was das Endergebnis der Abfrage ergibt:

EMPLOYEE_IDLAST_NAME
100Smith
102Yen
104Komer

Die Reihenfolge der Ausführung in diesem Beispiel ist:

1 - VON, 2 - VERBINDEN, 3 - WO, 4 - AUSWÄHLEN

Abschließende Worte

In diesem Artikel haben wir die Ausführungsreihenfolge in SQL-Abfragen anhand von Beispielen behandelt. Aus diesen Beispielen geht hervor, dass es eine Ausführungsreihenfolge gibt, die jedoch je nach den in der Abfrage enthaltenen Klauseln variieren kann. Als allgemeine Richtlinie gilt die Reihenfolge der Ausführung:

1 - FROM, 2 - JOIN, 3 - WHERE, 4 - GROUP BY, 5 - HAVING, 6 - SELECT, 7 - ORDER BY

Wenn jedoch eine dieser Klauseln nicht vorhanden ist, ändert sich die Reihenfolge der Ausführung. SQL ist eine einfache Einstiegssprache, aber wenn Sie erst einmal drin sind, gibt es eine Menge spannender Konzepte zu erforschen. Besuchen Sie diesen Online-Kurs, um in die faszinierende Welt von SQL einzutauchen und zu sehen, wohin sie Sie führen kann!