欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

sql 相加_SQL多表查询

发布时间:2024/9/15 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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多表查询的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。