为什么SQL的语法由内而外?

Mas*_*ler 7 sql grammar history

在几乎任何正式结构化的信息集中,您可以从开始到结束开始阅读,或偶尔从结尾开始阅读(例如,街道地址).但在SQL中,尤其是SELECT查询,以便正确理解它的含义你必须从中间开始,在FROM子句.这可能使长查询很难读取,特别是如果它包含嵌套的SELECT查询.

通常在编程中,当某些东西似乎没有任何意义时,它背后有一个历史原因.从SELECT而不是FROM开始没有意义.有谁知道这样做的原因?

Rus*_*Cam 11

我认为,就英语句子的结构而言,SQL语句的结构方式具有逻辑意义.基本上

I WANT THIS
FROM HERE
WHERE WHAT I WANT MEETS THESE CRITERIA
Run Code Online (Sandbox Code Playgroud)

我觉得这没有多大意义,至少在英语中说

FROM HERE
I WANT THIS
WHERE WHAT I WANT MEETS THESE CRITERIA  
Run Code Online (Sandbox Code Playgroud)

  • @Mason - 100行英语也很快变得复杂,并且不再成为语言设计的有用模型:)我认为目标是降低入口障碍.它对我有用:当我第一次学习SELECT*FROM MyTable时,我想,"SQL很简单!".哦,我多么天真...... (3认同)
  • 就这么简单的一句话来说,这是有道理的。但是,当您的查询有 100 行长、有 10 个连接和两个子选择时,“看起来像英语”的方法很快就失去了意义。 (2认同)
  • 另一方面,有意义地说,"去机架并用帽带给我所有的帽子",这正是你想要的顺序:"FROM rack SELECT hat WHERE has_hatband = 1".你可以同样舒服地说,"把我带帽子的所有帽子都带上帽子",这是"SELECT hat FROM rack WHERE has_hatband = 1"---哦,等等,这是常规的SQL. (2认同)

gim*_*mel 9

SQL维基百科条目简要地介绍了历史:

在20世纪70年代,IBM圣何塞研究实验室的一个小组基于Edgar F. Codd在其有影响力的论文"大型共享数据库的数据关系模型"中引入的模型开发了System R关系数据库管理系统.随后,IBM的Donald D. Chamberlin和Raymond F. Boyce创建了结构化英语查询语言(SEQUEL)来操作和管理存储在System R中的数据.缩写词SEQUEL后来改为SQL,因为"SEQUEL"是英国的商标 -总部位于Hawker Siddeley的飞机公司.

原始名称明确提到英语,解释语法.

深入挖掘,我们找到了FLOW-MATIC编程语言.

FLOW-MATIC,最初称为B-0(商业语言版本0),可能是第一种类似英语的数据处理语言.它由Grace Hopper发明并指定,商业变体的开发始于1955年的Remington Rand,用于UNIVAC I.到1958年,编译器及其文档一般可用并在商业上使用.

FLOW-MATIC是通用业务导向语言背后的灵感,这是目前仍在使用的最古老的编程语言之一.SEQUEL遵循这种精神,采用类似英语的语法设计(20世纪70年代是现代的,与20世纪50年代和60年代相比).

从视角来看,"现代"编程系统仍然使用背后的古老思想访问数据库

MULTIPLY PRICE BY QUANTITY GIVING COST.
Run Code Online (Sandbox Code Playgroud)


Pet*_*háč 8

我必须不同意.SQL语法不是由内到外的.

第一眼看,您可以判断查询是SELECT,INSERT,UPDATE还是DELETE数据(SQL的其余部分,例如DDL,故意省略).


回到SELECT语句混淆:SQL的目标是声明性的.这意味着你表达你想要的东西而不是你想要它.因此,首先说明您想要的内容(您选择的属性列表),然后向DBMS提供有关应该从哪个位置查找的其他信息.

在最后放置WHERE子句也很有意义:想象一个漏斗,顶部宽,底部窄.通过在语句末尾添加WHERE子句,可以减少结果数据量.对查询应用限制除了底部以外的任何地方都需要开发人员转过头来.


最后的ORDER BY子句:一旦数据通过漏斗,就对其进行排序.

JOINS(JOIN标准)确实属于FROM子句.

GROUPING:基本上是在漏斗进入另一个漏斗之前通过漏斗运行数据.

SQL sytax很甜蜜.关于它没有任何内在的东西.也许这就是为什么即使在数十年之后SQL如此受欢迎.它很容易掌握并且有意义.(虽然我曾经遇到过一个7页(A4大小)的SQL语句,这让我花了很长时间才能解决这个问题.)

  • 一旦?我每周面对一次或两次这样的查询.不断接触它是导致我这个问题的原因. (2认同)

Meh*_*ari 5

它被设计成像英语一样.我认为这是主要原因.

作为旁注,我记得LINQ的初始预览是在它(select ... from ...)之后直接建模的.这在后来的预览中被更改为更多的编程语言(因此范围向下).Anders Hejlsberg特别提到了关于SQL的这个奇怪的事实(这使得IntelliSense更难并且与C#范围规则不匹配)是他们做出这个决定的原因.

无论如何,无论好坏,它都是它,改变任何东西都为时已晚.