一、汇总分析
/*汇总*/
-- count()计数函数
#count(*)包含空值,count(列名)不包含空值
select count(*),count(教师名称) from teacher;
select count(姓名),COUNT(DISTINCT 姓名) from student;
select COUNT(DISTINCT 学号) from score;
-- sum()求和函数
#只能对数值类型列计算
select sum(成绩) from score;
select sum(成绩) from score where 课程号=002;
-- avg()平均值
#只能对数值类型列计算
select avg(成绩) from score;
-- max()最大值
select max(成绩) from score;
-- min()最小值
select min(成绩) from score;
二、分组 group up
/*分组*/
select 性别,count(*) from student GROUP BY 性别;
select 课程号,max(成绩) as '最高分',min(成绩) as '最低分' from score group by 课程号;
select 课程号,count(*) from score group by 课程号;
运行顺序:from --> where --> group by --> select
三、对分组结果制定条件 having
/*分组条件*/
select 性别,count(*) from student GROUP BY 性别 having count(*)>1;
select 学号,avg(成绩) as '平均分' from score group by 学号 having avg(成绩)>60;
select 学号 from score group by 学号 having count(*)>1;
select 姓名,count(*) from student group by 姓名 having count(*)>1;
运行顺序:from --> where --> group by --> having --> select
四、用SQL解决业务问题
1.步骤
a.翻译成大白话
b.写出分析思路
c.写出对应的sql语句
2.实例
问题:如何计算各科平均成绩?
思路:
a.翻译
如何计算每门课平均成绩?
b. 思路
select 查询结果 from 哪张表 where 查询条件 group by 分组依据 having 分组后的筛选条件
from 哪张表:成绩表score
where 查询条件:没有条件,对整张表查询
group by 分组依据:每门课是按照课程号分组
having 分组后的筛选条件:没有筛选,显示所有分组
select 查询结果:课程号、平均成绩-avg(成绩)
c. 语句
select 课程号,avg(成绩) from score group by 课程号;
过程:数据分组--> 函数计算 --> 组合结果
3.练习
a. 翻译
如何计算每门课的平均成绩,并且平均成绩大于等于80分
b. 思路
select 查询结果 from 哪张表 where 查询条件 group by 分组依据 having 分组后的筛选条件
from 哪张表:成绩表score
where 查询条件:没有条件,对整张表查询
group by 分组依据:每门课是按照课程号分组
having 分组后的筛选条件:将分组后的结果中,筛选出平均成绩大于等于80分
select 查询结果:课程号、平均成绩-avg(成绩)
c. 语句
/*应用业务*/
select 课程号,avg(成绩) as 平均成绩 from score GROUP BY 课程号 having avg(成绩)>=80;
过程:数据分组--> 函数计算 --> 筛选结果 -->组合结果
五、排序 order by desc asc limit
/*排序*/
#order by子句中可以使用之前定义的别名
select 课程号,avg(成绩) as 平均成绩 from score GROUP BY 课程号 having avg(成绩)>=80 order by 平均成绩 desc;
#多条件排序,按照先后语句顺序
select * from score ORDER BY 课程号,成绩 asc;
#使用有空值列排序,空值数据会在升序最大,次之空字符串
select * from teacher ORDER BY 教师名称;
#limit限制查询结果条数
select * from score limit 2;
顺序:from --> where --> group by --> having --> select --> order by --> limit
-- 练习
select 课程号 from score where 成绩<60 order by 课程号 desc;
select 课程号,avg(成绩) as 平均成绩 from score group by 课程号 order by 平均成绩 asc, 课程号 desc;
#顺序:from --> group by --> select --> order by
六、如何看报错信息
- 在group by 、having中使用了别名(MySQL数据库可以用别名,但是其他数据库不一定)
- 在where子句中使用聚合函数
-- 报错
select 课程号,count(*) from score where count(*)>2 group by 课程号;
3.字符型类型的数字排序是按照字符串排序规则排序