我们学到了什么?
既然并不是所有的数据库都按照上述方式执行 SQL 预计,那我们的收获是什么?我们的收获是永远要记得:SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避免一般性的错误 。如果你能记住 SQL 语句语法顺序和执行顺序的差异,你就能很容易的理解一些很常见的 SQL 问题 。
当然,如果一种语言被设计成语法顺序直接反应其语句的执行顺序,那么这种语言对程序员是十分友好的,这种编程语言层面的设计理念已经被微软应用到了 LINQ 语言中 。
3、 SQL 语言的核心是对表的引用(table references)
由于 SQL 语句语法顺序和执行顺序的不同,很多同学会认为SELECT 中的字段信息是 SQL 语句的核心 。其实真正的核心在于对表的引用 。
根据 SQL 标准,FROM 语句被定义为:
<from clause> ::= FROM <table reference> [ { <comma> <table reference> }... ]
FROM 语句的“输出”是一张联合表,来自于所有引用的表在某一维度上的联合 。我们们慢慢来分析:
FROM a, b
上面这句 FROM 语句的输出是一张联合表,联合了表 a 和表 b。如果 a 表有三个字段,b 表有 5 个字段,那么这个“输出表”就有 8 ( =5+3)个字段 。
这个联合表里的数据是 a*b,即 a 和 b 的笛卡尔积 。换句话说,也就是 a 表中的每一条数据都要跟 b 表中的每一条数据配对 。如果 a 表有3 条数据,b 表有 5 条数据,那么联合表就会有 15 ( =5*3)条数据 。
FROM 输出的结果被 WHERE 语句筛选后要经过 GROUP BY 语句处理,从而形成新的输出结果 。我们后面还会再讨论这方面问题 。
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表) 。
我们学到了什么?
思考问题的时候从表的角度来思考问题提,这样很容易理解数据如何在 SQL 语句的“流水线”上进行了什么样的变动 。
4、 灵活引用表能使 SQL 语句变得更强大
灵活引用表能使 SQL 语句变得更强大 。一个简单的例子就是 JOIN 的使用 。严格的说 JOIN 语句并非是 SELECT 中的一部分,而是一种特殊的表引用语句 。SQL 语言标准中表的连接定义如下:
<table reference> ::=<table name> | <derived table> | <joined table>
就拿之前的例子来说:
FROM a, b
a 可能输入下表的连接:
a1 JOIN a2 ON a1.id = a2.id
将它放到之前的例子中就变成了:
FROM a1 JOIN a2 ON a1.id = a2.id, b
尽管将一个连接表用逗号跟另一张表联合在一起并不是常用作法,但是你的确可以这么做 。结果就是,最终输出的表就有了 a1+a2+b 个字段了 。
(译者注:原文这里用词为 degree,译为维度 。如果把一张表视图化,我们可以想象每一张表都是由横纵两个维度组成的,横向维度即我们所说的字段或者列,英文为columns;纵向维度即代表了每条数据,英文为 record,根据上下文,作者这里所指的应该是字段数 。)
在 SQL 语句中派生表的引用甚至比表连接更加强大,下面我们就要讲到表连接 。
我们学到了什么?
思考问题时,要从表引用的角度出发,这样就很容易理解数据是怎样被 SQL 语句处理的,并且能够帮助你理解那些复杂的表引用是做什么的 。
更重要的是,要理解 JOIN 是构建连接表的关键词,并不是 SELECT 语句的一部分 。有一些数据库允许在 INSERT 、 UPDATE 、 DELETE 中使用 JOIN。
5、 SQL 语句中推荐使用表连接
我们先看看刚刚这句:
FROM a, b
高级 SQL 程序员也许学会给你忠告:尽量不要使用逗号来代替 JOIN 进行表的连接,这样会提高你的 SQL 语句的可读性,并且可以避免一些错误 。
利用逗号来简化 SQL 语句有时候会造成思维上的混乱,想一下下面的语句:
FROM a, b, c, d, e, f, g, hWHERE a.a1 = b.bxAND a.a2 = c.c1AND d.d1 = b.bc-- etc...
我们不难看出使用 JOIN 语句的好处在于:
- 安全 。JOIN 和要连接的表离得非常近,这样就能避免错误 。
- 更多连接的方式,JOIN 语句能去区分出来外连接和内连接等 。
推荐阅读
- Paxos算法为什么说是Raft,Zab协议的鼻祖,及原理解析
- 深入理解Linux IO复用之epoll
- 看都不懂的三层架构,到底要怎么理解?
- 共识算法Raft为什么这么流行,及原理解析
- 活死人意思 活死人的理解
- 看母树大红袍 加深理解武夷山茶文化
- 理解Spring:IOC的原理及手动实现
- PHP中钩子的理解与实例教程
- 这几点行为完全不会伤车,8成车主却坚信不疑,不懂的快来看看
- Linux 虚拟内存和物理内存的理解