DQL-分页查询
分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。
语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询记录数 ;
注意事项:
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数 [比如我们点击2,代表要查询第二页,那么根据起始索引的计算方式,就是(页码-1)*每页返回的记录数,比如我们要查询第一页,那么其实页码就是从0开始的,假如我要查询第二页,每页要返回10条记录,起始索引应该是10]
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT [就比如mysql和oracle在分页查询上就有不同]
如果查询的是第一页数据,要返回10条记录数,起始索引可以省略,直接简写为 limit 10
案例:
查询第1页员工数据, 每页展示10条记录
select * from emp limit 0,10; select * from emp limit 10;
执行如下:
查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数
select * from emp limit 10,10;
此时可以观察到只返回了6条数据,因为这张表里面一共16条数据,第一页展示10条,那么第二页只剩这6条可以展示
执行如下:
DQL语句复习案例
1.查询年龄为20,21,22,23岁的女性员工信息。
代码思路:
select *from emp ;
首先第一个条件限定的是女性员工,那么我们就要gender = '女',将女性员工筛选出来
select *from emp where gender = '女' ;
紧接着还有一个条件,年龄为20,21,22,23,它和女性应该是一个并列的条件,于是我们想到用and将条件并列,之后去筛选年龄为20,21,22,23,则直接使用in(....)就行了
select * from emp where gender = '女' and age in(20,21,22,23) ;
执行如下:
2.查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
代码思路:
思考一下几个条件
1.性别为男
2.年龄为20-40之间
3.名字为3个字
很明显这三个条件应该是并列的条件,我们应该用and连接,先把第一条件写了
select * from emp where gender = '男' ;
并且and,年龄在20-40之间,此时我们可以使用age>=20 and age<=40这种语法,也可以使用between and。大家是否记得,在学between and时强调过,20和40能不能反着来,不行的,因为between后面跟最小值,and后面跟最大值
select * from emp where gender = '男' and ( age between 20 and 40 )
之后姓名为3个字,那么我们就用like和3个下划线去占位,不能用百分号
当然为了让我们的条件更加清晰,我们可以在代码中加入小括号,也可以不加
select * from emp where gender = '男' and ( age between 20 and 40 ) and name like '___';
执行如下:
3.统计员工表中, 年龄小于60岁的 , 男性员工和女性员工的人数。
代码思路:
1.首先分清楚它是统计查询
2.要查询男性员工还要查询女性员工,那么我们就要根据性别进行分组
3.然后去统计年龄小于60岁的男性员工的数量,女性员工的数量
4.这里要特别注意执行顺序的问题
根据性别分组
select * from emp group by gender ;
查询每一个性别的人数,将*更改为count(*),之前的案例演示过,为了让我们更加清晰明了,男的人数是几,女的人数是几,那么我们就要把gender字段查询出来,所以我们在count(*)的前面加上gender字段,逗号切记不能忘记
select gender , count(*) from emp group by gender ;
此时是查询所有员工当中男性和女性的数量,但还有一个条件,我们只查询年龄小于60岁的,所以我们应该在分组之前进行条件过滤,所以应该在group by之前加上where
select gender, count(*) from emp where age < 60 group by gender;
执行如下:
4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按 入职时间降序排序。
代码思路:
1.要查询的仅仅是员工的姓名和年龄
select name , age from emp ;
2.过滤出年龄小于等于35岁的员工
select name , age from emp where age <= 35 ;
3.对查询的结果年龄升序,年龄相同则按入职时间降序,这样一看就知道需要写两个排序字段
select name , age from emp where age <= 35 order by age asc , entrydate desc ;
执行如下:
5.查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序, 年龄相同按入职时间升序排序。
与上一题思路相似
1.第一个条件就是查询性别为男
select * from emp where gender = '男' ;
2.年龄要在20-40岁之间,这个条件很明显与上一个条件是并列的
select * from emp where gender = '男' and age between 20 and 40 ;
3.前5个员工的信息,很明显要用到分页limit去限制,那么就需要limit 5
select * from emp where gender = '男' and age between 20 and 40 limit 5 ;
4.结果按照年龄升序,年龄相同则入职时间升序,此时需要排序,那么我们应该在哪写呢?在后面写order by对吗?不对!此时会报错。注意我们刚才讲的语法规则,limit是在最后的
order by应该在limit之前
select * from emp where gender = '男' and age between 20 and 40 order by age asc , entrydate asc limit 5 ;
执行如下:
DQL-执行顺序
之前我们讲到的是编写顺序,不是执行顺序。接下来,我们要来说明的是DQL语句在执行时的执行顺序,也就是先执行哪一部分,后执行哪一部分。
重点
验证执行顺序:
查询年龄大于15的员工姓名、年龄,并根据年龄进行升序排序。
select name , age from emp where age > 15 order by age asc ;
执行如下:
我们通过这条SQL如何验证DQL的执行顺序呢?
我们提到DQL执行顺序先执行from,先执行from,那么我们在from后面给emp表起一个别名 e,然后在select 及 where中使用该别名。
select e.name , e.age from emp e ;
如果先执行from,这块的语句执行完毕之后,这个表的别名有了吧,然后紧接着是不是要执行的是where,那么此时我们这一块是不是就能去使用这个别名,此时我们e.age,生不生效,生效,因为from执行完之后,这个表的别名,就已经有了
select name , age from emp e where e.age > 15 order by age asc;
执行如下:
where执行完了如果有分组就是执行group by,having,那么这里没有就不再执行这个操作而是去执行select操作,那么我们select能不能去使用表的别名呢?可以,因为from已经先执行了,所以此时你可以去加上e.name,e.age
select e.name , e.age from emp e where e.age > 15 order by age asc;
执行如下:效果没有任何变化
此时可以证明from先执行,然后执行的where和select
接下来再来验证一组顺序
我们刚才知道对于select语句它在where之后,group by之后的,怎么验证呢?
此时我们回想一下,可不可以对查询返回的字段起别名呢?可以
此时就给e.name起别名叫ename,e.age起别名叫eage
那么我在where之后不通过e.age这种方式来鉴定条件,我使用e.age的别名eage可不可以?
select e.name ename , e.age eage from emp e where eage > 15 order by age asc;
执行发现报错:
为什么会出现这个现象?原因是select语句在where之后执行,既然在where之后执行,那么我们在where里面就不能用到select语句起的别名
由此我们可以得出结论: from 先执行,然后执行 where , 再执行select 。
接下来我们在验证select和order by的执行顺序是什么?select在order by之前,那根据前面的经验,按道理说我们在order by中就能够使用select的别名,我们验证一下
select e.name ename , e.age eage from emp e where e.age > 15 order by eage asc;
执行成功:
结果执行成功。 那么也就验证了: order by 是在select 语句之后执行的。
总结:综上所述,我们可以看到DQL语句的执行顺序为: from ... where ... group by ... having ... select ... order by ... limit ...