SQL的执行顺序
|
freeflydom
2026年2月5日 16:2
本文热度 120
|
一、SQL的书写顺序
要想了解SQL的执行顺序,先要了解SQL的书写顺序,以下是最常见的SQL语句的select语句的书写结构:
SELECT DISTINCT 列1, 聚合函数(列2) AS 别名
FROM 表1
JOIN 表2 ON 表1.键 = 表2.键
WHERE 行过滤条件
GROUP BY 分组列
HAVING 分组过滤条件
ORDER BY 排序列 [ASC/DESC]
LIMIT 行数;
二、SQL的执行顺序
数据库引擎严格按以下步骤执行,每一步会生成一个临时结果集,作为下一步的输入。
1、from 加载from后的主表
2、join 与其他表进行笛卡尔积,并通过on进行过滤
3、where 过滤行数据,仅保留满足条件的行
4、group by 按指定列分组,将上一步生成的临时表按group by后的条件分组
5、having 过滤分组结果,仅保留满足条件的分组
6、select 确定最终返回列
7、order by 对结果排序,按指定列进行排序
8、limit 限制返回行数(部分数据库支持)

三、注意事项
1、where和having的差别
2、group by 的列必须在select函数中,且只能包含分组的列和聚合函数
group by实际上是将要分组的属性一致的字段合并为一组,而select实际上是在分组后的数据中选取需要的列,因此,每个组包含多行原始数据,非分组属性在组内可能出现不同的值,数据库无法判断应该输出哪一个。
3、order by可以用select的别名,但是where和having不行
因为where和having在select之前执行,而order by在select之后执行
四、示例讲解
SELECT
class,
AVG(score) AS avg_score
FROM student
WHERE score > 0
GROUP BY class
HAVING AVG(score) ≥ 80
ORDER BY avg_score DESC
LIMIT 2;
1、from student:加载student表的所有数据
2、where score > 0: 过滤所有分数大于0的数据,即删除所有分数小于等于0的数据
这里不能使用聚合函数,例如count(*)>0,因为还没有分组
3、group by class:按班级分组
4、having AVG(score)>=80:过滤平均分大于等于80的分组,即删除所有平均分小于80的分组
5、select class,AVG(score) as avg_score:选择班级和平均分(别名avg_score)
此时AVG(score) as avg_score才执行,之前的where和having不能使用select中的别名
6、order by avg_score desc:按平均分降序排序
7、limit 2:取前2名
转自https://blog.csdn.net/2302_79345957/article/details/151764273
该文章在 2026/2/5 16:04:22 编辑过