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 为什么要分页
- 数据太多,不便查看
- 多个数据,仅需几行
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; |