Kurs
SQL Ausführungsreihenfolge: Verstehen, wie Abfragen laufen
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 derSELECT
Klausel ausgeführt. Daher wird ein Fehler ausgelöst, wenn du einen Alias in derWHERE
Klausel verwendest. Um diesen Fehler zu vermeiden, verwende in derWHERE
Klausel immer den Originalausdruck statt eines Alias. -
Verwendung von Spaltenaliasen in der WHERE-Klausel: Da die Klausel
WHERE
vor der KlauselSELECT
ausgeführt wird, führt der Versuch, einen Alias inWHERE
zu verwenden, zu einem Fehler. Wenn du verstehst, dass SQLWHERE
vor derSELECT
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 nachGROUP 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
vorHAVING
oderSELECT
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 dieORDER BY
Klausel nach derSELECT
Klausel ausgewertet. So kannst du Aliase, die du inSELECT
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
vorGROUP BY
undJOIN
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
undJOIN
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
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.
Lerne SQL mit DataCamp
Kurs
Data Manipulation in SQL
Kurs
Reporting in SQL
Der Blog