MySQL查询语句执行流程解析
对MySQL查询语句的执行顺序进行了梳理。
(1) FROM子句 - 最先执行
从FROM employees e
开始,MySQL会率先读取FROM子句中所涉及的表的相关信息。
(2) ON条件 - 连接条件筛选
以JOIN departments d ON e.dept_id = d.id
为例,此步骤是对连接起来的表的行进行匹配,只有满足ON条件的行才会被保留下来。
(3) JOIN操作 - 开展表连接
MySQL支持多种连接方式,像INNER JOIN、LEFT/RIGHT JOIN、CROSS JOIN等都包含在内。
(4) WHERE条件 - 行级过滤
例如WHERE e.salary > 5000 AND d.location = 'NY'
,在这个阶段不能使用SELECT中的别名,也不能使用聚合函数(比如COUNT、SUM等)。
(5) GROUP BY - 分组操作
比如GROUP BY d.name, e.position
,可以对不在SELECT中的列进行分组,分组之后每组会生成一行结果。
(6) WITH CUBE/ROLLUP - 生成超组
像GROUP BY d.name WITH ROLLUP
这样的语句,会生成小计和总计的行。
(7) HAVING - 分组后过滤
例如HAVING AVG(e.salary) > 6000
,在这里可以使用聚合函数,也能够使用SELECT中定义的别名。
(8) SELECT - 选择输出列
比如SELECT d.name, AVG(e.salary) as avg_sal
,会进行表达式计算以及函数调用,并且定义列的别名。
(9) DISTINCT - 去重操作
比如SELECT DISTINCT department
,MySQL有可能在GROUP BY的时候就已经完成了去重工作。
(10) ORDER BY - 结果排序
例如ORDER BY avg_sal DESC
,可以使用SELECT中定义的别名,对最终的结果集进行排序,不过这部分性能消耗比较大。
(11) LIMIT - 结果限制
像LIMIT 10 OFFSET 5
,这是MySQL特有的语法,其他数据库可能有不同的实现方式,它的作用是限制返回的行数。
恐惧并非实际存在的事物,它只是我们内心对未来的一种自我暗示,是由心灵衍生而来的产物。-- 烟沙九洲
◀
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12603.html