MYSQL05_ORDR BY排序、LIMIT分组、GROUP BY分组

①. ORDER BY 排序数据

  • ①. 使用ORDER BY子句排序
    ASC(ascend): 升序、默认是升序
    DESC(descend):降序
# 如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的。
SELECT * FROM employees;
  • ②. 单列排序
# 练习:按照salary从高到低的顺序显示员工信息
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC;

# 练习:按照salary从低到高的顺序显示员工信息
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary ASC;

# 如果在ORDER BY 后没有显式指名排序的方式的话,则默认按照升序排列。
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary; 
  • ③. 可以使用列的别名进行排序,不能在where中使用,这是因为,我们在执行SQL语句的时候先执行的是FROM+WHERE再去查询各个字段
#我们可以使用列的别名,进行排序
SELECT employee_id,salary,salary * 12 annual_sal
FROM employees
ORDER BY annual_sal;

#列的别名只能在 ORDER BY 中使用,不能在WHERE中使用。
#如下操作报错!
SELECT employee_id,salary,salary * 12 annual_sal
FROM employees
WHERE annual_sal > 81600;
  • ④. 强调格式:WHERE 需要声明在FROM后,ORDER BY之前
#强调格式:WHERE 需要声明在FROM后,ORDER BY之前。
SELECT employee_id,salary
FROM employees
WHERE department_id IN (50,60,70)
ORDER BY department_id DESC;
  • ⑤. 二级排序
  1. 可以使用不在SELECT列表中的列排序。
  2. 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
# 显示员工信息,按照department_id的降序排列,salary的升序排列
SELECT employee_id,salary,department_id
FROM employees
ORDER BY department_id DESC,salary ASC;

②. LIMIT 分页查询

  • ①. 背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?
    背景2:表里有 4 条数据,我们只想要显示第 2、3 条数据怎么办呢?

  • ②. MySQL中使用LIMIT实现分页

  1. 格式:LIMIT[位置偏移量,]行数
  2. 第一个“位置偏移量”参数指示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;
  • ③. MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同
# 表里有107条数据,我们只想要显示第 32、33 条数据怎么办呢?
SELECT employee_id,last_name
FROM employees
LIMIT 31,2;

# MySQL8.0新特性:LIMIT ... OFFSET ...
#练习:表里有107条数据,我们只想要显示第 32、33 条数据怎么办呢?
SELECT employee_id,last_name
FROM employees
LIMIT 2 OFFSET 31;
  • ④. 分页显式公式:(当前页数-1)*每页条数,每页条数
    注意:LIMIT 子句必须放在整个SELECT语句的最后!
SELECT * FROM table 
LIMIT(PageNo - 1)*PageSize,PageSize;
# 需求1:每页显示20条记录,此时显示第1页
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;

# 需求2:每页显示20条记录,此时显示第2页
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;

# 需求3:每页显示20条记录,此时显示第3页
SELECT employee_id,last_name
FROM employees
LIMIT 40,20;
#练习:查询员工表中工资最高的员工信息
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC
#limit 0,1
LIMIT 1;
  • ⑤. 约束返回结果的数量可以 减少数据表的网络传输量 ,也可以 提升查询效率 。如果我们知道回结果只有1 条,就可以使用 LIMIT 1 ,告诉SELECT语句只需要返回一条记录即可。这样的好处就是 SELECT不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回

  • ⑥. 在不同的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;

③. ORDER BY 和 LIMIT 习题

#1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示 
SELECT last_name,department_id,salary * 12 annual_salary
FROM employees
ORDER BY annual_salary DESC,last_name ASC;

#2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据 
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC
LIMIT 20,20;


#3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT employee_id,last_name,email,department_id
FROM employees
#where email like '%e%'
WHERE email REGEXP '[e]'
ORDER BY LENGTH(email) DESC,department_id;

④. GROUP BY 分组数据

  • ①. 使用GROUP BY子句将表中的数据分成若干组
    在这里插入图片描述
#需求:查询各个部门的平均工资,最高工资
SELECT department_id,AVG(salary),SUM(salary)
FROM employees
GROUP BY department_id

#需求:查询各个job_id的平均工资
SELECT job_id,AVG(salary)
FROM employees
GROUP BY job_id;
  • ②. 多个排序
    在这里插入图片描述
#需求:查询各个department_id,job_id的平均工资
#方式1:
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY  department_id,job_id;
#方式2:
SELECT job_id,department_id,AVG(salary)
FROM employees
GROUP BY job_id,department_id;
  • ③. SELECT中出现的非组函数的字段必须声明在GROUP BY中
    反之,GROUP BY中声明的字段可以不出现在SELECT中
#错误的!这里的job_id没有在group by里面
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id;
  • ④. GROUP BY声明在FROM后面、WHERE后面,ORDER BY前面、LIMIT前面

  • ⑤. MySQL中GROUP BY中使用WITH ROLLUP

  1. 当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的
  2. 在MYSQL8.0不会报错,在MYSQL5.47会报错
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP;

在这里插入图片描述

# 说明:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。
# 错误的:
SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id WITH ROLLUP
ORDER BY avg_sal ASC;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所得皆惊喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值