SQL语句三
1. 分组与分组之后的筛选
1.1 分组
在数据库中 ,通过group by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组。
select ...from table group by 需要分组字段;
练习:
- 计算男生和女生中的人数
- 男生最大年龄与女生最大年龄
- 如果分组后 还想查看总人数 with rollup
group_concat(…)
我们通过group_concat(…)查看每组的详细信息
练习:
- 查询同种性别(分组后)的姓名
- 查询组内年龄,姓名
1.2 分组后的筛选
练习:
- 查询男生女生总数大于2
- 查询男生女生总数大于2的姓名
- 查询男生女生平均年龄超过18岁的性别,以及姓名
2.排序
order by 字段 默认升序
order by asc 字段 指定升序
order by desc 字段 指定降序
练习:
- 查询年龄在18到26之间的男同学,按照年龄从小到大排序
- 查询年龄在18到20岁之间的女同学,id从高到低排序
- 查询年龄在18-23岁之间的女性,年龄从高到低降序,当年龄相同时,按照id从低到高升序。
3. 限制
limit start,count
- start 为偏移量,默认起始0
- count为 条数
4. 表连接
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回mysql。这时我们就需要使用表连接。
分类:
- 内连接
- 外连接
- 左连接
- 右连接
4.1 内连接
内连接仅选出两张表中互相匹配的记录
select * from 表1 inner join 表2 on 表1.列 = 表2.列
students 表
classes表
练习:
- 显示学生的所有信息,但只显示班级名称
- 将班级名称显示在第一列
- 查询 有能够对应班级的学生以及班级信息,按照班级进行排序
- 当同一个班级时,按照学生的id进行从大到小排序
4.2 左连接
查询的结果为两个表匹配到的数据 ,左表持有的数据,对于右表中不存在的数据使用null填充
以左表为主
select * from 表1 left join 表2 on 表1.列 = 表2.列
练习:
- students表左连接classes表 并查看班级为null的数据
- 左连接 并且 查询 s.is_del=1 并且 s.name=“amy” 的数据
4.3 右连接
查询结果为两个表匹配到的数据,右表持有的数据,对于左表中不存在的数据使用null填充。
select * from 表1 right join 表2 on 表1.列 = 表2.列;
5. 子查询
某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。
- 查询年龄最大的男同学 所对应的名字
- 查询出大于平均年龄的女性学生信息