![c4a0235550621433d5828b4dee5682db.png](https://img-blog.csdnimg.cn/img_convert/c4a0235550621433d5828b4dee5682db.png)
SQL书写规则
1.SQL语句以英文分号(;)结尾。
2.SQL语句不区分关键字的大小写。
3.列名不能加单引号。
4.符号只能使用英文符号。
5.SQL中列名不需要加引号,它是具有特殊含义的。
聚合group by
group by子句的作用是将数据集中的数据按一个或多个字段(也是所指定的列)进行分组,将数据有目的的进行切分。
使用group by 时有一些注意事项
- group by 必须要写在 where 之后。我想过这个的原因,如果说where写在group by之后,我觉得可能是对于group by之后的各个分组再进行where筛选,系统需要判断哪些数据属于哪些分组,执行效率上就比写在之前大大降低了。
- group by时也会将null值视作为一个独立的组。
- 使用聚合函数时,例如count、avg、sum、max、min,计算每个分组中的数值时,系统会忽视null值,仿佛看不见它,但是需要注意的是,count(*)函数是不会忽视null值的,因为这个函数计算的不是一列了,而是每一行,null值也属于行中。同时求和函数、求平均值函数只能对数值类型的列使用,min、max函数几乎适用所有数据类型的列。
- group by 子句的聚合结果是没有顺序的,分组中行的顺序随机排列。
- group by 分组后,select中不能书写其他除了(聚合键、聚合函数)的其他数据列,原因是每个分组中有很多行数据,系统不知道你要的是哪一行数据。(但是其实在mysql中可以书写,其他DBMS不支持这样的写法)。
练习题
找出课程编号为0002的总成绩
select sum(成绩) as 0002总成绩
from score
where 课程号 = "0002"
![bfa02167e90614ea8d31b2e12e7a94e6.png](https://img-blog.csdnimg.cn/img_convert/bfa02167e90614ea8d31b2e12e7a94e6.png)
查询选了课程的学生人数
select count(distinct 学号)
from score
![46b1218ad3d88e39106bb09f3b41fb73.png](https://img-blog.csdnimg.cn/img_convert/46b1218ad3d88e39106bb09f3b41fb73.png)
查询各科成绩最高和最低的分
select 课程号,
max(成绩) as 最高成绩,
min(成绩) as 最低成绩
from score
group by 课程号
![27168866101ef7e073f32ef558854e62.png](https://img-blog.csdnimg.cn/img_convert/27168866101ef7e073f32ef558854e62.png)
查询每门课程被选修的学生数
select 课程号,
count(distinct 学号)
from score
group by 课程号
![19f1143efb302562f1ee67b11dfc0a76.png](https://img-blog.csdnimg.cn/img_convert/19f1143efb302562f1ee67b11dfc0a76.png)
查询男生和女生数
select 性别,
count(性别)
from student
group by 性别
![21197767e8d9f5de20d077af30e25dc8.png](https://img-blog.csdnimg.cn/img_convert/21197767e8d9f5de20d077af30e25dc8.png)
查询平均成绩大于60分学生的学号和平均成绩
select 学号,
round(avg(成绩),2)
from score
group by 学号
![2de8a6747c8cd352cf72de78899f8197.png](https://img-blog.csdnimg.cn/img_convert/2de8a6747c8cd352cf72de78899f8197.png)
查询至少选修两门课程的学生学号
select 学号
from score
group by 学号
having count(课程号)>1
![76d0ebbfaa90dd9aa6e90bf2667419e7.png](https://img-blog.csdnimg.cn/img_convert/76d0ebbfaa90dd9aa6e90bf2667419e7.png)
查询同名同性学生名单并统计同名人数
select 姓名,
count(姓名) as 同学数量
from student
group by 姓名
having count(姓名)>1
![ba3aa62e0614a6afcc7b80ee0f8ce919.png](https://img-blog.csdnimg.cn/img_convert/ba3aa62e0614a6afcc7b80ee0f8ce919.png)
查询不及格的课程并按课程号从大到小排列
select 课程号
from score
where 成绩<60
order by 课程号 desc
![f7ec336c7c028dc2e0e32edd15141d20.png](https://img-blog.csdnimg.cn/img_convert/f7ec336c7c028dc2e0e32edd15141d20.png)
计算每门课的平均成绩,并且平均成绩大于等于80分
select 课程号,avg(成绩) as 平均成绩
from score
group by 课程号
having avg(成绩)>80
![1567995eea29a43e34c16fd0b605ea72.png](https://img-blog.csdnimg.cn/img_convert/1567995eea29a43e34c16fd0b605ea72.png)
查询不及格的课程并按课程号从大到小排列
select 课程号,成绩
from score
where 成绩<60
order by 课程号 desc
查询每门课程平均成绩,结果按平均成绩升序排列。平均成绩相同,按课程号降序排列
select 课程号,avg(成绩)
from score
group by 课程号
order by avg(成绩),课程号 desc
![c10f8d54b0f9084fd2826f6ebb3d1c7f.png](https://img-blog.csdnimg.cn/img_convert/c10f8d54b0f9084fd2826f6ebb3d1c7f.png)