MySQL 排序与分页实战:3 道经典练习题解析

排序(ORDER BY)和分页(LIMIT)是 MySQL 查询中处理结果集的核心操作,常用于数据展示、报表生成等场景。本文通过 3 道实战练习题,详解排序与分页的组合用法,帮你掌握复杂结果集的处理技巧。

一、多条件排序:按年薪和姓名组合排序

题目 1

查询员工的姓名、部门号和年薪,按年薪降序、姓名升序显示。

解决方案

1
2
3
4
5
6
7
SELECT 
last_name,
department_id,
salary * 12 AS annual_sal -- 计算年薪并起别名
FROM employees
ORDER BY annual_sal DESC, -- 先按年薪降序(高薪在前)
last_name ASC; -- 年薪相同时按姓名升序(A-Z)

知识点解析

  1. 计算字段与别名:salary * 12 计算年薪,用 AS 定义别名 annual_sal,简化排序条件;

  2. 多列排序规则

    • 先按第一个字段(annual_sal)排序,DESC 表示降序;
    • 当第一个字段值相同时,再按第二个字段(last_name)排序,ASC 表示升序(默认可省略);
  1. 排序依据:支持使用计算字段或别名排序,无需重复写计算逻辑(如直接用 annual_sal 而非 salary*12)。

二、条件筛选 + 排序 + 分页:精准提取指定范围数据

题目 2

选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第 21 到 40 位置的数据。

解决方案

1
2
3
4
5
6
7
SELECT 
last_name,
salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000 -- 筛选工资不在8000-17000的员工
ORDER BY salary DESC -- 按工资降序排序
LIMIT 20, 20; -- 从第21条开始(偏移量20),取20条(21-40)

知识点解析

  1. 范围筛选:NOT BETWEEN 8000 AND 17000 等价于 salary < 8000 OR salary > 17000,用于排除指定区间的数据;

  2. 分页逻辑

    • LIMIT 偏移量, 行数 中,偏移量从 0 开始计数;
    • 第 21 到 40 条记录:偏移量 = 20(前 20 条跳过),行数 = 20(取 20 条);
  1. 执行顺序:先筛选(WHERE)、再排序(ORDER BY)、最后分页(LIMIT),确保分页基于筛选后的有序结果。

三、函数 + 排序:按字段长度排序

题目 3

查询邮箱中包含字母e的员工信息,先按邮箱的字节数降序,再按部门号升序。

解决方案

1
2
3
4
5
6
7
8
SELECT 
last_name,
email,
department_id
FROM employees
WHERE email REGEXP '[e]' -- 筛选邮箱包含e的员工(等价于 LIKE '%e%')
ORDER BY LENGTH(email) DESC, -- 按邮箱字节数降序(长邮箱在前)
department_id ASC; -- 字节数相同时按部门号升序

知识点解析

  1. 模糊筛选
    • email REGEXP ‘[e]’ 与 email LIKE ‘%e%’ 功能相同,均匹配包含e的邮箱;
    • REGEXP 支持更复杂的正则匹配,LIKE 适合简单通配符场景;
  1. 字符串长度函数:LENGTH(email) 计算邮箱的字节数(注意:中文在不同编码下字节数可能不同,此处针对英文邮箱);

  2. 多维度排序:先按 “邮箱长度” 这一动态计算值排序,再按 “部门号” 这一字段排序,满足复杂业务需求。

总结:排序与分页核心要点

操作场景 关键语法 / 函数 注意事项
多列排序 ORDER BY 字段1 DESC, 字段2 先按字段 1 排序,值相同时再按字段 2 排序
分页查询 LIMIT 偏移量, 行数 偏移量从 0 开始,需结合ORDER BY确保顺序
范围筛选 BETWEEN…AND/NOT BETWEEN 闭区间包含边界值,反向筛选用NOT
字符串长度计算 LENGTH(字段) 返回字节数,适合英文等单字节字符
模糊匹配 LIKE ‘%e%’/REGEXP ‘[e]’ 简单场景用LIKE,复杂模式用REGEXP

通过这 3 道题可以看出,排序与分页很少单独使用,通常需结合条件筛选、函数计算等操作。掌握它们的组合逻辑,能帮你高效处理各类结果集展示需求,无论是前端列表分页还是后台数据导出,都能应对自如。