概述

在 SELECT 查询语句中,有两个顺序的是非常重要的,分别是:

  • 关键词的语法顺序;
  • SELECT语句的执行顺序;

下面,我们来分别进行讲解说明。

关键词的语法顺序

在 SELECT 中,关键词的顺序是不能颠倒的,主体顺序如下:

  • SELECT
  • DISTINCT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT

示例如下:

  1. SELECT
  2. DISTINCT
  3. name AS n
  4. FROM heros
  5. WHERE sex='man'
  6. GROUP BY team_id
  7. HAVING num > 2
  8. ORDER BY num DESC
  9. LIMIT 10;

执行顺序与原理

了解了基本的 SQL 查询的语法顺序后,我们来看一下在数据库中,SQL 的底层执行顺序及其原理。
其基本顺序如下:

  1. FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT

比如你写了一个 SQL 语句,那么它的关键字顺序和执行顺序是下面这样的:

  1. SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
  2. FROM player JOIN team ON player.team_id = team.team_id #顺序1
  3. WHERE height > 1.80 #顺序2
  4. GROUP BY player.team_id #顺序3
  5. HAVING num > 2 #顺序4
  6. ORDER BY num DESC #顺序6
  7. LIMIT 2 #顺序7

在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。需要注意的是,这些步骤隐含在 SQL 的执行过程中,对于我们来说是不可见的。
在数据库查询执行过程中,主要包含以下几个步骤:

  1. 首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
  2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
  3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。
  4. 在此基础上再进行 WHERE 阶段,根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2。
  5. 然后进入第三步和第四步,也就是 GROUP 和 HAVING 阶段。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4。
  6. 当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段,得到虚拟表 vt5。
  7. 当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段,得到虚拟表 vt6。
  8. 最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段,得到最终的结果,对应的是虚拟表 vt7。

当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。