sql执行先后顺序口诀:SQL执行先后顺序口诀,轻松掌握查询逻辑
SQL执行顺序口诀
“FROM先行定范围,WHERE过滤再分组;
HAVING后选结果,ORDER BY终排序。”
口诀解析
FROM先行定范围
SQL查询的起点是FROM子句,用于指定查询的数据源(表或子查询),在执行时,数据库会先从数据源中读取数据,确定查询的范围。SELECT name, age FROM users WHERE age > 18;
这里,
FROM users先确定了数据来源为users表。WHERE过滤再分组
在确定数据范围后,WHERE子句用于对数据进行条件过滤,过滤后的结果再进入GROUP BY子句进行分组操作。SELECT department, COUNT(*) FROM employees WHERE salary > 50000 GROUP BY department;
先过滤出薪资大于5万的员工,再按部门分组统计人数。
HAVING后选结果
HAVING子句用于对分组后的结果进行进一步筛选,它通常与GROUP BY配合使用,注意,HAVING的优先级低于WHERE,但高于SELECT。SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) > 10;
先分组,再筛选出员工数超过10的部门。
ORDER BY终排序
ORDER BY子句用于对最终结果进行排序,LIMIT子句用于限制返回的行数,排序操作在所有筛选和聚合操作完成后执行。SELECT name, age ORDER BY age DESC LIMIT 5;
先选出数据,再按年龄降序排列,最后返回前5条。
实际应用示例
假设有一个orders表,包含order_id、customer_id、order_date和amount字段,我们想查询金额最高的前3个订单,并按日期降序排列。
SELECT order_id, amount FROM orders WHERE amount > 1000 GROUP BY order_id HAVING MAX(amount) > 1500 ORDER BY order_date DESC LIMIT 3;
按照口诀的顺序执行:
FROM orders确定数据源;WHERE amount > 1000过滤订单;GROUP BY order_id分组;HAVING MAX(amount) > 1500筛选分组结果;ORDER BY order_date DESC排序;LIMIT 3限制返回行数。
注意事项
- 子查询的处理:如果SQL中包含子查询,数据库可能会先执行子查询,再处理主查询,口诀中的顺序仍需结合子查询的逻辑调整。
- 窗口函数:在涉及窗口函数的查询中,执行顺序可能会更复杂,需结合具体数据库的执行计划分析。
通过“FROM先行定范围,WHERE过滤再分组;HAVING后选结果,ORDER BY终排序”这一口诀,开发者可以快速回顾SQL查询的执行逻辑,掌握执行顺序不仅能提高代码的可读性,还能帮助优化查询性能,在实际开发中,建议结合数据库的执行计划工具(如EXPLAIN)进一步验证和优化查询逻辑。

相关文章:
文章已关闭评论!










