为什么在SQL查询中的“从”之前选择“选择”?[关闭]


67

这件事让我在学校很困扰。

五年前,当我学习SQL时,我总是想知道为什么我们首先指定想要的字段,然后再指定它们的来源。

根据我的想法,我们应该写:

From Employee e
Select e.Name

那么,为什么规范说以下内容?

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

我花了数周的时间来理解SQL,而且我知道很多时间都花在了错误的元素顺序上。

就像用C#编写:

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

因此,我认为它具有历史原因。为什么?


64
将OO猴子留在原地是DBA的阴谋。
gbn

3
不幸的是,我在介绍SEQUEL论文中找不到任何相关信息,并且我认为没有具体的引文可以回答您的问题。gnat的答案可能是最好的解释-但我不会否认阴谋论。
yannis 2011年

2
就个人而言,我一直希望Linq不能使用标准化SQL语法。
jp2code 2011年

4
SELECT语句中的子句不是操作的顺序。
S.Lott

8
好问题。您的下一个应该是为什么INSERT和UPDATE查询必须使用不同的语法模型的原因:(field1,field2)VALUES(f1,f2)vs(field1 = f1,field2 = f2)。
LarsTech 2011年

Answers:


86

最初,SQL语言被称为SEQUEL代表

  • 结构化的英语查询语言
    ,强调英语,假设它与自然语言的拼写非常接近。

现在,拼写这两个语句,就像拼写英语句子一样:

  1. “从雇员表e选择列e.Name”
  2. “从雇员表e中选择列e.Name”

第二听起来更接近自然英语,这就是为什么它被设置为规范。

顺便说一句,同样的推理Where也适用于其他情况-SQL语句被故意设计成听起来接近自然语言。


7
当然,Microsoft忽略了LINQ,因为FROM排在第一位!

27
英语中有很多前瞻逻辑:/
Michael K

15
@Digger-这是设计使然:如果选择优先,他们将不支持选择部分中的智能感知。
Scott Whitlock

6
@Digger:LINQ遵循OO /现代Object.Method或Object.Property。不要忘记SQL已经存在了40年
GBN

7
我应该将这个问题发布在english.stackexchange.com上:)
西里尔·甘登

37

因为select语句中需要SELECT,而FROM则不需要。

Select 'This String'

当然,可以对您的sql语句进行解析,以在FROM之后查找SELECT,DELETE和UPDATE,但这真的有什么大不了的?

记住,这都是在智能感知之前完成的。没那么复杂。

编辑:可能没有理由不能将sql解释器同时创建。


2
不过,您也可以写FROM myTable;而不是FROM myTable SELECT *; 这似乎只是一个要求,因为这是您过去的习惯。
user606723,2011年

13
仅仅因为它是必需的,并不意味着它必须是第一位的。
LarsTech 2011年

8
在ANSI中,SQL FROM是必需的。这就是为什么许多的RDBMS都称为表DUAL 或其他单行虚表
马丁·史密斯

@LarsTech-它不一定要排在第一位,但是为什么要使其变得复杂。它称为选择语句,仅以单词select开头。
JeffO 2011年

3
@JeffO:好的。SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber
Allon Guralnek 2012年

10

不知道,我可以通过引用备份一个答案,但如果我不得不猜测:SQL是一个说明性语言,这种语言语句描述了什么,你想这样做,而不是如何你想做到这一点。

这样,与编写“ FROM Y SELECT X”相反,“ SELECT X FROM Y”听起来是回答“我想从数据库中选择什么”的一种更合适的方式。

此外,在SQL中,SELECT / UPDATE / INSERT指定您将要执行的操作类型,而FROM只是一个子句,可帮助您从数据库的正确表中进行选择。再次,什么是你的数据做优先于如何你要确切地实现这一目标。


1
+1:这不是命令性或程序性的。条款的顺序只适合英语。而已。
S.Lott

ON和WHERE可能是select语句中子句顺序重要性的更好示例。
JeffO 2011年

5

SQL是针对英语使用者的结构化查询语言。SELECT,INSERT,UPDATE和DELETE是命令性命令。在英语中,命令式命令以句子或语句开头。相比:

West young man go!

Go west young man!

SQL遵循第二种(命令式)格式。同样,四个命令式命令具有三种明显不同的格式。考虑:

FROM    employees a,
        accounts b
UPDATE  ...

要么

INTO    customers a
SELECT  ...

如果知道要执行的操作,则选择正确的格式会更容易。

如果选择select,则确定所需的属性,然后添加包含它们的表。建立选择标准时,可以添加其他表。动态添加条件时,通常可以在查询的静态部分结束时完成。


7
因此,Yoda没有参与开发SQL。
亚当·2012年

有趣的是您调出了UPDATE。 UPDATE ... FROMIMO不是一个类似英语的结构。并不是说我有更好的建议……
罗伯特·布朗

目的是指出介词需要与动词匹配。
BillThor 2012年

3

SQL语句以动词开头。那是语言设计师的选择,许多编程语言都采用这种方式。从语义上讲,看到像这样工作的编程语言并不少见:

verb(noun, noun, noun);

同样,以您给出的SELECT语句为例,建议的语法会将对象放在语句中。您将拥有OVS,而不是VSO(动词,主语,宾语)的句子顺序,与自然语言相比这是非常奇怪的。SVO(例如英语),VSO(例如阿拉伯语)和SOV(例如拉丁语)是人类语音的更合理近似。


2

我认为这将使解析特别复杂,尤其是对于子查询,例如

  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

解析这将更加复杂。您必须先解析FROM子句,然后才能分辨出UPDATE是语法错误,而且解析器必须记住足够的上下文才能知道它正在解析子查询。我认为无论如何都不允许在子查询中进行更新,但是如果它们是更新的(可能带有RETURNING子句),则在解析SELECT语句之前,您可能无法知道这是无效的。

这至少会使语法增加k(超前),并且在最坏的情况下会使它与上下文相关,尽管这使我记忆犹新的大学编译器设计论文超出了范围。


看一下Wiki文章QUEL是在大约同一时间开发的,OP建议使用语法子句的顺序。
马丁·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.