Text: Reihenfolge Abarbeitung SELECT
Abschlussbedingungen
Wie wird eine Aggregatfunktion in einer WHERE-Klausel in einem SQL-Server verwendet?
Du musst ein HAVING anstelle einer WHERE-Anweisung verwenden.SQL-Abfragen werden in einer anderen Reihenfolge als geschrieben ausgewertet. Aggregate werden nach der WHERE-Klausel ausgewertet, so dass die Aggregatwerte in dem WHERE Teil noch nicht verfügbar sind. Ausnahme ist, wenn sie sich in einer Subquery befinden (was nicht effizient ist).
HAVING-Klauseln, die nach WHERE und GROUP BY ausgewertet werden, können die Aggregate verwenden und funktionieren ähnlich wie WHERE.
Es ist sinnvoll, wenn Du verstehst, wie der SQL-Server die Daten verarbeitet. Der Server kann erst dann einen Aggregatwert erzeugen, wenn er alle Zeilen entdeckt hat, aus denen es das Aggregat generieren soll. Der Zweck von WHERE ist es, Zeilen herauszufiltern, so dass die gefilterten Zeilen nicht in das Gesamtergebnis aufgenommen werden.
Eine Zusammenfassung der Reihenfolge der Ausführung ist wie folgt:
- Die FROM- und JOIN-Klauseln werden ausgeführt. Dadurch werden alle verschiedenen Datenquellen zusammengeführt und einige der Zeilen basierend auf der JOIN-Bedingung eingeschränkt.
- WHERE-Klauseln werden ausgeführt, um Zeilen basierend auf den in jeder Zeile enthaltenen Werten herauszufiltern.
- GROUP BY ist als nächstes erforderlich, wenn Du aggregierte und nicht aggregierte Spalten mischt. Es gruppiert die Ergebnisse nach den nicht aggregierten Werten und gibt nur eine Zeile für jeden eindeutigen Wertesatz zurück. Dies ermöglicht es Dir, für jede einzelne Teilmenge von Daten einen aggregierten Wert anstelle eines einzelnen Aggregats für alle zurückgegebenen Zeilen zu verwenden.
- HAVING. Hier befindet sich die Magie, die du suchst. Es filtert alle Zeilen heraus, die nicht über die gesuchten Aggregate verfügen. Der Vollständigkeit halber sind in den weiteren Schritten die SELECT-Klauseln enthalten. Wenn Du beispielsweise Aliase im SELECT anlegst, sind sie erst nach der Verarbeitung von HAVING verfügbar.
- DISTINCT, um doppelte Zeilen herauszufiltern.
- ORDER BY, Sie können nun Ihre oben definierten Aliase verwenden, die in SELECT erstellt wurden.
- LIMIT und OFFSET, mit denen Du die Anzahl der Zeilen begrenzst und von einem Offset ausgehen können, was nützlich ist, wenn Du durch die Ergebnisse blättern willst.