MySQL:分组、排序、分页查询与执行顺序详解
一、分组查询(GROUP BY)
1.1 基础分组查询
当需要将数据按指定列分组统计时,使用GROUP BY
子句:
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;
这个查询会统计每个部门的员工数量。
1.2 分组筛选(HAVING)
HAVING
用于对分组后的结果进行筛选:
SELECT department_id, AVG(salary) avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000;
1.3 聚合函数组合
支持COUNT()
、SUM()
、MAX()
等函数:
SELECT
department_id,
COUNT(*) total_emp,
MAX(salary) top_salary
FROM employees
GROUP BY department_id;
二、排序查询(ORDER BY)
2.1 基础排序
SELECT * FROM products
ORDER BY price DESC;
2.2 多字段排序
SELECT product_name, price, stock
FROM products
ORDER BY stock DESC, price ASC;
三、分页查询(LIMIT)
3.1 基础分页
SELECT * FROM orders
ORDER BY order_date DESC
LIMIT 10 OFFSET 20;
3.2 性能优化方案
SELECT * FROM products
WHERE id > 1000
ORDER BY id
LIMIT 10;
四、SQL执行顺序
4.1 完整执行流程
- FROM & JOIN:确定主表和连接表
- WHERE:过滤行级数据
- GROUP BY:分组操作
- HAVING:分组后过滤
- SELECT:选择字段
- ORDER BY:排序结果
- LIMIT:限制行数
4.2 实际执行顺序
SELECT DISTINCT column1, aggregate_func()
FROM table
WHERE condition
GROUP BY column
HAVING condition
ORDER BY column
LIMIT count;
五、性能优化建议
- 索引优化:在
WHERE
和ORDER BY
涉及的列上创建索引 - 避免全表扫描:使用
EXPLAIN
分析执行计划 - 分页优化:使用
WHERE id > ?
代替LIMIT N,M
- 缓存机制:合理使用查询缓存
六、进阶技巧
6.1 ROLLUP扩展
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id WITH ROLLUP;
6.2 窗口函数
SELECT
employee_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC)
FROM employees;
七、调试技巧
- 使用
EXPLAIN
查看执行计划 - 分析慢查询日志
- 使用PROFILE分析性能瓶颈
正文到此结束
相关文章
热门推荐
评论插件初始化中...