本文共 2274 字,大约阅读时间需要 7 分钟。
这次的多表查询内容跟上次的复杂查询比起来,内容相对容易理解,是原来知识的一个拓展,开始学习几个表之间一起查询出结果的问题,主要内容有
1 表的加法
2 表的联结
3 联结应用案例
4 case表达式
1 表的加法是应用于表结构相同的情况,是将数据按行合并在一起,加法(union),重复数据 删除,如果保留重复行,则用union all
2 表的联结
3 case表达式
else可以不写,但最好写上,end必须写,case表达式可以写在任何字句里,如果有多种情况需要判断可以使用。
练习
一 表的加法
SELECT 课程编号,课程名称 from course UNIONselect 课程编号,课程名称 from course1;
SELECT 课程编号,课程名称 from course UNION allselect 课程编号,课程名称 from course1;
二 表的联结-内联结
select a.学号,a.姓名,b.课程编号 from student as a inner join score as bon a.学号=b.学号;
二 表的联结-左联结
select a.学号,a.姓名,b.课程编号 from student as a left join score as bon a.学号=b.学号 where b.学号=NULL;
三 联结应用案例-查询所有学生的学号,姓名,选课数,总成绩
select a.学号,姓名,count(课程编号) as 选课数,sum(成绩) as 总成绩 from student as a left join score as bon a.学号=b.学号 GROUP BY a.学号;
四 联结应用案例-查询平均成绩大于85的所有学生的学号,姓名,和平均成绩
select a.学号,姓名,avg(成绩) as 平均成绩 from student as a LEFT JOIN score as bon a.学号=b.学号 group by a.学号 having avg(成绩)>85;
五 联结应用案例-查询学生的选课情况:学号,姓名,课程号,课程名称
select a.学号,a.姓名,c.课程编号,c.课程名称 from student as a inner JOIN score as b on a.学号=b.学号 inner join course as c on b.课程编号=c.课程编号;
六 case表达式-显示是否及格
select 学号,课程编号,成绩,(case when 成绩>=60 then '及格' when 成绩<60 then '不及格' else NULL end)as 是否及格from score;
七 case表达式-查询出每门课程的及格人数和不及格人数
select 课程编号,sum(case when 成绩>=60 then 1else 0end) as 及格人数,sum(case when 成绩<60 then 1else 0end) as 不及格人数 from score group by 课程编号;
八 case表达式-使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程编号和课程名称
select a.课程编号,b.课程名称,sum(case when 成绩 between 85 and 100then 1 else 0 end) as'[100-85]',sum(case when 成绩>=70 and 成绩<85 then 1 else 0 end) as'[85-70]',sum(case when 成绩>=60 and 成绩<70 then 1 else 0 end) as'[70-60]',sum(case when 成绩<60 then 1 else 0 end) as '[<60]'from score as a right join course as bon a.课程编号=b.课程编号group by a.课程编号,b.课程名称;
需要注意,group by a.课程编号,b.课程名称 这里, 当用多个列来分组时,这几个列的值全部相同才算一组
补充一下 group by 应用需要注意的
group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素: (1) 出现在select后面的字段 要么是是聚合函数中的,要么就是group by 中的. (2) 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having。
sqlzoo练习
这个题目一开始不理解为什么按teamname进行count,仔细思考后的结果是因为进行内连接,
因此不同的进球就会有很多相同的球队,因此通过count teamname来算出进球数,因此这个题目要对内连接的共同的部分交叉连接方式和sql运行顺序有了解。另外需要注意,交叉连接和全连接是不同的,一个表的1行,对另一个表的a.b行都做交叉,是交叉连接,而全连接,如果不是公共的部分,则连接后,另一部分不做交叉,只显示null(此部分是我的理解,以后需要再考虑看看)。
13题是case的应用。
这些题做下来感觉还是需要多练习才能掌握,光是理解是不够的,希望自己多加练习,才能理解的更好。
转载地址:https://blog.csdn.net/weixin_39767645/article/details/110864312 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!