MySQL 排序与分页


1. 排序数据

1.1 排序规则

  • 默认按添加顺序显示

  • 使用 ORDER BY 子句排序

    • ASC(ascend):升序 (默认,可不写)
    • DESC(descend):降序
  • ORDER BY 子句在 SELECT 语句的结尾(有WHERE就在WHERE后)

  • 注意:列的别名只能在 ORDER BY 中使用, 不能在 WHERE 中使用

    原因:运行时先筛选数据(FROM,WHERE),再看要那几列、有啥别名(SELECT),最后 排序(ORDER BY)

    关于执行顺序后续还会详细学习,此处仅为理解注意点用


1.2 单列排序

eg:

mysql 复制代码
mysql> SELECT
    -> employee_id, last_name, salary
    -> FROM employees
    -> ORDER BY salary;

mysql 复制代码
mysql> SELECT
    -> employee_id, last_name, salary
    -> FROM employees
    -> ORDER BY salary ASC;

mysql 复制代码
mysql> SELECT
    -> employee_id, last_name, salary
    -> FROM employees
    -> ORDER BY salary DESC;

1.3 多列排序

  • ORDER BY A,B,... N DESC;
    先排A,A中相同的用B排......

eg:

mysql 复制代码
mysql> SELECT
    -> employee_id,salary, department_id
    -> FROM employees
    -> ORDER BY department_id,salary ASC;

注意:

  • 可以使用不在 SELECT 列表中的列排序
  • 排第一个的时候有相同值才会排第二个

2. 分页

2.1 为什么要分页

  1. 数据太多,不便查看
  2. 多个数据,仅需几行

2.2 实现规则

  • 分页的原理:

    将数据库中的结果集,一段一段显示出来所需的条件

  • MySQL中使用 LIMIT 实现分页

  • 格式:
    LIMIT 位置偏移量, 行数
    LIMIT pageNumber*(pageSize-1), pageSize

    • 偏移量: 相对第一行偏移的量
      其实就是你想从第 n 行开始显示,偏移量就是 n-1
      可选参数,如果不指定"位置偏移量",将会从表中的第一条记录开始,相当于默认偏移量为0
      第一条记录的位置偏移量是0,第二条记录的位置偏移量是 1,以此类推
    • 行数: 字面意思,显示几行
    • 显示 >偏移量,≤偏移量+行数 的行
  • LIMIT子句必须放在整个SELECT语句的最后

MySQL 8.0 新特性:

LIMIT 3 OFFSET 4

表示:第五条后的第三条记录

其实就是偏移量和行数颠倒顺序,中间加个OFFSET

  • 使用 LIMIT 的好处
    约束返回结果的数量可以减少数据表的网络传输量 ,也可以提升查询效率
    eg:
    如果我们知道返回结果只有 1 条,就可以使用 LIMIT 1 ,告诉 SELECT 语句只需要返回一条记录即可
    这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回

2.3 拓展

在不同的 DBMS 中使用的关键字可能不同

数据库 (DBMS) 核心关键字 基础语法示例 (取前N行) 分页/偏移语法示例 (跳过M行取N行)
MySQL / MariaDB LIMIT SELECT * FROM 表名 LIMIT N; SELECT * FROM 表名 LIMIT N OFFSET M; 或简写为 LIMIT M, N;
PostgreSQL / SQLite LIMIT SELECT * FROM 表名 LIMIT N; SELECT * FROM 表名 LIMIT N OFFSET M;
SQL Server / Access TOP SELECT TOP N * FROM 表名; 需配合子查询或 OFFSET...FETCH (SQL Server 2012+)
Oracle ROWNUM / FETCH SELECT * FROM 表名 WHERE ROWNUM <= N; (注:需配合子查询先排序) 传统写法需嵌套子查询使用 ROWNUM; Oracle 12c+ 支持标准 OFFSET M ROWS FETCH NEXT N ROWS ONLY
DB2 FETCH FIRST SELECT * FROM 表名 FETCH FIRST N ROWS ONLY; SELECT * FROM 表名 OFFSET M ROWS FETCH FIRST N ROWS ONLY;

相关推荐
2603_965148117 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl7 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu8 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT8 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData8 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean9 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean9 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X9 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.10 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠10 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle