sql 分组求和_SQL之多表查询

1 表的加法

将两个表的数据按行合并在一起(删除重复的行):

0459a3d528100e0c6a200c48e29e6057.png

2 表的联接

2.1 交叉联接(cross join)

将两个表通过交叉联接合并在一起:

62953f27a94b950f5cd318fc8fe07bf5.png

2.2 内联接(inner join):

afa5920d6b6f356a17877c621457e9d7.png

SQL语句:

30be0d2f8660b207b42546a64947f010.png

2.3 左联接(left join):

左边表格的内容全部取出,右边表格只取出主键列与左边表格有交叉的行

2c6c5fde748cdd3ea14d8adfb00c4b76.png

2.4 右联接(right join):

右边表格的内容全部取出,左边表格只取出主键列与左边表格有交叉的行

01e0066538ca83d5dd8460c5c4c1950c.png

2.5 SQL的联接总结

578b28adf32d150821984387fd26c6de.png

3 联接应用实例

3.1 问题:查询所有学生的学号、姓名、选课数、总成绩。

1)将问题翻译成大白话:

学号、姓名可以从学生表student中查询;选课数即每个学生的选课数目是多少,选课信息可从成绩表score中查询,按学号进行分组,然后对课程号进行计数count;总成绩即每个学生的总成绩,可从成绩表score中查询,按学号进行分组,然后对成绩进行求和sum。

即查询所有学生的学号、姓名,每个学生的选课数目、每个学生的总成绩。

2)分析思路

SELECT 查询结果【学号,姓名,选课数,总成绩】

FROM 从哪张表查询【学生表student,成绩表score,两个表如何联接?通过学号 用哪种联接?左联接】

WHERE 查询条件【没有】

Group by 分组【每个学生的选课数目:按学号分组,对课程号计数count;每个学生的总成绩:按学号分组,对成绩求和sum】

HAVING 对分组指定条件【没有】

Order by 对查询结果排序【没有】

Limit 从查询结果中取出指定行【没有】

3)对应的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.学号;

4)运行结果

b79f7fde403268fe863efe67250724b8.png

3.2 问题:查询平均成绩大于85的所有学生的学号、姓名和平均成绩

即: 查询出所有学生的学号、姓名(从学生表student中查询),平均成绩(从成绩表score中查询,按学号分组,求平均成绩avg(成绩)),并对分组指定条件(平均成绩>85),两个表使用左联接(left join)。

对应的SQL语句及运行结果:

461efbce0237fb5fe624658db9f97675.png

3.3 问题:查询学生的选课情况:学号,姓名,课程号,课程名称

查询学生的学号、姓名(从学生表student中查询),程号、课程名称(从课程表course中查询),学生表和课程表通过成绩表建立关系,学生表和成绩表通过学号联接,成绩表和课程表通过课程号联接。

对应的SQL语句及运行结果:

97d8ba4fb184c4e9e806211ac77e9331.png

4 case表达式

Case表达式的作用:相对于条件判断的函数,用来判断每一行是不是满足相应的条件。

4.1 表达式:

Case when <判断表达式> then <表达式>

when <判断表达式> then <表达式>

when <判断表达式> then <表达式>

……

Else<表达式>

End

4.2 查询学生的学号,课程号,成绩并判断成绩是否及格

d66bf38c2671a8d706dd10ffcac3d79f.png

4.3 查询出每门课程的及格人数和不及格人数

2010f18fbe3b493b415262ac1fedbc84.png

4.4 使用分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,分别统计各分数段人数、课程号、课程名称。

a7ecfd559e23aa19f3f47f817ef3ea93.png

5 sqlzoo练习

190bb4baaf2e31ef361f7f6a0cd19436.png

2e67eaafa9b9f22c46ba23887d867688.png

a387e475a18c847e43c95b8b3a6b73ba.png

fc408ec9ff6e1bc50bf5624391a94dc8.png

00d7f84c592a190ad6e196938ca10c92.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值