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 完整执行流程

  1. FROM & JOIN:确定主表和连接表
  2. WHERE:过滤行级数据
  3. GROUP BY:分组操作
  4. HAVING:分组后过滤
  5. SELECT:选择字段
  6. ORDER BY:排序结果
  7. LIMIT:限制行数

4.2 实际执行顺序

SELECT DISTINCT column1, aggregate_func() 
FROM table
WHERE condition
GROUP BY column 
HAVING condition 
ORDER BY column 
LIMIT count;

五、性能优化建议

  1. 索引优化:在WHEREORDER BY涉及的列上创建索引
  2. 避免全表扫描:使用EXPLAIN分析执行计划
  3. 分页优化:使用WHERE id > ?代替LIMIT N,M
  4. 缓存机制:合理使用查询缓存

六、进阶技巧

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;

七、调试技巧

  1. 使用EXPLAIN查看执行计划
  2. 分析慢查询日志
  3. 使用PROFILE分析性能瓶颈
正文到此结束
评论插件初始化中...
Loading...