数据库的左联结和右联结是个啥呢?

【1】因为姓名和成绩在两张表所以需要用到左联结,因为要计算每个学生的总成绩用到sum函数所以需要用到group by

select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩

from student as a left join socre as b

on a.学号=b.学号

group by 学号

【2】要查每个学生的平均成绩,所以要用group by

select a.学号,a.姓名,avg(b.成绩) as 平均成绩

from student as a left join socre as b

on a.学号=b.学号 and

group by 学号

having avg(b.成绩)>85

【3】查这四个数据要通过三张表,学生到成绩到课程,这里用inner join 是因为要的是选课情况,如果没有选就不用显示了

select a.学号,a.姓名,c.课程号,c.课程名称

from student a inner join score b on a.学号=b.学号

inner join course c on b.课程号=c.课程号;

及格和不及格要进行判断所以用case结构,要注意between是两者都包括

select a.课程号,b.课程名称

sum(case when 成绩 between 85 and 100

then 1 else 0) as '[100-85] '

sum (case when 成绩 >= 70 and 成绩 <85

then 1 else 0 ) as '[70-85]'

sum(case when 成绩>= 60 and 成绩<70

then 1 else 0) as '60-70'

sum (case when 成绩<60 then 1 else 0

then 1 else 0) as ’[<60]‘

from score a right join course as b

group by a.课程号,b.课程名称

练习:

这部分题目使用的是‘2012年欧洲足球锦标赛’数据库里的表。

这道题用右联结是因为要找出每个German的得分所以要保留goal表所有的数据

这道题只要匹配到比赛即可,所以用内联结

因为这里是一个比赛对应一个team所以用inner join

这道题要找进德国球门的,所以要找得分的球队是德国球队的对立面。

因为要求team得分总和所以groupby就用teamname

以stadium单位进行得分统计所以groupby用stadium

统计POL球队的比赛所以不要忘记team1和team2

这道题a.mdate去掉也可以

这道题太坑了,没看到排序花了好长时间,要加上order by。

最后,鸭哥推荐大家一个网站,力扣大家可以面试前去刷题,加油!