搬运工:原网址关于sql和MySQL的语句执行顺序(必看!!!) - New.Young - 博客园,侵删
背景
刷题时看到类似下面的SQL命令,突然灵光一现,TOP按道理是最后一步选出最高值,为什么会第一个写?升降序和where那个先运行?SQL计算应该会像加减乘除一样有顺序吧?
结果
不出所料,果然存在顺序,看下来还感觉层层递进,想来对后期的语句优化应该也会有帮助。
sql执行顺序
开始-from> on>join>where>group by>having >select >distinct >order by >top-结束
示例
select 考生姓名, max(总成绩) as max总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩) > 600
order by max总成绩
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用,感谢网友 zyt1369 提出这个问题)
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.