一、常用汇总函数的练习
问题:
- 查询课程编号为“0002”的总成绩
- 查询选了课程的学生人数
- 查询学号为“0001”的学生的最高分、最低分和平均分
解答SQL语句如下:
-- 查询课程编号为“0002”的总成绩
SELECT 学号,SUM(成绩)FROM score WHERE `课程号`='0002';-- 查询选了课程的学生人数
SELECT COUNT(DISTINCT 学号)FROM score WHERE `课程号` IS NOT NULL;-- 查询学号为“0001”的学生的最高分
SELECT 学号,MAX(成绩),MIN(成绩),AVG(成绩)FROM score WHERE `学号`='0001';
二、分组练习
问题:
- 查询各科成绩的最高分和最低分
- 查询每门课程被选修的学生数
- 查询男生、女生的人数
解答SQL语句如下:
-- 查询各科成绩的最高分和最低分
SELECT 课程号,MAX(成绩),MIN(成绩)FROM score GROUP BY `课程号`;-- 查询每门课程被选修的学生数
SELECT 课程号,COUNT(DISTINCT 学号)FROM score GROUP BY `课程号`;-- 查询男生、女生的人数
SELECT 性别,COUNT(DISTINCT 性别)FROM student GROUP BY `性别`;
三、给分组结果指定条件的练习
问题:
- 查询平均成绩大于60分学生的学号和平均成绩
- 查询至少选修两门课程的学生学号
- 查询姓名相同的学生名单并统计同名人数
解答:
SQL语句如下:
-- 查询平均成绩大于60分学生的学号和平均成绩
SELECT 学号,AVG(成绩) AS 平均成绩FROM score GROUP BY `学号`HAVING AVG(`成绩`)>60;-- 查询至少选修两门课程的学生学号
SELECT 学号,COUNT(课程号) AS 选修课程数FROM score GROUP BY `学号`HAVING COUNT(`课程号`)>=2;-- 查询姓名相同的学生名单并统计同名人数
SELECT 姓名,COUNT(姓名) AS 同名人数 FROM student GROUP BY `姓名` HAVING COUNT(`姓名`)>=2;
四、用SQL解决业务问题的解题思路
问题:
查询出平均成绩在80分及以上的课程,并写出分析思路。
解答:
- 第一步,翻译问题,理解问题
求出每一门课程的平均成绩,然后选出平均成绩在80分及以上的课程
2. 第二步,明确分析思路
3. 第三步,写SQL语句
-- 查询出平均成绩在80分及以上的课程,并写出分析思路
SELECT 课程号,AVG(成绩) AS 平均成绩 -- 第四步:查询结果显示课程号,平均成绩FROM score -- 第一步:从score表中查找数据GROUP BY `课程号` -- 第二步:按课程号分组HAVING AVG(`成绩`)>=80; -- 第三步:给分组结果指定条件为平均成绩>=80
五、排序练习
问题:
写出下列问题对应的SQL语句,并画出运行顺序
- 查询不及格的课程,并按课程号从大到小排列
- 查询每门课程的平均成绩,结果按平均成绩升序排序;平均成绩相同时,按课程号降序排序
- 查询课程编号为“0003”且成绩>=80的学生学号,结果按按分数降序排列
- 统计每门课程的学生选修人数(超过2人的课程才统计),要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
- 查询至少两门课程成绩优秀的同学学号及其成绩优秀的课程的平均成绩
解答:
题1~4答案:
-- 查询不及格的课程,并按课程号从大到小排列
SELECT 课程号,成绩 -- 第三步,查询出成绩<60分的课程号和成绩FROM score -- 第一步,从score表中查询数据WHERE `成绩`<60 -- 第二步,查询条件是成绩<60分
ORDER BY `课程号` DESC; -- 第四步,对查询结果按课程号降序排序/*查询每门课程的平均成绩,结果按平均成绩升序排序;
平均成绩相同时,按课程号降序排序*/
SELECT 课程号,AVG(成绩) AS 平均成绩 -- 第三步,对分组后的课程计算每门课程的平均成绩,并把列名“AVG(成绩)”命名为“平均成绩”FROM score -- 第一步,从score表中查询数据GROUP BY `课程号` -- 第二步,按课程号分组
ORDER BY 平均成绩 ASC ,`课程号` DESC ; -- 第四步,按照课程的平均成绩升序排序,当平均成绩相同时按照课程号降序排序-- 查询课程编号为“0003”且成绩>90的学生学号,结果按按分数降序排列
SELECT 学号,成绩 -- 第三步,查询结果显示学号和成绩FROM score -- 第一步,从score表中查询数据WHERE `课程号`='0003' AND `成绩`>=80 -- 第二步,查询条件是课程号为0003并且成绩>=80
ORDER BY `成绩` desc ; -- 对查询结果按照成绩进行倒序排序/*统计每门课程的学生选修人数(超过2人的课程才统计),
要求输出课程号和选修人数,查询结果按人数降序排序;若人数相同,按课程号升序排序*/
SELECT 课程号,COUNT(学号) AS 选修人数 -- 第四步,查询结果显示课程号和“COUNT(学号)”,并把“COUNT(学号)”命名为“选修人数”FROM score -- 第一步,从score表中查询数据GROUP BY `课程号` -- 第二步,按照课程号分组HAVING COUNT(`学号`)>2 -- 给分组指定条件,选修该课程超过2人
ORDER BY 选修人数 DESC ,`课程号` ASC ; -- 对查询结果按照选修人数进行倒序排序,如果选修人数相同,则按照课程号进行升序排序
题5较为复杂,下面详细解答:
(1)翻译题目,理解题目
先将题目逐个拆解:
查询“至少两门”“课程成绩优秀”的【同学学号】及其“成绩优秀的课程”的【平均成绩】
也就是:
- 需要查询的字段是【学号】和【平均成绩】
- 【学号】的限制条件是“课程成绩优秀”,“课程成绩优秀”的限制条件是“至少两门”,“平均成绩”的限制条件是“成绩优秀的课程”
(2)确定分析思路
- 第一步:得到每个学生的平均成绩,查询结果显示学号和平均成绩
select -- 查询结果:学号,avg(成绩) as 平均成绩
from -- 从哪张表查找数据:score
where -- 限制条件:没有
group by -- 分组:按学号分组
having --给分组指定条件:没有
order by -- 排序:没有
limit -- 指定行数:没有
查询语句如下:
SELECT 学号,AVG(成绩) AS 平均成绩FROM score GROUP BY `学号`;
2. 第二步:加上限制条件
① 给“学号”加上“课程成绩优秀”——查询限制条件where
② 给“平均成绩”加上“成绩优秀的课程”——查询限制条件where
③ 给“课程成绩优秀”加上“至少2门”——在查询限制条件where的基础上给分组指定条件having
select -- 查询结果:学号,avg(成绩) as 平均成绩
from -- 从哪张表查找数据:score
where -- 限制条件:成绩>=90
group by -- 分组:按学号分组
having --给分组指定条件:count(课程号)>=2
order by -- 排序:没有
limit -- 指定行数:没有
查询语句如下:
SELECT 学号,AVG(成绩) AS 平均成绩FROM score WHERE `成绩`>=90GROUP BY `学号`HAVING COUNT(`课程号`)>=2;