Erlauben SQL-Dialekte die logische Abfolge von SELECT-Klauseln?

7

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 SELECTKlausel ist in den nicht verfügbar WHEREoder GROUP BYKlauseln , 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, WHEREund GROUP BYKlauseln 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?

Dai
quelle

Antworten:

7

Implementierungen von SQL

Nein, SQL ist standardisiert. Es gibt keine sehr unterschiedlichen Implementierungen eines Standards. Diese Art besiegt den Zweck. Es gab / gibt immer einen Kampf um den relationalen Kalkül (den SQL vorgibt zu sein) gegen den relationalen Algebra-Ansatz. Es ist eine alte Debatte,

Nachdem wir ein Modell für die Daten ausgewählt hatten, bestand unser nächster Schritt darin, eine Abfragesprache auszuwählen. Zwei Familien von Datensprachen höherer Ebene für eine relationale Datenbank basieren alternativ auf der relationalen Algebra (abgeleitet aus der Algebra der Mengen) oder dem relationalen Kalkül [Codd, 197lb, 1971c und Date, 1975] (abgeleitet aus dem Prädikatenkalkül) ). Codd [1971c] und Date [1975] haben diese beiden verglichen und festgestellt, dass der Beziehungskalkül überlegen ist, insbesondere für die Verwendung als Zielsprache für ein natürliches Sprachsystem. Der Hauptgrund für ihre Wahl des relationalen Kalküls als Zielsprache war, dass der Kalkül nicht prozedural ist; Das heißt, eine Abfrage im relationalen Kalkül liefert nur wenige Informationen darüber, wie bei der Suche in der Datenbank vorgegangen werden soll. Die relationale Algebra ist prozeduraler, was die automatische Erstellung einer Abfrage durch ein natürliches Sprachsystem etwas schwieriger macht. - -Implementierung einer Abfragesprache basierend auf dem Relational Calculus 1970

Und wieder von Codd selbst,

Zu Beginn der Entwicklung des relationalen Modells (1969-1972) habe ich zwei Sprachen für den Umgang mit Beziehungen erfunden: eine algebraische und eine auf Prädikatenlogik erster Ordnung basierende [Codd 1971a]. Ich habe dann bewiesen, dass die beiden Sprachen die gleiche Ausdruckskraft haben [Codd 1971d], aber darauf hingewiesen, dass die logikbasierte Sprache optimierbarer ist (vorausgesetzt, dass keine Ablaufverfolgung versucht wird) und darüber hinaus einfacher als Schnittstelle zu Inferenzsoftware zu verwenden ist das DBMS. - Codd 1990, Das relationale Modell für die Datenbankverwaltung Version 2

Es gibt sicherlich eine Menge Implementierungen für beide Ansätze. Allerdings ist SQL als Implementierung ziemlich fest im Kalkülansatz verankert.

LINQ-Probleme

Diese Probleme sind mit dem algebraischen Ansatz nie wirklich verschwunden, zum Beispiel aus diesem Blog .

context.Cars
  .OrderBy(x => x.Id)
  .Skip(50000)
  .Take(1000)
  .ToList();

Erfordert Handoptimierung als,

context.Cars
  .Where(x => context.Cars.OrderBy(y => y.Id).Select(y => y.Id).Skip(50000).Take(1000).Contains(x.Id))
  .ToList();

Wenn Sie mehrere unterschiedliche Beziehungen mit unterschiedlichen Leistungsmerkmalen (Indizes, von denen die meisten als indirekt und abstrakt implementiert sind) und Statistiken haben, ist es nur schwierig, eine prozedurale Mengenlogik zu schreiben, die effizient funktioniert.

Evan Carroll
quelle
Ich werde als Beispiel MySQL beziehen (die für ihre syntaktische Macken bekannt ist), die die Wiederverwendung von aliased Spaltenausdrücke aus der erlaubt SELECTKlausel in den WHEREund GROUP BYKlauseln - 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 :)
Dai
@Dai nein, es gibt keine Abstraktion der Syntax, mit der Sie relationale Berechnungen wie relationale Algebra aussehen lassen können, und niemand hat sie in einem rdbms implementiert. (Und ich denke, es wäre eine schreckliche Idee).
Evan Carroll