MySQL(2)
前面介绍完了MySQL的DDL和DML,今天来学习一下DQL。
一、数据库操作-DQL
1、DQL-基本查询
DQL,Data Query Language(数据查询语言),用来查询数据库表中的记录。
查询的关键字: SELECT。查询的语法结构如下图
1)查询多个字段
1 | select 字段1,字段2,字段3 from 表名; |
2)查询所有字段(通配符)
1 | select * from 表名; |
3)设置别名
1 | select 字段1 [as 别名1],字段2 [as 别名2] from 表名; |
4)去除重复记录
1 | select distinct 字段列表 from 表名; |
注:*号代表查询所有字段,在实际开发中尽量少用(不直观且影响效率)。
2、DQL-条件查询
2.1 基本语法
1 | select 字段列表 from 表名 where 条件列表; |
2.2 常用的运算符
在条件查询中有一些常见的运算符,如比较运算符和逻辑运算符,如下图
这里重点是模糊查询,注意一下匹配单个和匹配任意就行。
eg1:从tb_user表中查询年龄在20-25岁之间(包含)的用户信息
1 | select * from tb_user where age >=20 and age <=25; |
或者
1 | select * from tb_user where age between 20 and 25; |
eg2:从tb_user表中查询年龄为20,21,22的用户信息
1 | select * from tb_user where age = 20 or age = 21 or age = 22; |
或者
1 | select * from tb_user where age in (20,21,22); |
eg3:从tb_user表中查询姓名为两个字的用户信息
1 | select * from tb_user where name like '__'; |
两个字使用两根下划线,同理三个字使用三根下划线。
eg4:从tb_user表中查询姓’张’的用户信息
1 | select * from tb_user where name like '张%'; |
3、DQL-聚合函数
3.1 概述
所谓聚合函数,就是将一列数据作为一个整体,进行纵向计算。常用的函数如下。
注:聚合函数不对null值进行运算
3.2 语法
1 | select 聚合函数(字段列表) from 表名; |
3.3 示例
eg1:统计tb_user表中用户的数量
1 | -- count(字段) |
或者
1 | -- count(常量) |
或者
1 | -- count(*) 推荐 |
eg2:统计tb_user表中年龄最小的用户
1 | select min(age) from tb_user; |
同理统计最大的则为 max
eg3:统计tb_user表中用户年龄的平均值
1 | select avg(age) from tb_user; |
4、DQL-分组查询
4.1 基本语法
1 | select 字段列表 from 表名 [where 条件] group by 分组字段名 [having分组后过滤条件]; |
4.2 示例
eg1:根据性别分组,统计tb_user表中男性和女性用户的数量
1 | select gender,count(*) from tb_user group by gender; |
运行后的效果为一个两行两列的表格,第一列为性别(男或女),第二列为男或女分别对应的数量。
eg2:从tb_emp员工表中,查询入职时间在’2015-01-01’(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位
1 | select job,count(*) from tb_emp where entrydate <= '2015-01-01' group by job having count(*) >= 2; |
4.3 总结
1)注意
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
- 执行顺序: where >聚合函数> having
2)总结(重点–面试题)
where与having区别?(如下两点)
1、执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组。而having是分组之后对结果进行过滤。
2、判断条件不同: where不能对聚合函数进行判断,而having可以。
5、DQL-排序查询
5.1 基本语法
1 | select 字段列表 from 表名 [where 条件列表][ group by分组字段] order by 字段1 排序方式1,字段2 排序方式...; |
5.2 排序方式
1)升序:ASC (默认值)
2)降序:DESC
5.3 示例
eg1:从tb_user表中,根据年龄对用户进行升序排序
1 | select * from tb_user order by age asc; |
由于默认是升序,所以可删掉asc。同理降序即改为desc即可
eg2:根据年龄对用户进行升序排序,年龄相同,再按照更新时间进行降序排序
1 | select * from tb_user order by age , update_time desc; |
注:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
6、DQL-分页查询
6.1 基本语法
1 | select 字段列表 from 表名 limit 起始索引,查询记录数; |
6.2 示例
eg1:从起始索引0 开始查询用户数据,每页展示5条记录
1 | select * from tb_user limit 0,5; |
eg2:查询第1页用户数据,每页展示5条记录
1 | select * from tb_user limit 0,5; |
第1页的索引即为0
eg3:查询第2页用户数据,每页展示5条记录
1 | select * from tb_user limit 5,5; |
分析:第1页已经展示了5条数据,所以第2页应该从第6条数据开始算起,由于索引从0开始,第1页已经展示了0-4这5条数据,所以第2页索引从5开始。
eg4:查询第3页用户数据,每页展示5条记录(分析同上)
1 | select * from tb_user limit 10,5; |
6.3 总结(几点注意)
起始索引从0开始,起始索引=(查询页码–1)*每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
如果查询的是第一页数据,起始索引可以省略。