好吧,查询这个重要的操作,可能是数据库操作的“灵魂”吧。
简单的查询操作
1 | select * from students; |
消除重复行
1 | select distinct gender from students; |
条件
使用 where 子句对表中的数据筛选,结果为 True 的行会出现在结果集中。
1 | select * from students where id >= 3; |
比较运算符
- 等于=
- 大于>
- 大于等于>=
- 小于<
- 小于等于<=
- 不等于!=或<>
1 | # 查询 id 不小于 3 的学生 |
逻辑运算符
- and
- or
- not
1 | # 查询编号大于 3 的女同学 |
模糊查询
- like
- %表示任意多个任意字符
- _表示一个任意字符
1 | # 查询姓 黄 的学生 |
范围查询
- in表示在一个非连续的范围内
- between … and …表示在一个连续的范围内
1 | # 查询 id 是 1 或 2 或 6 的学生 |
NULL 判断
注意:NULL 与 ''
不同
1 | # 查找没有填 birthday 的学生 |
优先级
- 小括号,not,比较运算符,逻辑运算符
- and比or先运算,如果同时出现并希望先算or,需要结合()使用
聚合
MySQL 提供了 5 个聚合函数,可以快读得到统计数据。
count(*) 表示计算总行数,括号中写星与列名,结果是相同的。
1
2# 查询学生总数
select count(*) from students;max(列)表示求此列的最大值
1
2# 查询女生的编号最大值
select max(id) from students where gender = 0;min(列)表示求此列的最小值
1
2# 查询未删除的学生最小编号
select min(id) from students where isdelect = 0;sum(列)表示求此列的和
1
2# 查询男生编号之和
select sum(id) from students where gender = 1;avg(列)表示求此列的平均值
1
2# 查询未删除女生的编号平均值
select avg(id) from students where gender = 0;
分组
按照此字段分组,表示此字段相同的数据会被分到一个组中。
分组后,只能查询出相同的列,对于有差异的数据列无法从结果集中查出来。
可以对分组后的数据进行统计,做聚合运算。
1 | # 语法 |
分组后筛选
1 | # 语法 |
having后面的条件运算符与 where 的相同。
1 | # 查询男生总人数 1 |
对比 where 和 having
where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选
having 是对 group by 的结果进行筛选
排序
为了方便查看数据,可以对数据进行排序。
1 | # 语法 |
- 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
- 默认按照列值从小到大排列
- asc从小到大排列,即升序
- desc从大到小排序,即降序
1 | # 查询未删除男生信息,按学号降序 |
分页
当数据量过大时,在一页中查看数据是一件非常麻烦的事情。
1 | # 语法 |
- 从start开始,获取count条数据
- start索引从0开始
示例:分页
- 已知:每页显示m条数据,当前显示第n页
- 求总页数:此段逻辑后面会在python中实现
- 查询总条数p1
- 使用p1除以m得到p2
- 如果整除则p2为总数页
- 如果不整除则p2+1为总页数
- 求第n页的数据
1 | select * from students |
总结
- 完整的select语句
1 | select distinct * |
- 执行顺序为:
- from 表名
- where ….
- group by …
- select distinct *
- having …
- order by …
- limit star,count