C'est quelque chose qui m'a beaucoup dérangé à l'école.
Il y a cinq ans, lorsque j'ai appris le SQL, je me suis toujours demandé pourquoi nous spécifions d'abord les champs que nous voulons et ensuite d'où nous les voulons.
Selon mon idée, il faudrait écrire:
From Employee e
Select e.Name
Alors pourquoi la norme dit-elle ce qui suit?
Select e.Name -- Eeeeek, what does e mean?
From Employee e -- Ok, now I know what e is
Il m'a fallu des semaines pour comprendre SQL, et je sais qu'une grande partie de ce temps a été consommée par le mauvais ordre des éléments.
C'est comme écrire en C #:
string name = employee.Name;
var employee = this.GetEmployee();
Donc, je suppose que cela a une raison historique. Pourquoi?
Langage SQL à l'origine s'appelait SEQUEL signifie
Maintenant, épelez ces deux déclarations comme vous épeleriez des phrases en anglais:
La seconde sonne plus proche de la langue anglaise naturelle, c'est pourquoi elle est définie comme la norme.
BTW le même raisonnement va à Where
etc - Les instructions SQL ont été intentionnellement conçues pour sonner près du langage naturel.
Parce que SELECT est requis dans une instruction select et FROM ne l'est pas.
Select 'This String'
Bien sûr, votre instruction SQL peut être analysée pour rechercher SELECT, DELETE, UPDATE après le FROM, mais est-ce vraiment si important?
Rappelez-vous, tout cela a été fait avant l'intellisense. Ce n'est pas si compliqué.
Edit: Il n'y a probablement aucune raison pour laquelle les interprètes sql n'ont pas pu être construits pour faire les deux.
Je ne connais pas de réponse que je pourrais sauvegarder par des références, mais si je devais spéculer: SQL est un langage déclaratif , une déclaration de ce langage décrit ce que vous aimeriez faire par opposition à comment vous aimeriez le faire.
En tant que tel, "SELECT X FROM Y" semble être un moyen plus approprié de répondre "Que voudrais-je sélectionner dans la base de données", par opposition à l'écriture de "FROM Y SELECT X".
De plus, en SQL, SELECT/UPDATE/INSERT spécifie le type d'opération que vous êtes sur le point de faire et FROM n'est qu'une clause qui vous aide à sélectionner dans la bonne table de la base de données. Encore une fois, ce que faites-vous avec les données a priorité sur comment exactement vous vont y parvenir.
SQL est un langage de requête structuré destiné aux anglophones. SELECT, INSERT, UPDATE et DELETE sont des commandes impératives. En anglais, les commandes impératives commencent la phrase ou la déclaration. Comparer:
West young man go!
à
Go west young man!
SQL suit le deuxième format (impératif). Les quatre commandes impératives ont également trois formats sensiblement différents. Considérer:
FROM employees a,
accounts b
UPDATE ...
ou
INTO customers a
SELECT ...
Si vous connaissez l'action que vous entreprenez, il est plus facile de sélectionner le format correct.
Dans le cas de select, vous déterminez les attributs que vous souhaitez, puis ajoutez les tables qui les possèdent. Lorsque vous créez les critères de sélection, vous pouvez ajouter des tableaux supplémentaires. Lorsque vous ajoutez dynamiquement des critères, cela peut généralement être fait à la fin d'une partie statique de la requête.
Les instructions SQL commencent par des verbes. C'était le choix des concepteurs de langage, et de nombreux langages de programmation fonctionnent de cette façon. Sémantiquement, il n'est pas rare de voir des langages de programmation qui fonctionnent comme ceci:
verb(noun, noun, noun);
De plus, dans le cas de l'instruction SELECT que vous donnez comme exemple, la syntaxe que vous proposez mettrait l'objet en premier dans l'instruction. Au lieu d'un ordre de phrase VSO (verbe, sujet, objet), vous auriez OVS, ce qui serait très étrange par rapport aux langues naturelles. SVO (par exemple anglais), VSO (par exemple arabe) et SOV (par exemple latin) sont des approximations plus raisonnables de la parole humaine.
Je pense que cela compliquerait considérablement l'analyse, en particulier avec les sous-requêtes, par exemple.
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
Analyser cela serait plus compliqué. Vous ne pouviez pas dire que la mise à jour était une erreur de syntaxe tant que vous n'aviez pas analysé la clause FROM, et l'analyseur devrait se souvenir de suffisamment de contexte pour savoir qu'il analysait une sous-requête. Je ne pense pas que les mises à jour soient autorisées dans les sous-requêtes de toute façon, mais si elles l'étaient (peut-être avec une clause RETURNING), vous ne pourriez peut-être pas dire que cela n'était pas valide jusqu'à ce que vous ayez analysé l'instruction SELECT.
Cela augmenterait au moins k (lookahead) pour la grammaire et, au pire, la rendrait contextuelle, bien que cela repousse les limites de mes papiers de conception de compilateur assez mal connus de l'université.