#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
第一步结果如下
Step2:再查询Step1的结果的最低工资
SELECT MIN(ag)
FROM (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) tab
第二步结果如下
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
)
第三步结果如下
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
)
);
最后结果如下
可见用子查询的话会层层嵌套,使得查询语句过于复杂!下面我们用分页查询
·分页查询
Step1:先查询各部门平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 1;
第一步结果如下
Step2:在第一步结果的基础上进行升序排序,这样一来排在第一位的就是平均工资最低的部门,所以我们可以利用limit子句去索引第一个值,语句如下
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 1;
第二步结果如下
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
)
)
以上就是分页查询的内容,下一节将介绍联合查询!