SQL 查询执行顺序与书写规范
一、SQL 语句关键词顺序与执行顺序
查询中用到的关键词主要包含六个,书写顺序依次为:
select → from → where → group by → having → order by
其中 select 和 from 是必须的,其他关键词可选。但这六个关键词的执行顺序与书写顺序不同,实际执行顺序如下:
from → where → group by → having → select → order by
各阶段作用说明:
- from:需要从哪个数据表检索数据
- where:过滤表中数据的条件
- group by:如何将上面过滤出的数据分组
- having:对上面已经分组的数据进行过滤的条件
- select:查看结果集中的哪个列,或列的计算结果
- order by:按照什么样的顺序来查看返回的数据
示例:
SELECT s.学号, c.班级名 -- ⑤ 决定要显示哪些列
FROM dbo.学生信息 as s -- ① 20 条记录
full join [dbo].[班级信息] as c
on c.班级编号 = s.所属班级
WHERE s.学号 is null OR c.班级编号 is null -- ② 过滤了18条
-- group by xxx -- ③
-- having xxx -- ④
ORDER BY s.学号 -- ⑥ 对显示的列进行排序Code language: JavaScript (javascript)
二、解析顺序与书写建议
from后面的表关联,是自右向左解析的;where条件的解析顺序是自下而上的。- 写 SQL 语句时,尽量把数据量大的表放在最右边来进行关联,而把能筛选出大量数据的条件放在
where语句的最下面。
三、SQL Select 语句完整执行顺序(从 DBMS 使用者角度)
from子句组装来自不同数据源的数据;where子句基于指定的条件对记录行进行筛选;group by子句将数据划分为多个分组;- 使用聚集函数进行计算;
- 使用
having子句筛选分组; - 计算所有的表达式;
- 使用
order by对结果集进行排序。
四、注意
- having 子句:很耗资源,尽量少用。
- on 与 where 的执行时机:在多表联接查询时,
on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。 - select 子句:少用
*号,尽量写字段名称。在解析的过程中,会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的,使用列名意味着将减少消耗时间。 - order by 子句:执行顺序为从左到右排序,很耗资源。
Previous: 连接查询
Next: 执行时间统计与性能检测