Per Definition wird ORDER BY nach verarbeitet Gruppierung mit GROUP BY. Per Definition wird jede SELECT-Anweisung konzeptionell wie folgt verarbeitet:
- Berechnen Sie das kartesische Produkt aller Tabellen, auf die in der FROM-Klausel verwiesen wird
- Wenden Sie die Join-Kriterien aus der FROM-Klausel an, um die Ergebnisse zu filtern
- Wenden Sie die Filterkriterien in der WHERE-Klausel an, um die Ergebnisse weiter zu filtern
- Gruppieren Sie die Ergebnisse basierend auf der GROUP BY-Klausel in Teilmengen, fassen Sie die Ergebnisse für jede solche Teilmenge in eine einzelne Zeile zusammen und berechnen Sie die Werte aller Aggregatfunktionen –
SUM()
,MAX()
,AVG()
usw. – für jede solche Teilmenge. Beachten Sie, dass, wenn keine GROUP BY-Klausel angegeben ist, die Ergebnisse so behandelt werden, als gäbe es eine einzelne Teilmenge, und alle Aggregatfunktionen gelten für die gesamte Ergebnismenge, wodurch sie auf eine einzelne Zeile reduziert wird. - Filtern Sie die jetzt gruppierten Ergebnisse basierend auf der HAVING-Klausel.
- Sortieren Sie die Ergebnisse basierend auf der ORDER BY-Klausel.
Die einzigen Spalten, die in der Ergebnismenge eines SELECT mit einer GROUP BY-Klausel erlaubt sind, sind natürlich
- Die Spalten, auf die in der GROUP BY-Klausel verwiesen wird
- Aggregatfunktionen (wie
MAX()
) - Literal/Konstanten
- Ausdrücke, die von einem der oben genannten abgeleitet sind.
Nur fehlerhafte SQL-Implementierungen erlauben Dinge wie select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— die Verweise auf die Spalten a, b und c sind bedeutungslos/undefiniert, da die einzelnen Gruppen auf eine einzige Zeile reduziert wurden,