Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > SQL查询执行顺序

SQL查询执行顺序分析

作者:emanjusaka

这篇文章主要为大家介绍了SQL查询执行顺序分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

了解 SQL 查询的执行顺序对我们解决一些问题很有帮助,有时我们可能会疑惑为什么不能对分组的结果进行筛选这样类似的问题?之前一直不是理解这个问题,在了解了SQL 查询的执行顺序之后这个问题也就迎刃而解。在我们对 SQL 查询语句进行分析优化时,掌握执行顺序也是有一定帮助的。

一、理论顺序

上面是图示 SQL 的执行顺序,下面用列表列出:

上面所列出的执行顺序能帮助我们解答一些问题:

二、代码示例

学生表

成绩

查询语句

查询来自天津且总成绩高于70分,并且查询他们的总成绩,查询结果按成绩降序排列

SELECT
	ss.student_id,sum(se.grade) as total,ss.city
FROM
	students ss
	LEFT JOIN score se ON ss.student_id = se.student_id 
WHERE
	ss.city = "天津"
GROUP BY ss.student_id
HAVING sum(se.grade) > 70
ORDER BY total DESC
LIMIT 10

查询结果

三、分析 SQL 执行过程

SQL 运行的每个操作都会产生一张虚拟表,只不过这些虚拟表对用户是透明的,只有最后一步生成的虚拟表才会返回给用户。

四、注意

上面所讨论的顺序皆为理论上的执行顺序,实际上数据库引擎并不是通过连接、过滤和分组来运行查询,因为它实现了一系列优化来提升查询速度(不影响最终的返回结果)。数据库引擎可能会为了提高查询的速度把一些过滤条件进行提前,当然前提是不会对返回的结果造成影响。

SELECT
	ss.student_id,sum(se.grade) as total,ss.city
FROM
	students ss
	LEFT JOIN score se ON ss.student_id = se.student_id 
WHERE
	ss.city = "天津"

这个 sql 学生城市是天津的只有三个,如果在学生很多的情况下如果先做城市的筛选后再对两张表做笛卡尔积可以很大程度的提升性能,并且也不会对返回的结果造成影响。这时实际上SQL的执行顺序可能就与理论上的执行顺序不一样了。

参考资料 SQL queries don't start with SELECT

以上就是SQL查询执行顺序分析的详细内容,更多关于SQL查询执行顺序的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文