第五章:排序与分页
5.1:排序数据
-
数据排序
- 使用
ORDER BY
子句排序ASC(ascend)
:升序DESC(descend)
:降序
OEDER BY
子句在SELECT
语句的结尾
- 使用
-
单列排序
SELECT employee_id, last_name, salary FROM employees ORDER BY salary DESC;
注意:
- 如果在
ORDER BY
后没有显式指明排序的方式的话,则默认按照升序排序。 - 我们可以使用列的别名,进行排序。
- 列队别名只能在
ORDER BY
中的使用,不能在WHERE
中使用。
- 如果在
-
多列排序
SELECT employee_id, salary, department_id FROM employees ORDER BY department_id DESC, salary ASC;
注意:
- 可以使用不在
SELECT
列表中的列排序。 - 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,对会对第二列进行排序。如果第一列数据中所有的值都是唯一的,将不再对第二列进行排序。
- 可以使用不在
5.2:分页
5.1:实现规则
-
分页原理
所谓分页 显示,就是将数据库中的结果集,一段一段显示出来需要的条件。
-
MySQL
中使用LIMIT
实现分页 -
格式
LIMIT [位置偏移量,] 行数
- 参数1:第一个"位置偏移量"参数指示
MySQL
从哪一行开始显示,是一个可选参数,如果不指定"位置偏移量",将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推)。 - 参数2:第二个参数"行数"指示返回的记录条数。
- 参数1:第一个"位置偏移量"参数指示
-
举例
# 每页显示20条记录,此时显示第1页 SELECT employee_id, last_name FROM employees LIMIT 0, 20; # 每页显示20条记录,此时显示第1页 SELECT employee_id, last_name FROM employees LIMIT 20; # 表里有107条数据,我们只想要显示第 32、33 条数据 SELECT employee_id, last_name FROM employees LIMIT 2 OFFSET 31;
MySQL 8.0
中可以使用LIMIT 3 OFFSET 4
,意思是获取从第5条记录开始后面的3条记录,和LIMIT 4, 3
返回的结果相同。 -
分页显示公式
(当前页数 - 1) * 每页条数,每页条数
SELECT * FROM `table` LIMIT (PageNo - 1) * PageSize, PageSize;
-
注意:
LIMIT
子句必须放在整个SELECT
语句的最后。 -
使用
LIMIT
的好处 约束返回结果的数据可以减少数据表的网络传输,也可以提升查询效率。如果我们知道返回结果只有1条,就可以使用
LIMIT 1
,告诉SELECT
语句只需返回一条记录即可,这样的好处就是SELECT
不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
-
5.2:拓展
在不同的DBMS
中使用的关键字可能不同。在MySQL
、PostgreSQL
、MariaDB
和SQLite
中使用LIMIT
关键字,而且需要放到SELECT
语句的最后面。
-
如果是
SQL Server
和Access
,需要使用TOP
关键字,比如:SELECT TOP 5 name, hp_max FROM heros ORDER BY hp_max DESC
-
如果是
DB2
,使用FETCH FIRST 5 ROWS ONLY
这样的关键字SELECT name, hp_max FROM heros ORDER BY hp_max DESC FETCH FIRST 5 ROWS ONLY
-
如果是
Oracle
,你需要基于ROWNUM
来统计行数SELECT rownum,last_name,salary FROM employees WHERE rownum < 5 ORDER BY salary DESC;