整理了下MySQL查询语句的执行顺序。
(1) FROM
(2) ON
(3) JOIN
(4) WHERE
(5) GROUP BY
(6) WITH (CUBE|ROLLUP)
(7) HAVING
(8) SELECT
(9) DISTINCT
(10) ORDER BY
(11) LIMIT
(1) FROM 子句 – 首先执行
FROM employees e
- MySQL 会先读取 FROM 子句中的表信息
(2) ON 条件 – 连接条件过滤
JOIN departments d ON e.dept_id = d.id
- 对连接表的行进行匹配
- 只有满足 ON 条件的行才会被保留
(3) JOIN 操作 – 执行表连接
- MySQL 支持多种连接方式:INNER JOIN、LEFT/RIGHT JOIN、CROSS JOIN
(4) WHERE 条件 – 行级过滤
WHERE e.salary > 5000 AND d.location = 'NY'
- 此时不能使用 SELECT 中的别名
- 不能使用聚合函数(如 COUNT, SUM 等)
(5) GROUP BY – 分组操作
GROUP BY d.name, e.position
- 可以 GROUP BY 不在 SELECT 中的列
- 分组后每组生成一行结果
(6) WITH CUBE/ROLLUP – 生成超组
GROUP BY d.name WITH ROLLUP
- 生成小计和总计行
(7) HAVING – 分组后过滤
HAVING AVG(e.salary) > 6000
- 可以使用聚合函数
- 可以使用 SELECT 中的别名
(8) SELECT – 选择输出列
SELECT d.name, AVG(e.salary) as avg_sal
- 计算表达式和函数调用
- 定义列别名
(9) DISTINCT – 去重操作
SELECT DISTINCT department
- MySQL 可能在 GROUP BY 时就已经去重
(10) ORDER BY – 结果排序
ORDER BY avg_sal DESC
- 可以使用 SELECT 中定义的别名
- 对最终结果集排序,性能消耗较大
(11) LIMIT – 结果限制
LIMIT 10 OFFSET 5
- MySQL 特有语法,其他数据库可能用不同方式
- 限制返回的行数
恐惧不是真实的,它只是对未来的一种自我暗示,是我们心灵的产物。– 烟沙九洲
◀
来源链接:https://www.cnblogs.com/yanshajiuzhou/p/18903288
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容