三个表查询sql语句_SQL语句的多表查询
1.练习如何合并连个表,注意使⽤union all语句表⽰保留重复项
2.内联结:
在from⼦句中同时使⽤了两张表,并对每张表起了别名a和b, student as a;在列名中⽤" a.列名"表⽰某⼀句;from⼦句中⽤inner join表达内联结,选取出同时存在于两张表中的数据;on⼦句中表达两个表中⽤学号,产⽣了关系。on的作⽤就好像桥梁⼀样。
sql中union多表合并
3.左联结:以left join表⽰左连接,加⼊where⼦句,表⽰去掉表a和表b的两者交集的公共之处。注意是:is null表⽰在表格B中,学号⼀列为空值
4.右联结:使⽤right join语句来表⽰右联结。若只取右边⼀侧,则where⼦句左边为空。
5.查询所有学⽣的学号、姓名、选课数、总成绩:⽤sql解决业务问题的三步⾛:翻译成⼤⽩话+写出分析思路+写出对应的sql⼦句
select a.学号,a.姓名,count(b.课程号) as 选课数, sum(b.成绩) as 总成绩
from student as a left join score as b
on a.学号=b.学号
group by a.学号;
6.查询平均成绩⼤于85的所有学⽣的学号、姓名、平均成绩
select a.学号,a.姓名,avg(b.成绩) as 平均成绩
from student as a left join score as b
on a.学号=b.学号
group by a.学号
having avg(b.成绩)>85
7.查询学⽣的选课情况:学号,姓名,课程号,课程名
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.课程号
8.查询出每门课程的及格⼈数和不及格⼈数:case表达式的注意事项:1.else可以表达不写,则表⽰空值,但不建议省略 2.end不可以省略不写 3.case表达式也可以写在⼦句中
select 课程号,
sum(case when 成绩>=60 then 1
else 0
end) as 及格⼈数,
sum(case when 成绩<60 then 1
else 0
end) as 不及格⼈数
from score
group by 课程号;
9.使⽤分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,分别统计各分数段⼈数;课程号和课程名称。注意,⽤group by分组时,加⼊b.课程名称实际上并不影响分组结果。
select a.课程号, b.课程名称,
sum(case when 成绩 between 85 and 100 then 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 b
on a.课程号=b.课程号
group by a.课程号,b.课程名称;
SQLZOO:The JOIN operation
1.
2.
3.利⽤join⼦句
4.
5.
6.