SQL执行过程 #
查询SQL执行顺序 #
以如下SQL为例:
select distinct table1.id as card_id
from table1
join table2 on table1.id = table2.id
where table1.id < 2
group by card_id
having max(card_id) > 10
order by card_id desc
limit 1, 1;
执行顺序如下
- FROM,查询语句的开始,每个步骤为下一个步骤生成一个虚拟表,作为下一个步骤的输入
- 如果是表,直接操作表
- 如果是子查询,先执行子查询
- 如果要关联表,执行下述JOIN、ON
- JOIN 关联表,生成笛卡尔乘积虚拟表
- ON,对JOIN出来的虚拟表进行按条件筛选,并生成一个新虚拟表
- WHERE,对虚拟表进行按条件筛选,生成一张新虚拟表
- GROUP BY,将按指定列的值分组,得到新的虚拟表。后续的所有步骤都只能操作被分组的列。
- AVG,SUM,MAX…,聚合函数 对分组的结果进行计算,不生成虚拟表
- HAVING,按条件筛选,主要和GROUP BY配合使用。且是唯一一个应用到已分组数据的筛选器。生成新虚拟表
- SELECT,选择指定列,生成新虚拟表
- DISTINCT,去重,对上出结果进行去重,移除相同的行。产生新虚拟表。使用GROUP BY后,DISTINCT多余。
- ORDER BY,按照对指定列升序或降序。返回游标,而不是虚拟表。
- LIMIT,取出指定行的记录,产生虚拟表并返回结果。Limit m,n表示从第m到第n数据。