#DQL语言
##九、分页查询
###1.什么是分页查询?

比如我们要去淘宝上买东西,搜索商品时肯定不会一页给客户显示完所有的商品,而是服务器按页去依次索引给客户端查看的,这时候我们就需要用到分页查询,分页地提交sql请求

###2.分页查询的语法

执行顺序也依次标出

select 查询列表    ⑦
from 表1    ①
【连接类型join type】join 表2    ②
on 连接条件    ③
where 筛选条件    ④
group by 分组字段    ⑤
having 分组后的筛选    ⑥
order by 【asc/desc】排序    ⑧  
limit offset,size;    ⑨

PS:offset要显示条目的起始索引(起始索引从0开始
   size是要显示的条目个数

案例一:查询前五条员工的信息

SELECT * FROM employees LIMIT 0,5;

当然,假如说要从索引为0开始,那么limit 0,5中的0就可以省略!

即这样也行SELECT * FROM employees LIMIT 5;

案例二:查询第11条-第25条员工的信息

SELECT * FROM employees LIMIT 10,15; 数量逻辑一定要弄清楚!

案例三:查询有奖金的员工信息,并且工资较高的前10名显示出来

SELECT 
  * 
FROM
  employees 
WHERE commission_pct IS NOT NULL 
ORDER BY salary DESC 
LIMIT 0, 10 ;

###3.分页查询总结

①limit语句放最后面
②要显示的页数page,每页的条目数size

select 查询列表
from 表
limit (page-1)*size,size

最后那个公式怎么来的呢?

假设我们要查询的每页的条目数为10条
那么

Page

起始索引

1

0

2

10

3

20

由此便可以得出规律公式啦,那就是“limit 起始索引,每页条目数”对应“limit (page-1)*size,size”

###4.分页查询例题

案例一:查询平均工资最低的部门信息

有时候用分页查询可以简便很多,为了突出这个特点,这道题我们可以用子查询和分页查询两种方法来做,先看复杂的子查询↓

·子查询:(分4步走)
Step1:先查询各部门的平均工资

SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id

第一步结果如下

PageHelper db2 分页查询优化 分页查询order by_mysql

Step2:再查询Step1的结果的最低工资

SELECT MIN(ag)
FROM (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id
) tab

第二步结果如下

PageHelper db2 分页查询优化 分页查询order by_分页查询_02

Step3:再从departments表中查询平均工资为Step2中最低平均工资的department_id

SELECT department_id
	FROM employees
	GROUP BY department_id
	HAVING AVG(salary)=(
	SELECT MIN(ag)
	FROM (
		SELECT AVG(salary) ag,department_id
		FROM employees
		GROUP BY department_id
	 ) tab
	)

第三步结果如下

PageHelper db2 分页查询优化 分页查询order by_子查询_03

Step4:最后根据Step3的department_id去查询该部门号的部门信息

SELECT d.*
FROM departments d
WHERE d.`department_id`=(
	SELECT department_id
	FROM employees
	GROUP BY department_id
	HAVING AVG(salary)=(
	SELECT MIN(ag)
	FROM (
		SELECT AVG(salary) ag,department_id
		FROM employees
		GROUP BY department_id
	 ) tab
	)
);

最后结果如下

PageHelper db2 分页查询优化 分页查询order by_mysql_04

可见用子查询的话会层层嵌套,使得查询语句过于复杂!下面我们用分页查询

·分页查询

Step1:先查询各部门平均工资

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 1;

第一步结果如下

PageHelper db2 分页查询优化 分页查询order by_数据库_05

Step2:在第一步结果的基础上进行升序排序,这样一来排在第一位的就是平均工资最低的部门,所以我们可以利用limit子句去索引第一个值,语句如下

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 1;

第二步结果如下

PageHelper db2 分页查询优化 分页查询order by_数据库_06

Step2:和前面子查询一样,根据department_id查询该部门的信息

SELECT d.*
FROM departments d
WHERE d.`department_id`=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 1
);

大功告成!!!

案例二:查询平均工资最低的部门信息和该部门的平均工资

大致过程和上一题差不多,只不过这题需要多查询一个最低平均工资,那么我们就可以用from后面的表子查询去解决,再利用连接查询就ok了

SELECT tab.ag,d.*
FROM departments d
INNER JOIN (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id
	ORDER BY ag ASC
	LIMIT 1
) tab
ON d.department_id=tab.department_id
WHERE d.department_id=tab.department_id;

案例三:查询平均工资高于公司平均工资的部门

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)>(
	SELECT AVG(salary)
	FROM employees
);

案例四:查询出公司中所有manager的详细信息

SELECT *
FROM employees e
WHERE employee_id =ANY(
SELECT DISTINCT manager_id 
FROM employees
)

案例五:查询平均工资最高的部门的manager的详细信息:last_name,department_id,email,salary

SELECT last_name,department_id,email,salary
FROM employees
WHERE employee_id=(
	SELECT manager_id
FROM departments
WHERE department_id=(
SELECT  department_id
	FROM employees
	GROUP BY department_id
	ORDER BY AVG(salary) DESC
	LIMIT 1
)
)

以上就是分页查询的内容,下一节将介绍联合查询!