MySQL中SELECT的执行顺序

天天在写SELECT查询,你知道SELECT的执行顺序吗?

通过下面这张图可以知道SELECT的大概执行顺序:
在这里插入图片描述
SELECT语句的完整语法为:

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
-- 在语法面前的序号为执行顺序

MySQL的执行顺序分为十步,如上所标注的一样,最先执行的是FROM操作,最后执行的是LIMIT操作。其中每一步操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只不过这些虚拟的表对于用户来说是透明的,只有最后的一张表才会当作结果进行返回。如果没有在语句中指定某个子句,则会跳过相应的步骤。

接下来分析一下查询语句的每一个阶段:

SELECT a.customer_id, COUNT(b.order_id) as total_orders
FROM table1 AS a
LEFT JOIN table2 AS b
ON a.customer_id = b.customer_id
WHERE a.city = 'hangzhou'
GROUP BY a.customer_id
HAVING count(b.order_id) < 2
ORDER BY total_orders DESC;

1:FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。
2:ON:ON: 对虚表VT1进行ON过滤,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
3:JOIN:如果指定了OUTER JOIN(比如LEFT JOIN、RIGHT JOIN),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。
4:WHERE:对虚拟表VT3进行WHERE条件过滤操作,只有符合<where_condition>的记录才会被插入到虚拟表VT4中。
5:GROUO BY:根据GROUO BY子句中的列,对VT4中的操作进行分组操作,产生VT5。
6:HAVING:对虚拟表VT5应用HAVING过滤,只有符合<having_condition>的记录才会被插入到虚拟表VT6中。
7:SELECT:执行SELECT操作,选择指定的列,插入到VT7中。
8:DISTINCT:对虚拟表VT7中的数据进行去重处理产生VT8。
9:ORDER BY:对虚拟表VT8中的记录按照<order_by_condition>进行排序,产生虚拟表VT9。
10:LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。

猜你喜欢

转载自blog.csdn.net/weixin_43894879/article/details/106431555
今日推荐