分页查询
应用场景:当要显示的数据,一页显示不全,此时需要分页提交sql请求
实现:
语法:
SELECT 查询列表
FROM 表
[join type] JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组条件
HAVING 分组后筛选条件
ORDER BY 排序字段
LIMIT offset,size;
注:offset:要显示条目的起始索引(其实索引从0开始)
size:要显示的条目个数
案例1:显示前五条员工信息
SELECT * FROM employees
LIMIT 0,5;
/**当起始索引为0时可以省略**/
SELECT * FROM employees
LIMIT 5;
案例2:查询第11条到第25条的数据
分析:起始索引:10
要显示的条目行数:25-11+1 = 15
SELECT * FROM employees
LIMIT 10,15;
案例3:查询有奖金的员工信息,并且显示工资较高的前10名
- 查询有奖金的员工信息并按照工资高低排序
- 显示前10名的数据
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
limit 0,10;
分页查询的特点:
-
limit语句放在查询语句的最后
-
公式:
要显示的页数:page;
每页的条目数:sizeSELECT 查询列表
FROM 表
LIMIT (page-1)*size,size;
注:这里假设每页的条目数为10
page(要显示的页数) | offset(要显示的起始索引) |
---|---|
1 | 0 |
2 | 10 |
3 | 20 |
… | … |
n | (n-1)*10 |
进阶练习
已知表stuinfo和表grade的结构如下:
stuinfo
学号(id) | 姓名(name) | 邮箱(email) | 年级编号(gradeId) | 性别(sex) | 年龄(age) |
---|---|---|---|---|---|
John@126.com |
grade
年级编号(id) | 年级名称(gradeName) |
---|---|
案例1.查询所有学员的邮箱的用户名(注:邮箱前面的@字符)
分析:
- 获取学员的邮箱名
- 获取字符@的索引
- 截取字符@
SELECT SUBSTR(email,1,INSTR(email,'@')-1) 用户名
FROM stuinfo;
注:
subStr(“要截取的字符”,起始索引,结束索引);//返回截取指定索引的字符串
inStr(“整个字符串”,“要查寻索引的字符”);//返回指定字符的索引
案例2:查询男生和女生的个数
SELECT COUNT(*) 个数,sex
FROM stuinfo
GROUP BY sex;
案例3:查询年龄>18岁所有学生的姓名和年级名称
分析:用到了两张表
SELECT name,gradeName
FROM stuinfo s
INNER JOIN grade g
ON s.gradeid = g.id
WHERE age > 18;
案例4:查询哪个年级的学生最小年龄大于20岁
分析:
- 查询每个年级的学生的最小年龄
- 筛选出最小年龄大于20岁的年级有哪些
SELECT MIN(age) 最小年龄,gradeId
FROM stuinfo s
GROUP BY gradeId
HAVING 最小年龄 > 20;
总结:查询语句中涉及到的关键字及其执行顺序
SELECT 查询列表 /**7**/
FROM 表1 /**1:锁定数据源**/
连接类型 JOIN 表2 /**2:将两个表进行连接:笛卡尔乘积**/
ON 连接条件 /**3.连接条件**/
WHERE 筛选条件 /**4**/
GROUP BY 分组列表 /**5**/
HAVING 分组后的筛选 /**6**/
ORDER BY 排序列表 /**8:将查询的结果进行排序**/
LIMIT 起始索引,条目数 /**9:将结果分页显示**/