it-swarm-eu.dev

Warum steht die Auswahl vor dem Von in einer SQL-Abfrage?

Das hat mich in der Schule sehr gestört.

Als ich vor fünf Jahren SQL lernte, habe ich mich immer gefragt, warum wir zuerst die gewünschten Felder angeben und dann, woher wir sie möchten.

Nach meiner Idee sollten wir schreiben:

From Employee e
Select e.Name

Warum sagt die Norm Folgendes?

Select e.Name -- Eeeeek, what does e mean?
From Employee e -- Ok, now I know what e is

Ich habe Wochen gebraucht, um SQL zu verstehen, und ich weiß, dass ein Großteil dieser Zeit durch die falsche Reihenfolge der Elemente verbraucht wurde.

Es ist wie in C # zu schreiben:

string name = employee.Name;
var employee = this.GetEmployee();

Ich gehe also davon aus, dass dies einen historischen Grund hat. Warum?

67
Cyril Gandon

Ursprünglich SQL-Sprache wurde SEQUEL genannt steht für

  • Strukturierte englische Abfragesprache
    mit der Betonung auf Englisch unter der Annahme, dass die Schreibweise der natürlichen Sprache nahe kommt.

Schreiben Sie diese beiden Aussagen so, wie Sie englische Sätze buchstabieren würden:

  1. "Aus Mitarbeitertabelle e Spalte e.Name auswählen"
  2. "Spalte e.Name aus Mitarbeitertabelle e auswählen"

Zweitens klingt näher an der natürlichen englischen Sprache, deshalb ist es als Norm festgelegt.

Übrigens gilt die gleiche Argumentation für Where etc - SQL-Anweisungen wurden absichtlich so entworfen, dass sie der natürlichen Sprache nahe kommen.

85
gnat

Weil SELECT in einer select-Anweisung erforderlich ist und FROM nicht.

Select 'This String'

Natürlich kann Ihre SQL-Anweisung analysiert werden, um nach SELECT, DELETE, UPDATE nach dem FROM zu suchen, aber ist das wirklich eine große Sache?

Denken Sie daran, dies alles wurde vor Intellisense getan. Es ist nicht so kompliziert.

Bearbeiten: Es gibt wahrscheinlich keinen Grund, warum SQL-Interpreter nicht für beides gebaut werden könnten.

36
JeffO

Ich kenne keine Antwort, die ich durch Referenzen sichern könnte, aber wenn ich spekulieren müsste: SQL ist eine deklarative Sprache , eine Aussage einer solchen Sprache beschreibt was Sie möchten im Gegensatz zu tun, wie Sie es tun möchten.

Daher klingt "SELECT X FROM Y" eine geeignetere Möglichkeit, um "Was möchte ich aus der Datenbank auswählen" zu beantworten, anstatt "FROM Y SELECT X" zu schreiben.

Darüber hinaus gibt in SQL SELECT/UPDATE/INSERT die Art der Operation an, die Sie ausführen möchten, und FROM ist nur eine Klausel, mit der Sie aus der richtigen Tabelle in der Datenbank auswählen können. Wiederum hat was Sie mit Daten tun, Vorrang vor wie genau Sie werden das erreichen.

10
0x4B1D

SQL ist eine strukturierte Abfragesprache für englischsprachige Personen. SELECT, INSERT, UPDATE und DELETE sind zwingende Befehle. Im Englischen beginnen imperative Befehle mit dem Satz oder der Aussage. Vergleichen Sie:

West young man go!

zu

Go west young man!

SQL folgt dem zweiten (imperativen) Format. Auch die vier Imperativbefehle haben drei signifikant unterschiedliche Formate. Erwägen:

FROM    employees a,
        accounts b
UPDATE  ...

oder

INTO    customers a
SELECT  ...

Wenn Sie die Aktion kennen, die Sie ausführen, ist es einfacher, das richtige Format auszuwählen.

Im Fall von select bestimmen Sie, welche Attribute Sie möchten, und fügen dann die Tabellen hinzu, die sie haben. Während Sie die Auswahlkriterien erstellen, können Sie zusätzliche Tabellen hinzufügen. Wenn Sie Kriterien dynamisch hinzufügen, kann dies normalerweise am Ende eines statischen Teils der Abfrage erfolgen.

5
BillThor

SQL-Anweisungen beginnen mit Verben. Das war die Wahl der Sprachdesigner, und viele Programmiersprachen funktionieren so. Semantisch gesehen ist es nicht ungewöhnlich, dass Programmiersprachen wie folgt funktionieren:

verb(noun, noun, noun);

Im Fall der SELECT-Anweisung, die Sie als Beispiel angeben, würde Ihre vorgeschlagene Syntax das Objekt an die erste Stelle in der Anweisung setzen. Anstelle einer VSO-Satzreihenfolge (Verb, Subjekt, Objekt) hätten Sie OVS, was im Vergleich zu natürlichen Sprachen sehr seltsam wäre. SVO (z. B. Englisch), VSO (z. B. Arabisch) und SOV (z. B. Latein) sind vernünftigere Annäherungen an die menschliche Sprache.

3
David Cloutman

Ich denke, dies würde das Parsen erheblich erschweren, insbesondere bei Unterabfragen, z.

  FROM Foo f
  JOIN (FROM Bar b
        WHERE b.ID = f.ID
        UPDATE b
           SET b.Wibble = 1) x
    ON x.ID = f.ID
SELECT f.XYZ

Das zu analysieren wäre komplizierter. Sie konnten nicht feststellen, dass das UPDATE ein Syntaxfehler war, bis Sie die FROM-Klausel analysiert hatten, und der Parser musste sich genügend Kontext merken, um zu wissen, dass eine Unterabfrage analysiert wurde. Ich denke nicht, dass Aktualisierungen in Unterabfragen sowieso zulässig sind, aber wenn dies der Fall wäre (möglicherweise mit einer RETURNING-Klausel), können Sie möglicherweise nicht feststellen, dass dies ungültig war, bis Sie die SELECT-Anweisung analysiert haben.

Dies würde zumindest k (Lookahead) für die Grammatik erhöhen und sie im schlimmsten Fall kontextsensitiv machen, obwohl dies die Grenzen meiner eher schwach erinnerten Compiler-Designpapiere von der Universität erweitert.