Warum steht in einer SQL-Abfrage "Auswählen vor" "Von"? [geschlossen]

67

Das hat mich in der Schule sehr gestört.

Als ich vor fünf Jahren SQL lernte, fragte ich mich immer, warum wir zuerst die gewünschten Felder angeben und dann, woher wir sie wollen.

Nach meiner Vorstellung sollten wir schreiben:

From Employee e
Select e.Name

Warum sagt die Norm dann 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?

Cyril Gandon
quelle
64
Es ist eine DBA-Verschwörung, OO-Affen an ihrem Platz zu halten.
30.
3
Leider kann ich in dem Artikel , in dem SEQUEL vorgestellt wurde , keine relevanten Informationen finden , und ich glaube nicht, dass es bestimmte Zitate gibt, die Ihre Frage beantworten. Die Antwort von gnat ist vielleicht die beste Erklärung - aber ich würde die Verschwörungstheorie nicht ablehnen.
Yannis
2
Persönlich hätte ich mir immer gewünscht Linq, die standardisierte SQLSyntax nicht verwenden zu können .
jp2code
4
Die Klauseln in einer SELECT-Anweisung entsprechen nicht der Reihenfolge der Operation.
S.Lott
8
Gute Frage. Als nächstes sollten INSERT- und UPDATE-Abfragen unterschiedliche Syntaxmodelle verwenden: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Antworten:

86

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

  • Strukturierte englische Abfragesprache
    mit Schwerpunkt auf Englisch , vorausgesetzt, die Schreibweise entspricht weitgehend der natürlichen Sprache.

Nun buchstabieren 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, weshalb es als Norm festgelegt ist.

Übrigens Where: SQL-Anweisungen wurden absichtlich so entworfen, dass sie der natürlichen Sprache nahe kommen.

Mücke
quelle
7
Natürlich hat Microsoft das bei LINQ ignoriert, da das FROM an erster Stelle steht!
27
Es gibt eine Menge Lookahead-Logik auf Englisch: /
Michael K
15
@Digger - das war beabsichtigt: Sie konnten Intellisense im ausgewählten Teil nicht unterstützen, wenn die Auswahl an erster Stelle stand.
Scott Whitlock
6
@Digger: LINQ folgt der OO / modern Object.Method oder Object.Property. Vergessen Sie nicht, dass es SQL seit 40 Jahren gibt
am
7
Ich hätte diese Frage stattdessen auf english.stackexchange.com posten sollen :)
Cyril Gandon
37

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 FROM zu suchen, aber ist das wirklich eine große Sache?

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

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

JeffO
quelle
2
Sie könnten aber auch schreiben FROM myTable;statt FROM myTable SELECT *; Dies scheint nur eine Voraussetzung zu sein, weil es das ist, was Sie gewohnt sind.
user606723
13
Nur weil es erforderlich ist, muss es nicht zuerst kommen.
LarsTech
8
In ANSI ist SQL FROMerforderlich. Aus diesem Grund haben viele RDBMS eine Tabelle namens DUAL oder eine andere
Martin Smith,
@LarsTech - es muss nicht zuerst kommen, aber warum kompliziert. Es heißt select-Anweisung. Beginnen Sie einfach mit dem Wort select.
JeffO
3
@ Jeffo: Okay. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek
10

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

"X AUS Y AUSWÄHLEN" ist daher die geeignetere Antwort auf "Was möchte ich aus der Datenbank auswählen" als "X AUS Y AUSWÄHLEN".

Außerdem gibt in SQL SELECT / UPDATE / INSERT die Art der Operation an, die Sie ausführen möchten, und FROM ist nur eine Klausel, mit deren Hilfe Sie aus der richtigen Tabelle in der Datenbank auswählen können. Auch hier hat Ihre Arbeit mit Daten Vorrang vor der Frage , wie genau Sie dies erreichen möchten.

0x4B1D
quelle
1
+1: Es ist nicht zwingend oder prozedural. Die Reihenfolge der Klauseln entspricht lediglich dem Englischen. Nichts mehr.
S.Lott
ON und WHERE sind möglicherweise bessere Beispiele für die Bedeutung der Reihenfolge von Klauseln in einer select-Anweisung.
JeffO
5

SQL ist eine strukturierte Abfragesprache für englischsprachige Benutzer. SELECT, INSERT, UPDATE und DELETE sind zwingende Befehle. In Englisch beginnen Imperativbefehle den Satz oder die Anweisung. Vergleichen Sie:

West young man go!

zu

Go west young man!

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

FROM    employees a,
        accounts b
UPDATE  ...

oder

INTO    customers a
SELECT  ...

Wenn Sie die von Ihnen ausgeführte Aktion kennen, 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, in denen sie enthalten sind. 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.

BillThor
quelle
7
Yoda war also nicht an der Entwicklung von SQL beteiligt.
Adam f
Interessant, dass Sie UPDATE aufrufen. UPDATE ... FROMist keine englisch-artige Struktur, IMO. Nicht, dass ich bessere Vorschläge hätte ...
Robert Brown
Es sollte darauf hingewiesen werden, dass die Präposition mit dem Verb übereinstimmen muss.
BillThor
3

SQL-Anweisungen beginnen mit Verben. Das war die Wahl der Sprachdesigner, und viele Programmiersprachen arbeiten auf diese Weise. Semantisch ist es nicht ungewöhnlich, Programmiersprachen zu sehen, die wie folgt funktionieren:

verb(noun, noun, noun);

Im Fall einer SELECT-Anweisung, die Sie als Beispiel angeben, würde Ihre vorgeschlagene Syntax das Objekt an die erste Stelle der Anweisung setzen. Anstelle einer VSO-Satzreihenfolge (Verb, Subjekt, Objekt) würden Sie OVS haben, 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.

David Cloutman
quelle
2

Ich denke, es 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 Parsen wäre komplizierter. Sie konnten nicht erkennen, dass UPDATE ein Syntaxfehler war, bis Sie die FROM-Klausel analysiert hatten und der Parser sich genügend Kontext merken musste, um zu wissen, dass eine Unterabfrage analysiert wurde. Ich glaube nicht, dass Aktualisierungen in Unterabfragen 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 ist, 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 schlecht erinnerten Compiler-Designpapiere von der Universität sprengt.

Betroffen vonTunbridgeWells
quelle
Betrachtet man den Wiki-Artikel QUEL, der ungefähr zur gleichen Zeit entwickelt wurde, so schlägt das OP die Reihenfolge der Syntaxklauseln vor.
Martin Smith