SQL 中的语法顺序与执行顺序

很多程序员都很抵触SQL。其实SQL是一整为数不多的声明性语言,只是它的运行方式完全不同于我们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言。

今天大家共同学习下SQL的语法顺序与执行顺序。(入门级的。大神们可以直接点退出了哈。)


SQL 是一种声明式语言

首先要把这个概念记在脑中:“声明”。 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。

SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选出符合声明的数据,而不是像传统编程思维去指示计算机如何操作。这是不是很爽?

(小编:简单粗暴地说:喂,电脑你把上个月存进去的所有销售记录给我调出来。电脑:上个月的记录有:

SQL 中的语法顺序与执行顺序上边的例子很明确了吧。我们不关心这些数据怎么得来的,我们只想瞅瞅结果而已。


为啥很多程序员都很抵触SQL呢,主要原因是:我们潜意识中的是按照命令式编程的思维方式思考问题的。就好像这样:“电脑,先执行这一步,再执行那一步,但是在那之前先检查一下是否满足条件 A 和条件 B ”。例如,用变量传参、使用循环语句、迭代、调用函数等等,都是这种命令式编程的思维惯式。而SQL恰恰没有按照这种命令式编程的思维方式来处理问题。

另外,最最关键的一点:SQL 的语法并不按照语法顺序执行

SQL 语句有一个让大部分人都感到困惑的特性,就是:SQL 语句的执行顺序跟其语句的语法顺序并不一致。SQL 语句的语法顺序是:

  1. SELECT[DISTINCT]

  2. FROM

  3. WHERE

  4. GROUP BY

  5. HAVING

  6. UNION

  7. ORDER BY

为了方便理解,上面并没有把所有的 SQL 语法结构都列出来,但是已经足以说明 SQL 语句的语法顺序和其执行顺序完全不一样,就以上述语句为例,其执行顺序为:

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. SELECT

  6. DISTINCT

  7. UNION

  8. ORDER BY

关于 SQL 语句的执行顺序,有三个值得我们注意的地方:

1、 FROM 才是 SQL 语句执行的第一步,并非 SELECT 。数据库在执行 SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。

2、 SELECT 是在大部分语句执行了之后才执行的,严格的说是在 FROM 和 GROUP BY 之后执行的。理解这一点是非常重要的,这就是你不能在 WHERE 中使用在 SELECT 中设定别名的字段作为判断条件的原因。

SQL 中的语法顺序与执行顺序如果你想重用别名new_rq,你有两个选择。要么就重新写一遍 new_rq 所代表的原字段:

SQL 中的语法顺序与执行顺序…或者求助于衍生表、通用数据表达式或者视图,以避免别名重用。

3、 无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。很多人认为每个 UNION 段都能使用 ORDER BY 排序,但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看,这并不是真的。尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。

(温馨提示:并非所有的数据库对 SQL 语句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。)

亲们。大家学会了吗?

既然并不是所有的数据库都按照上述方式执行 SQL 预计,那我噼里啪啦打字半天为了啥啥?

为了使大家要永远记得: SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避开一些一般性的错误。如果你能记住 SQL 语句语法顺序和执行顺序的差异,那么恭喜你,你已经可以轻松解决SQL的一些一般性问题了。

展开阅读全文

没有更多推荐了,返回首页