sql 相加_SQL多表查询
一.表的加法
相加就是用union把两个select语句相加,会去重;如果需要保留重复的行,用union all就可以了
二.表的联结
联结的几种类型:
1.交叉联结 2.内联结 3.左联结 4.右联结 5.全联结
一.交叉联结 cross join(笛卡尔积)
两个表的行数相乘就是最终的行数
在实际运用中很少用到,因为数据太多了,占用大量的设备空间,但是是后面所有联结的基础。
二.内联结 inner join
查找出同时存在于两张表中的数据,用文氏图去记忆更直观
select a.学号,a.姓名,b.课程号
from student as a inner join score as b
on a.学号=b.学号;
二.左联结 left join
查找出左侧表中的数据,用文氏图记忆
三.右联结 right join
将右侧表中的数据全部取出来,文氏图右边的圈
四.全联结 full join
Mysql不支持全联结
当需要某个表的表头或者特别指明要某个表的数据时,用 left join 或者 right join
其他情况用inner join
以下是重点:
如何用sql解决实际问题
问题:查询所有学生的学号、姓名、选课数、总成绩
1.学号、姓名(学生表student)
2.选课数(成绩表score按学号分组,对课程号计数count)
3.总成绩(成绩表,按学号分组,对成绩求和sum)
select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
from
student as a left join score as b
on a.学号=b.学号
group by a.学号;
问题:查询平均成绩大于85的所有学生的学号、姓名、平均成绩
1.学号、姓名(学生表student)
2.平均成绩 (avg(成绩)score 需要group by 学号 分组后再筛选平均成绩用having)
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;
问题:查询学生的选课情况:学号、姓名、课程号、课程名称
1.学号、姓名(student)
2.课程号,课程名称(score、course)
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表达式
相当于进行条件判断的函数,用来判断每一行是不是满足某个条件
case when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
when<判断表达式> then<表达式>
---
else<表达式>
end
内部运行逻辑:
查询出每门课程的及格人数和不及格人数
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 课程号;
运行过程:
case表达式的注意事项
1.else表达式可以不写,视为null,建议不要省略
2.case表达式可以写在sql语句的任意子句里面
案例:
使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:
各分数段人数,课程号,课程名称
1的地方容易忘记加;2的地方可加可不加
总结
以上是生活随笔为你收集整理的sql 相加_SQL多表查询的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 下列不是python对文件的写操作方法的
- 下一篇: sql输出带颜色的字段_带你走进MySQ