💖简介
在MySQL
中,SQL
查询语句的执行遵循一定的逻辑顺序,即使这些关键字在SQL
语句中的物理排列可能有所不同。
🌟语句顺序
(8) SELECT (9) 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) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <offset,limit_number>
✨执行顺序
from
对
from
子句中的左表<left_table>
和右表<right_table>
执行笛卡尔积,得到虚拟表VT1
。
on
对前面生成的虚拟表
VT1
进行ON
筛选,符合条件的会被记录到虚拟表VT2
中。
join
如果是
OUT JOIN
,那么将保留表中(如左表或者右表)未匹配的行作为外部行添加到虚拟表VT2
中,从而产生虚拟表VT3
;
WHERE
对步骤3产生的虚拟表
VT3
进行过滤,只有符合条件<where_condition>
的记录才会插入新的虚拟表VT4
。
group by
根据
group by
子句中的列,对步骤4的记录进行分组操作得到虚拟表VT5
。
with {CUBE|ROLLUP}
如果指定了
ROLLUP
选项,将创建一个额外的记录添加到虚拟表VT5
的最后,并生成虚拟表VT6
。
HAVING
对虚拟表
VT6
进行HAVING
条件过滤,只有符合的记录才会被插入到虚拟表VT7
中;
Select
将
Select
中指定的列从上一步产生的虚拟表中选出,插入虚拟表VT8
Distinct
如果在查询中指定了
distinct
子句,则会创建一张内存临时表VT9
Order by
根据
order by
指定的列对上一步输出的虚拟表进行排列,返回新的虚拟表VT10
Limit
选出指定位置开始的指定行数据,生成虚拟表
VT11
,并返回结果
结果