Direkt zum Inhalt

SQL Ausführungsreihenfolge: Verstehen, wie Abfragen laufen

Verstehe die Ausführungsreihenfolge von SQL und wie sie sich von der Reihenfolge beim Schreiben unterscheidet. Schreibe genaue und optimierte Abfragen für eine bessere Leistung und vermeide häufige Fehler bei der Abfragegestaltung.
Aktualisierte 10. Okt. 2024  · 5 Min. Lesezeit

Wenn wir SQL-Abfragen schreiben, folgen wir normalerweise einer bestimmten Reihenfolge. (SQL wird ja bekanntlich von innen nach außen geschrieben). Allerdings folgen die SQL-Engines beim Kompilieren von Abfragen einer bestimmten Ausführungsreihenfolge, die sich von der typischen Reihenfolge beim Schreiben unterscheidet. Das Verständnis der SQL-Ausführungsreihenfolge ist wichtig, um die Abfrageoptimierung zu beherrschen, die Abfragegenauigkeit und -leistung zu verbessern und komplexe Probleme zu beheben, wie du noch sehen wirst.

Für den Anfang empfehle ich den DataCamp-Kurs "Einführung in SQL" und den Skill-Track "SQL-Grundlagen ", um die Grundlagen von SQL zu lernen und zu erfahren, wie man mit Abfragen Daten extrahiert. Das Spickzettel für SQL-Grundlagen ist ein hilfreicher Leitfaden für gängige SQL-Funktionen zum Filtern und Aggregieren von Daten.

Was ist die SQL-Ausführungsreihenfolge?

Die SQL-Ausführungsreihenfolge bezieht sich auf die Reihenfolge, in der die verschiedenen Klauseln der Abfrage ausgewertet werden. Es lohnt sich, das zu verstehen, denn die Ausführungsreihenfolge unterscheidet sich normalerweise davon, wie wir die SQL-Abfragen schreiben. Um das einfachste Beispiel zu nehmen, könntest du denken, dass im Fall von SELECT * FROM database die SELECT zuerst ausgewertet wird, aber in Wirklichkeit beginnt die Reihenfolge der Ausführung mit der FROM Klausel.

Hier ist die Reihenfolge der SQL-Ausführung. Im nächsten Abschnitt gehen wir die Schritte im Detail durch. 

  • FROM/JOIN: Legt die Tabellen fest, aus denen Daten abgerufen werden sollen.
  • WHERE: Filtert die Zeilen, die die Bedingung erfüllen, bevor sie gruppiert werden.
  • GROUP BY: Gruppiert Zeilen, die eine Eigenschaft gemeinsam haben.
  • HAVING: Filtert Gruppen anhand von Bedingungen, die nach der Gruppierung angewendet werden.
  • SELECT: Gibt die Spalten an, die abgerufen oder berechnet werden sollen.
  • DISTINCT: Entfernt doppelte Zeilen aus der Ergebnismenge.
  • ORDER BY: Sortiert die Ergebnismenge nach den angegebenen Spalten.
  • LIMIT: Gibt die maximale Anzahl der Zeilen an, die zurückgegeben werden sollen.
  • OFFSET: Gibt an, wie viele Zeilen übersprungen werden sollen, bevor mit der Rückgabe von Zeilen begonnen wird.

In der folgenden Abfrage habe ich Kommentare hinzugefügt, um zu zeigen, welche zuerst ausgewertet werden. 

-- #6+7   SELECT DISTINCT department_id                                 
-- #1     FROM employees                                                
-- #2     JOIN orders ON customers.customer_id = orders.customer_id     
-- #3     WHERE salary > 3000                                          
-- #4     GROUP BY department 
-- #5     HAVING AVG(salary) > 5000 
-- #8     ORDER BY department 
-- #9     LIMIT 10 OFFSET 5 
-- #10    OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; 

Ich habe auch ein Akrostichon erstellt, das helfen könnte: Für Arbeitszieleund Hürden suchedie organisierten Lernmöglichkeitenvon DataCamp.

Phasen der SQL-Query-Ausführung

Obwohl die meisten SQL-Abfragen, die wir schreiben, mit der Anweisung SELECT beginnen, beginnt die logische Reihenfolge der Ausführung mit der Klausel FROM. Hier werde ich Abfragen schreiben, um die Ausführungsreihenfolge der Abfrage zu zeigen. Beachte aber, dass diese Abfragen unvollständig sind und nicht kompiliert werden können.

FROM-Klausel

SQL-Abfragen beginnen den Ausführungsprozess mit der FROM Klausel. Dies ist normalerweise der erste Schritt, da die Datenbank die Datenquellen/Tabellen identifiziert. Wenn mehrere Tabellen beteiligt sind, wertet die SQL-Abfrage auch die Bedingung JOIN aus, um die als Datenquelle angegebenen Tabellen zu kombinieren.

Die folgende unvollständige Abfrage würde zunächst Daten aus der Tabelle customers mit der Klausel FROM und aus der Tabelle orders mit der Klausel JOIN auswählen.

FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;

WHERE-Klausel

Die Klausel WHERE wird nach den Klauseln FROM und JOIN ausgeführt, um die Zeilen nach bestimmten Bedingungen zu filtern. Es ist wichtig zu beachten, dass Spalten, die mit Aliasen in der SELECT Klausel definiert wurden, nicht direkt in der WHERE Klausel referenziert werden können, da diese vor der SELECT Klausel verarbeitet wird. 

Die folgende Abfrage verwendet die WHERE Klausel, um Datensätze von Mitarbeitern mit einer bonus größer als 5000 zu filtern.

FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary * 0.1 > 5000;

Da bonus in der Anweisung SELECT ein Alias ist, führt die Verwendung in der Klausel WHERE zu einem Fehler. Stattdessen musst du den vollständigen Ausdruck salary * 0.1 in der WHERE Klausel wiederholen.

GROUP BY-Klausel

Nachdem die Zeilen gefiltert wurden, führt SQL die GROUP BY Klausel aus, um die Ergebnisse anhand der angegebenen Spalten zu gruppieren. Dieser Schritt wird normalerweise mit Aggregatfunktionen wie COUNT(), SUM() und AVG() verwendet, um einige Berechnungen mit den angegebenen Spalten durchzuführen.

Die folgende Abfrage filtert zunächst die Arbeitnehmer heraus, deren salary größer als 3,000 ist, gruppiert sie dann nach department und berechnet das Durchschnittsgehalt für jede Gruppe.

FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department;

HAVING-Klausel

Die HAVING Klausel ähnelt der WHERE Klausel, wird aber verwendet, um gruppierte Daten nach der GROUP BY Operation zu filtern. In der folgenden Abfrage gruppiert SQL employees nach department, berechnet das Durchschnittsgehalt für jede Gruppe und filtert dann die Gruppen heraus, in denen das Durchschnittsgehalt kleiner oder gleich 5,000 ist. 

FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;

Die obige Abfrage kann die WHERE Klausel nicht verwenden, da sie bei aggregierten Ergebnissen nicht funktioniert.

SELECT-Klausel

In der SELECT Klausel leitet SQL die Spalten oder Ausdrücke ab, die nach Ausführung der vorangegangenen Schritte zurückgegeben werden sollen. Du kannst arithmetische Operationen, Aliasing und Aggregatfunktionen in der SELECT Klausel anwenden.

Die folgende Abfrage verwendet die SELECT Klausel, um die als salary * 0.1 berechneten name und bonus aus der Tabelle employees abzurufen.

SELECT department, AVG(salary)
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;

DISTINCT-Klausel

Die DISTINCT Klausel wird nach der SELECT-Klausel in einer Abfrage ausgewertet. Die DISTINCT Klausel ist wichtig, um doppelte Datensätze aus einer Tabelle zu entfernen, da sie eindeutige Zeilen liefert. Die folgende Abfrage gibt jede einzelne department_id zurück und filtert Duplikate heraus.

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;

ORDER BY-Klausel

Die ORDER BY Klausel sortiert die Ergebnismenge bestimmter Spalten oder Ausdrücke aus. Im Gegensatz zur WHERE Klausel kann die ORDER BY Klausel Spaltenaliase verwenden, die in der SELECT Anweisung definiert wurden.

Die folgende Abfrage sortiert die Spalte bonus in absteigender Reihenfolge. Beachte, dass die bonus in der SELECT Anweisung als Alias eines Ausdrucks definiert wurde.

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
ORDER BY bonus DESC;

LIMIT/OFFSET-Klausel

Die Klauseln LIMIT und OFFSET werden normalerweise als letztes in einer SQL-Abfrage ausgeführt, um die Anzahl der zurückzugebenden Zeilen zu begrenzen. Die LIMIT Klausel gibt die maximale Anzahl der zurückzugebenden Zeilen an und OFFSET gibt an, wie viele Zeilen übersprungen werden sollen, bevor mit der Rückgabe von Zeilen begonnen wird.

Die folgende Abfrage ruft die Namen und Gehälter der Mitarbeiter ab, sortiert sie nach salary in absteigender Reihenfolge und beschränkt die Ausgabe auf 10 Ergebnisse, wobei die ersten 5 Zeilen übersprungen werden.

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC
LIMIT 10 OFFSET 5
-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; --SQL SERVER / ORACLE

Die Klauseln LIMIT und OFFSET werden in MySQL- und PostgreSQL-Datenbanken unterstützt. Für SQL Server und Oracle verwendest du OFFSET, ROWS FETCH und ROWS ONLY, um die Anzahl der Zeilen einzuschränken, die von einer Abfrage zurückgegeben werden sollen.

In unserem Tutorial über die Verwendung von SQL OFFSET erfährst du mehr über die Paginierung von Daten und die datenbankspezifische Unterstützung der Klauseln OFFSET und LIMIT.

SQL-Ausführungsreihenfolge vs. Reihenfolge des Schreibens

SQL ist eine deklarative Sprache, was bedeutet, dass die Reihenfolge der Abfrageausführung von der geschriebenen Reihenfolge abweicht. Anstatt also festzulegen, wie eine Aufgabe ausgeführt werden soll, gibst du an, was du willst, und die Datenbank-Engine entscheidet, wie du es am besten erreichen kannst. Diese Methode unterscheidet sich von imperativen Programmiersprachen wie Python oder Java, bei denen du explizit Schritt-für-Schritt-Anweisungen zur Ausführung schreibst. 

Das Verständnis der SQL-Ausführungsreihenfolge verändert die Art und Weise, wie du über die Konstruktion von Abfragen denkst. Stell dir zum Beispiel vor, du schreibst eine Abfrage, um Zeilen nach einem Alias zu filtern, den du in der SELECT Klausel erstellt hast:

SELECT price * 0.9 AS discounted_price
FROM products
WHERE discounted_price > 100;

Auf den ersten Blick sieht das logisch aus, aber es wird einen Fehler auslösen. Und warum? Denn die WHERE Klausel wird in der Ausführungsreihenfolge von SQL vor der SELECT Klausel ausgewertet. Um dies zu beheben, musst du stattdessen eine Subquery oder HAVING verwenden:

SELECT price * 0.9 AS discounted_price
FROM products
HAVING discounted_price > 100;

Um mehr über WHERE und HAVING zu erfahren, lies unser Tutorial: Der Unterschied zwischen WHERE und HAVING in SQL.

Häufige Fehler und bewährte Praktiken

Obwohl die Reihenfolge der Abfrageausführung nicht von der Reihenfolge des Schreibens beeinflusst wird, ist es wichtig, den Ausführungsfluss zu verstehen, um häufige Fehler zu vermeiden und die Abfrageleistung zu verbessern. Die folgenden Fehler hängen direkt damit zusammen, dass du die Ausführungsreihenfolge von SQL falsch verstanden hast:

Häufige Fehler

Im Folgenden sind die häufigsten Fehler aufgeführt, die die Leistung deiner Abfrage beeinträchtigen können.

  • Verwendung von Spaltenaliasen in der WHERE-Klausel: Die WHERE Klausel wird vor der SELECT Klausel ausgeführt. Daher wird ein Fehler ausgelöst, wenn du einen Alias in der WHERE Klausel verwendest. Um diesen Fehler zu vermeiden, verwende in der WHERE Klausel immer den Originalausdruck statt eines Alias.

  • Verwendung von Spaltenaliasen in der WHERE-Klausel: Da die Klausel WHERE vor der Klausel SELECT ausgeführt wird, führt der Versuch, einen Alias in WHERE zu verwenden, zu einem Fehler. Wenn du verstehst, dass SQL WHERE vor der SELECT Klausel auswertet, lernst du, dass du den vollständigen Ausdruck wiederholen musst, anstatt dich auf einen Alias zu verlassen.

  • HAVING für die Zeilenfilterung anstelle von WHERE verwenden: Die HAVING Klausel wird nach GROUP BY ausgeführt und ist für das Filtern von aggregierten Daten gedacht. Wenn du nicht-aggregierte Daten filterst, gehört das in die WHERE-Klausel. Wenn du den Unterschied in der Ausführungsreihenfolge zwischen WHERE und HAVING kennst, kannst du bestimmen, wo jede Bedingung platziert werden soll.

  • Falsche Verwendung von Aggregaten in SELECT ohne GROUP BY: Da GROUP BY vor HAVING oder SELECT ausgeführt wird, kann es zu falschen Ergebnissen oder Fehlern kommen, wenn du deine Daten nicht gruppierst, bevor du eine Aggregatfunktion anwendest. Das Verständnis der Ausführungsreihenfolge macht deutlich, warum diese beiden Klauseln zusammengehören müssen.

  • Nicht ordnungsgemäße Verwendung von Aliasen in der ORDER BY-Klausel: Anders als die WHERE Klausel wird die ORDER BY Klausel nach der SELECT Klausel ausgewertet. So kannst du Aliase, die du in SELECT erstellt hast, für die Sortierung verwenden und Verwirrung vermeiden, indem du weißt, wann Aliase zur Verwendung bereitstehen.

Bewährte Praktiken

Beachte die folgenden Best Practices, um sicherzustellen, dass deine Abfragen wie erwartet ausgeführt werden.

  • Frühes Filtern mit WHERE: Da die Klausel WHERE vor GROUP BY und JOIN ausgeführt wird, reduziert die frühzeitige Anwendung von Filtern die Anzahl der Zeilen, die von den nachfolgenden Klauseln verarbeitet werden, was die Abfrageleistung verbessert. Indem du nicht aggregierte Daten so früh wie möglich filterst, beschränkst du die Daten, die gruppiert oder verknüpft werden müssen, und sparst so Bearbeitungszeit.

  • Pre-Aggregate Data Before Joins: Da FROM und JOIN die ersten Klauseln sind, die ausgeführt werden, kannst du durch Voraggregieren der Daten mithilfe von Unterabfragen oder gemeinsamen Tabellenausdrücken (CTEs) den Datensatz vor dem Join-Prozess verkleinern. Dadurch wird sichergestellt, dass beim Join weniger Zeilen verarbeitet werden.

  • Optimiere ORDER BY mit Indizes: Da die ORDER BY Klausel einer der letzten Ausführungsschritte ist, wird die Abfrageleistung durch die Indizierung der sortierten Spalten beschleunigt, da die Datenbank Sortiervorgänge effizienter verarbeiten kann.

  • Vermeide SELECT * in Produktionsabfragen: Die SELECT Klausel wird nach dem Filtern, Gruppieren und Aggregieren ausgeführt. Wenn du also nur die benötigten Spalten angibst, wird die Menge der abgerufenen Daten minimiert und unnötiger Overhead vermieden.

Fazit

Das Verständnis der SQL-Ausführungsreihenfolge ist wichtig, um effiziente, genaue und optimierte Abfragen zu schreiben. Wir haben die logische Reihenfolge der Abfrageausführung in SQL besprochen und sie mit der schriftlichen Reihenfolge verglichen. Ich empfehle dir, verschiedene Abfragen zu schreiben, um die logische Ausführungsreihenfolge besser zu verstehen. Die Beherrschung dieses Konzepts wird deine Fähigkeit, Fehler zu beheben und SQL-Abfragen zu optimieren, erheblich verbessern.

Wenn du deine SQL-Kenntnisse erweitern möchtest, empfehle ich dir, den DataCamp-Karrierepfad Associate Data Analyst in SQL auszuprobieren, um ein kompetenter Datenanalyst zu werden. Der Kurs Reporting in SQL hilft dir außerdem, komplexe Berichte und Dashboards für eine effektive Datenpräsentation zu erstellen. Schließlich solltest du die SQL Associate-Zertifizierung erwerben, um zu zeigen, dass du SQL zur Lösung von Geschäftsproblemen beherrschst und dich von anderen Fachleuten abhebst.

Werde Dateningenieur

Baue Python-Kenntnisse auf, um ein professioneller Dateningenieur zu werden.
Jetzt kostenlos loslegen

Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Ich verfasse Artikel, die Datenwissenschaft und Analytik vereinfachen und leicht verständlich und zugänglich machen.

FAQs zur SQL-Ausführungsreihenfolge

Wie unterscheidet sich die SQL-Ausführung von der schriftlichen Bestellung?

Die SQL-Ausführungsreihenfolge beginnt in der Regel mit der Klausel FROM, gefolgt von Klauseln wie WHERE und GROUP BY, während die Schreibreihenfolge mit der Anweisung SELECT beginnt.

Wie fügt sich JOIN in die Reihenfolge der Ausführung ein?

Die JOIN Operationen werden als Teil der FROM Klausel ausgeführt.

Kann ich Spaltenalias in der WHERE-Klausel verwenden?

Nein, Spaltenaliase werden in der SELECT Klausel definiert, die nach der WHERE Klausel ausgeführt wird.

Was ist der Unterschied zwischen WHERE und HAVING?

WHERE filtert Zeilen vor der Gruppierung, während HAVING nach GROUP BY filtert und mit aggregierten Daten arbeitet.

Beeinflusst die Reihenfolge der SQL-Ausführung die Abfrageleistung?

Ja, wenn du die Ausführungsreihenfolge verstehst, kannst du Abfragen optimieren, indem du frühzeitig Filter anwendest und unnötige Operationen reduzierst.

Themen

Lerne SQL mit DataCamp

Kurs

Introduction to SQL

2 hr
838.8K
Learn how to create and query relational databases using SQL in just two hours.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Die 32 besten AWS-Interview-Fragen und Antworten für 2024

Ein kompletter Leitfaden zur Erkundung der grundlegenden, mittleren und fortgeschrittenen AWS-Interview-Fragen, zusammen mit Fragen, die auf realen Situationen basieren. Es deckt alle Bereiche ab und sorgt so für eine abgerundete Vorbereitungsstrategie.
Zoumana Keita 's photo

Zoumana Keita

30 Min.

See MoreSee More