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.
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; Bereitgestellt von
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;Bereitgestellt von
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;Bereitgestellt von
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 >3000GROUPBY department;Bereitgestellt von
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 >3000GROUPBY department
HAVINGAVG(salary)>5000;Bereitgestellt von
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 >3000GROUPBY department
HAVINGAVG(salary)>5000;Bereitgestellt von
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.
SELECTDISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary >3000GROUPBY department
HAVINGAVG(salary)>5000;Bereitgestellt von
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.
SELECTDISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary >3000GROUPBY department
HAVINGAVG(salary)>5000;ORDERBY bonus DESC;Bereitgestellt von
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.
SELECTDISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary >3000GROUPBY department
HAVINGAVG(salary)>5000ORDERBY bonus DESCLIMIT10OFFSET5-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; --SQL SERVER / ORACLEBereitgestellt von
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.9AS discounted_price
FROM products
WHERE discounted_price >100;Bereitgestellt von
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.9AS discounted_price
FROM products
HAVING discounted_price >100;Bereitgestellt von
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.
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.
Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Gewinne Vertrauen in die OLS-Regression, indem du ihre theoretischen Grundlagen beherrschst. Erforsche, wie du einfache Implementierungen in Excel, R und Python durchführst.
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Lerne effiziente Methoden, um ein Wörterbuch in Python nach Werten zu sortieren. Lerne, wie du Sachen aufsteigend oder absteigend sortieren kannst, und hol dir ein paar coole Tipps zum Sortieren von Schlüsseln.
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 databasedieSELECTzuerst ausgewertet wird, aber in Wirklichkeit beginnt die Reihenfolge der Ausführung mit derFROMKlausel.Hier ist die Reihenfolge der SQL-Ausführung. Im nächsten Abschnitt gehen wir die Schritte im Detail durch.
In der folgenden Abfrage habe ich Kommentare hinzugefügt, um zu zeigen, welche zuerst ausgewertet werden.
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
SELECTbeginnen, beginnt die logische Reihenfolge der Ausführung mit der KlauselFROM. 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
FROMKlausel. Dies ist normalerweise der erste Schritt, da die Datenbank die Datenquellen/Tabellen identifiziert. Wenn mehrere Tabellen beteiligt sind, wertet die SQL-Abfrage auch die BedingungJOINaus, um die als Datenquelle angegebenen Tabellen zu kombinieren.Die folgende unvollständige Abfrage würde zunächst Daten aus der Tabelle
customersmit der KlauselFROMund aus der Tabelleordersmit der KlauselJOINauswählen.WHERE-Klausel
Die Klausel
WHEREwird nach den KlauselnFROMundJOINausgeführt, um die Zeilen nach bestimmten Bedingungen zu filtern. Es ist wichtig zu beachten, dass Spalten, die mit Aliasen in derSELECTKlausel definiert wurden, nicht direkt in derWHEREKlausel referenziert werden können, da diese vor derSELECTKlausel verarbeitet wird.Die folgende Abfrage verwendet die
WHEREKlausel, um Datensätze von Mitarbeitern mit einerbonusgrößer als 5000 zu filtern.Da
bonusin der AnweisungSELECTein Alias ist, führt die Verwendung in der KlauselWHEREzu einem Fehler. Stattdessen musst du den vollständigen Ausdrucksalary * 0.1in derWHEREKlausel wiederholen.GROUP BY-Klausel
Nachdem die Zeilen gefiltert wurden, führt SQL die
GROUP BYKlausel aus, um die Ergebnisse anhand der angegebenen Spalten zu gruppieren. Dieser Schritt wird normalerweise mit Aggregatfunktionen wieCOUNT(),SUM()undAVG()verwendet, um einige Berechnungen mit den angegebenen Spalten durchzuführen.Die folgende Abfrage filtert zunächst die Arbeitnehmer heraus, deren
salarygrößer als3,000ist, gruppiert sie dann nachdepartmentund berechnet das Durchschnittsgehalt für jede Gruppe.HAVING-Klausel
Die
HAVINGKlausel ähnelt derWHEREKlausel, wird aber verwendet, um gruppierte Daten nach derGROUP BYOperation zu filtern. In der folgenden Abfrage gruppiert SQLemployeesnachdepartment, berechnet das Durchschnittsgehalt für jede Gruppe und filtert dann die Gruppen heraus, in denen das Durchschnittsgehalt kleiner oder gleich5,000ist.Die obige Abfrage kann die
WHEREKlausel nicht verwenden, da sie bei aggregierten Ergebnissen nicht funktioniert.SELECT-Klausel
In der
SELECTKlausel 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 derSELECTKlausel anwenden.Die folgende Abfrage verwendet die
SELECTKlausel, um die alssalary * 0.1berechnetennameundbonusaus der Tabelleemployeesabzurufen.DISTINCT-Klausel
Die
DISTINCTKlausel wird nach der SELECT-Klausel in einer Abfrage ausgewertet. DieDISTINCTKlausel ist wichtig, um doppelte Datensätze aus einer Tabelle zu entfernen, da sie eindeutige Zeilen liefert. Die folgende Abfrage gibt jede einzelnedepartment_idzurück und filtert Duplikate heraus.ORDER BY-Klausel
Die
ORDER BYKlausel sortiert die Ergebnismenge bestimmter Spalten oder Ausdrücke aus. Im Gegensatz zurWHEREKlausel kann dieORDER BYKlausel Spaltenaliase verwenden, die in derSELECTAnweisung definiert wurden.Die folgende Abfrage sortiert die Spalte
bonusin absteigender Reihenfolge. Beachte, dass diebonusin derSELECTAnweisung als Alias eines Ausdrucks definiert wurde.LIMIT/OFFSET-Klausel
Die Klauseln
LIMITundOFFSETwerden normalerweise als letztes in einer SQL-Abfrage ausgeführt, um die Anzahl der zurückzugebenden Zeilen zu begrenzen. DieLIMITKlausel gibt die maximale Anzahl der zurückzugebenden Zeilen an undOFFSETgibt 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
salaryin absteigender Reihenfolge und beschränkt die Ausgabe auf 10 Ergebnisse, wobei die ersten 5 Zeilen übersprungen werden.Die Klauseln
LIMITundOFFSETwerden in MySQL- und PostgreSQL-Datenbanken unterstützt. Für SQL Server und Oracle verwendest duOFFSET,ROWS FETCHundROWS 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
OFFSETundLIMIT.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
SELECTKlausel erstellt hast:Auf den ersten Blick sieht das logisch aus, aber es wird einen Fehler auslösen. Und warum? Denn die
WHEREKlausel wird in der Ausführungsreihenfolge von SQL vor derSELECTKlausel ausgewertet. Um dies zu beheben, musst du stattdessen eine Subquery oderHAVINGverwenden:Um mehr über
WHEREundHAVINGzu 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
WHEREKlausel wird vor derSELECTKlausel ausgeführt. Daher wird ein Fehler ausgelöst, wenn du einen Alias in derWHEREKlausel verwendest. Um diesen Fehler zu vermeiden, verwende in derWHEREKlausel immer den Originalausdruck statt eines Alias.Verwendung von Spaltenaliasen in der WHERE-Klausel: Da die Klausel
WHEREvor der KlauselSELECTausgeführt wird, führt der Versuch, einen Alias inWHEREzu verwenden, zu einem Fehler. Wenn du verstehst, dass SQLWHEREvor derSELECTKlausel 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
HAVINGKlausel wird nachGROUP BYausgefü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 BYvorHAVINGoderSELECTausgefü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
WHEREKlausel wird dieORDER BYKlausel nach derSELECTKlausel ausgewertet. So kannst du Aliase, die du inSELECTerstellt 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
WHEREvorGROUP BYundJOINausgefü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
FROMundJOINdie 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 BYKlausel 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
SELECTKlausel 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.