目录
一. 排序数据
1.1 排序规则
1.2 单列排序
1.我们也可以使用列的别名,给别名进行排序
2.列的别名只能在 ODER BY 中使用, 不能在WHERE中使用。
3.强调格式:WHERE 需要在 FROM 后, ORDER BY 之前
1.3 二级排序(多列排序)
二、分页
2.1 背景
2.2 实现规则
2.3 WHERE ... ORDER BY ... LIMIT 声明顺序如下
2.5 OFFSET,8.0新特性
2.4 扩展
三、练习
1. 查询员工的姓名和部门号和年薪, 按年薪降序, 按姓名升序显示
2、选择工资不在 8000 到 17000 的员工的姓名和工资, 按工资降序,显示第 21 到 40 位置的数据
3. 查询名字中包含 e 的员工信息, 并按名字的字节数降序,再按部门号升序
一. 排序数据
1.1 排序规则
- 使用 ORDER BY 子句排序
- ASC(ascend): 升序
- DESC(descend):降序
- ORDER BY 子句在SELECT语句的结尾。
1.2 单列排序
#1.排序
# 如果有没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的
#SELECT * FROM employees;
# 练习:按照salary从高到低的顺序显示员工信息
# 使用 ORDER BY 对查询到的数据进行排序操作
# 升序:AEC(ascend)
# 降序:DESC(descend)
SELECT employee_id, name, salary
FROM employees
ORDER BY salary;
#如果没有在ODER BY 后指明排序方式,则默认按照升序排序
SELECT employee_id, name, salary
FROM employees
ORDER BY salary DESC;
1.我们也可以使用列的别名,给别名进行排序
# 我们可以使用列的别名,进行排序
SELECT employee_id, name, salary, salary * 12 annual_sal
FROM employees
ORDER BY annual_sal;
2.列的别名只能在 ODER BY 中使用, 不能在WHERE中使用。
SELECT employee_id, salary, salary * 12 annual_sal
FROM employees
WHERE annual_sal > 10000;
3.强调格式:WHERE 需要在 FROM 后, ORDER BY 之前
SELECT employee_id, salary,depart_id
FROM employees
WHERE depart_id IN (1,2)
ORDER BY depart_id DESC;
1.3 二级排序(多列排序)
练习:显示员工信息,按照depart_id的降序排序,salary的升序排序
# 4.二级排序
# 练习:显示员工信息,按照depart_id的降序排序,salary的升序排序
SELECT Name, salary, depart_id
FROM employees
ORDER BY depart_id DESC ,salary DESC;
- 可以使用不在SELECT列表中的列排序。
- 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
二、分页
2.1 背景
背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?
背景2:表里有 4 条数据,我们只想要显示第 2、3 条数据怎么办呢?
2.2 实现规则
- 分页原理
- 所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。
- MySQL中使用 LIMIT 实现分页
- 格式:
LIMIT [位置偏移量,] 行数
第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
示例:
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
# 2. 分页
# 2.1 mysql使用limit实现数据的分页显示
# 需求: 每页显示20条记录, 此时显示第一页
SELECT employee_id, Name
FROM employees
LIMIT 0, 20;
# 2.2 mysql使用limit实现数据的分页显示
# 需求: 每页显示20条记录, 此时显示第二页
SELECT employee_id, Name
FROM employees
LIMIT 20, 20;
MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。
# 需求: 每页显示pageSize条记录, 此时显示第pageNo页
- 分页显式公式:(当前页数-1)*每页条数,每页条数
-
SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;
- 注意:LIMIT 子句必须放在整个SELECT语句的最后!
使用 LIMIT 的好处
- 约束返回结果的数量可以 减少数据表的网络传输量 ,也可以 提升查询效率 。如果我们知道返回结果只有1 条,就可以使用 LIMIT 1 ,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
2.3 WHERE ... ORDER BY ... LIMIT 声明顺序如下
# 2.3 WHERE ... ORDER BY ... LIMIT 声明顺序如下:
SELECT employee_id, Name, salary
FROM employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 10;
2.5 OFFSET,8.0新特性
# 联系:表里有107条数据,我们只想要显示 32, 33条数据怎么办?
SELECT employee_id, Name
FROM employees
LIMIT 31 OFFSET 2;
2.4 扩展
# LIMIT 可以使用在 MySQL、PGSQL、MariaDB、 SQLite 等数据库中使用, 表示分页。
# 不能使用在 SQL Server、DB2、 Oracle
在不同的 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;
需要说明的是,这条语句是先取出来前 5 条数据行,然后再按照 hp_max 从高到低的顺序进行排序。但这样产生的结果和上述方法的并不一样。我会在后面讲到子查询,你可以使用如下方式得到与上述方法一直的结果.
三、练习
1. 查询员工的姓名和部门号和年薪, 按年薪降序, 按姓名升序显示
SELECT name, department_id, salary * 12 annual_sal
FROM employees
ORDER BY annual_sal DESC, Name ASC;
2、选择工资不在 8000 到 17000 的员工的姓名和工资, 按工资降序,
显示第 21 到 40 位置的数据
SELECT name, salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC
LIMIT 20, 20;
3. 查询名字中包含 e 的员工信息, 并按名字的字节数降序,再按部门号升序
SELECT employee_id, Name, department_id
FROM employees
WHERE Name like '%e%'
# WHERE Name REGEXP '{e}'
ORDER BY LENGTH(Name) DESC,department_id ASC;
今天就先到这了!!!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。