MySQL Select 语句执行顺序

一条 SQL 查询语句结构如下:

SELECT 
DISTINCT <select_list>
FROM <left_table> <join_type> JOIN <right_table> ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

但真正的执行步骤如下,执行时,每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入:

1. FROM

在这一步,无论后面跟那种联接运算(LEFT JOIN、RIGHT JOIN等),都首先执行交叉联接(CROSS JOIN),计算笛卡尔积,生成虚拟表 VT-1

2. ON

根据 ON 的筛选条件对 VT-1 进行筛选,生成 VT-2

3. JOIN

如果指定了OUTER JOIN(如 LEFT JOIN、RIGHT JOIN),将上一步没有匹配的行添加到 VT-2,生成 VT-3。例如 LEFT JOIN 会将左表的剩余数据添加到 VT-2 中

如果 FROM 子句包含两个以上表,则这一步最后生成的虚表 VT-3 和 FROM 子句的下一个表重复依次执行前述三个步骤,直到处理完所有的表为止

4. WHERE

根据条件对 VT-3 进行筛选,条件成立的行插入 VT-4

5. GROUP BY

按照指定的列名对 VT-4 的行进行分组,生成VT-5,最后每个分组只有一行

6. HAVING

使用聚合函数对 VT-5 的分组进行筛选,生成 VT-6

7. SELECT

投影获取指定的列,如有表达式则计算,生成 VT-7

8. DISTINCT

数据除重,生成 VT-8

9. ORDER BY

根据 ORDER BY 子句中指定的列排序,生成 VT-9

10. LIMIT

取出指定行的记录,产生 VT-10,并返回给查询用户

热门相关:国破山河在   开局签到荒古圣体   苍穹龙骑   韩娱之影帝   覆汉