【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。