SELECT
In ISO / IEC-Standard schreibt SQL die folgende syntaktische Reihenfolge für die Unterklauseln vor:
SELECT
projection-expressions
FROM
sources
WHERE
predicate-expression
GROUP BY
key-expression
HAVING
predicate-expression
ORDER BY
ordering-expressions
Während die logische Ausführungsreihenfolge wie folgt lautet:
FROM
sources
WHERE
predicate-expression
GROUP BY
value-expression
HAVING
value-expression
SELECT
projection-expressions
ORDER BY
ordering-expressions
Um unerfahrenen Anwender von SQL wird es überraschend , dass ein Vorsprung in der definierten SELECT
Klausel ist in den nicht verfügbar WHERE
oder GROUP BY
Klauseln , obwohl es zuerst deklariert ist - vorausgesetzt , dass Computerprogramme in der Regel der Top-down - Ausführungsreihenfolge folgen.
Es ist auch überraschend, dass SQL-Autoren ihre Ausdrücke in SELECT
, WHERE
und GROUP BY
Klauseln redundant wiederholen oder eine Unterabfrage verwenden müssen, die sich nicht für eine prägnante Abfrage eignet. Zumindest wenn der Benutzer mit der tatsächlichen Reihenfolge der Klauselausführung vertraut ist , weiß er, warum er sich wiederholen muss, aber das hindert ihn nicht daran, frustrierend zu sein.
Dieses Problem und andere damit zusammenhängende Probleme sind in diesem Artikel dokumentiert, den ich gefunden habe: https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql- Operationen / und es ist keine Überraschung, dass eine Qualitätssicherung in StackOverflow fast 30.000 Aufrufe hat: /programming/3241352/using-an-alias-column-in-the-where-clause-in-postgresql
Ich habe mich gefragt, ob Implementierungen von SQL diese "logischere" Reihenfolge von Klauseln zulassen. Ich stelle fest, dass Linq in .NET tatsächlich dieser Reihenfolge folgt, obwohl ich es nicht als echte SQL-Implementierung beschreiben würde, aber in Linq wäre das Äquivalent:
source // FROM equivalent
.Where( predicate-expression )
.GroupBy( key-expression )
.Where( predicate-expression ) // HAVING equivalent
.Select( projection-expression )
.OrderBy( ordering-expression )
(Mir gefällt auch, wie Sie mit Linq an einer Select()
beliebigen Stelle in der Befehlssequenz eine Projektion hinzufügen können, damit Sie Ihre ausgewerteten Ausdrücke verwenden können, ohne erneut Ausdrücke aufrufen zu müssen.)
Können Sie mit einer SQL-Implementierung Abfragen in einer logischeren Struktur ausdrücken?
SELECT
Klausel in denWHERE
undGROUP BY
Klauseln - und so ziemlich alle SQL - Implementierung weicht von der Norm in irgendeiner Weise oder eine andere - ich schlage eine Abweichung vor oder fordere sie an, die eine andere syntaktische Reihenfolge der Klauseln ermöglicht, anstatt den Spezifikationsgroßhandel zu verletzen. Danke übrigens auch für die historischen Informationen :)