【MySQL】SELECT执行顺序
1.常见的查询结构
方式1:
SELECT ...,...,... 选择的字段
FROM ...,...,... 从哪些表中筛选
WHERE ...AND... 多表的连接条件,不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ...ASC/DESC 排序
LIMIT ...,... 分页
方式2:
SELECT ...,...,...
FROM ...
JOIN ... ON ... 多表的连接条件
JOIN ... ON ...
WHERE ... AND/OR... 不包含组函数的过滤条件
GROUP BY ...,...
HAVING ... 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
2.SELECT执行顺序
(1)关键字的顺序
SELECT...FROM...WHERE...GROUP BY ... HAVING ... ORDER BY ... LIMIT ...
(2)SELECT语句的执行顺序
每一个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT的字段 -> DISTINCT -> ORDER BY -> LIMIT
3.SQL执行原理
(1)先执行FROM
,如果是多张表联查
① 先通过CROSS JOIN
求笛卡尔积,得到虚拟表vt1-1。
② 通过ON
对vt1-1进行筛选,得到虚拟表vt1-2。
③ 使用的是左连接、右连接或者全连接,就会在vt1-2上增加外部行,得到vt1-3。
④ 两张表以上则会重复以上操作,直到所有表都被处理完为止
(2)假设拿到了查询数据表的原始数据 vt1,经过WHERE
筛选过滤,得到虚拟表vt2
(3)经过GROUP BY
分组得到vt3
(4)经过HAVING
进行分组过滤得到vt4
(5)经过SELECT
筛选字段得到vt5-1,经过DISTINCT
去重得到虚拟表vt5-2
(6)经过ORDER BY
排序得到虚拟表vt6
(7)经过LIMIT
分页得到vt7