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,并返回给查询用户