sql case when用法_SQL-多表查询

1f3f179e2221b5f0903979f78d5fbe86.png

一、表的加法 Union

1. union的用法

l 单独用union时,合并后的表会删除重复数据

c9a21039f4a1ab258442e1569de4d291.png

可见重复项‘0001 语文 0002’只保留了一项

19cab690dc99648b526187bc2f661170.png

062c4755f0a4dc1801a489b8124a9d48.png

2. union的用法

用union all 时,合并后的数据会保留所有的值,不删除重复项

402cbd0e749a204235930ab1abae896c.png

二、表的联结Join

1、交叉联结 cross join

表a中的每一行与表b中的每一行逐行联结,得到的联结后的表的行数=表a的行数*表b的行数

2、内联结 inner join

查找出同时存在于两张表中的数据,即两个表重叠的部分

设置别名,方便调用

a64ddb8f5b9f6b796caacf2292d1a9b9.png

3、左联结 left join

将左边表的数据全部保留,右边表的数据取出与左边表相同部分的数据

a6fc431f2bb8abe63a4da7822a33f658.png

4、右联结 right join

将右边表的数据全部保留,左边表的数据取出与右边表相同部分的数据

e2502b70efa4fa2f5d4062ed60dc284c.png

三、如何用SQL解决业务问题

1、查询所有学生的学号、姓名、选课数和总成绩

分析思路:

学号、姓名信息student表中找

选课、成绩信息score表中找

统计每个学生的信息需要按学号分组

统计选课数需要用到count()函数

统计总成绩用到sum()函数

将学生信息与选课,成绩信息关联起来需要用到左联结left join

cd8666e0e6b62ae5f55fea8ce60974b1.png

2、查询平均成绩大于70的所有学生的学号、姓名和平均成绩

分析思路:

学号、姓名信息student表中找

选课、成绩信息score表中找

统计每个学生的信息需要按学号分组

平均成绩要用到avg()函数

平均成绩大于85,用到having字句

将学生信息与成绩信息关联起来需要用到左联结left join

26c8bc426c282eaf66ab053ba9681a47.png

3、查询学生的选课情况:学号,姓名,课程号,课程名称

分析思路:

学号、姓名信息student表中找

学生对应课程在score表中找

课程号、课程名称在course表中找

student表与score表通过‘学号’联结

score表与course表通过‘课程号’联结

32c8cd70dd2a86ff4a4bb94353c15598.png

四、case表达式

当when...时执行then后面的表达式,相当于if...then...

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

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

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

...

else <表达式>

end

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

分析思路:

用case 表达式将成绩<60设定为不及格,成绩>=60设为及格;

查询每门课程的及格与不及格人数,按每门课程分组group by

l 因为涉及到了case表达式,不能直接用count函数统计及格与不及格人数,所以

当when成绩<60时,then后面的值设为1,else则为0,再通过sum()函数得出不及格的数量

当when成绩>=60时,then后面的值设为1,else则为0,再通过sum()函数得出及格的数量

fa7bdb0931ef45d1a52cb61e18b926bf.png

2、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称

分析思路:

因为涉及各科成绩,用right join通过课程号联结两个表

使用case表达式结合sum函数统计各分数段的人数

分数在score表中找

课程号和课程名称在course表中找

0594f1f77927424cf1d83b5b4c7155ba.png

五、SQLZOO 练习

565ec9e76ced778972130036a99bdf80.png

b146b25948a1e983c11b43b4ec31019e.png

cc2bfa31fa0847e11da5356939f63b3d.png

b7250137a3d996bf52bb7d4a9e127ba0.png

eab84b2ea15f57c9dcebbe8cf0e7db8b.png

73200b583a68e1c13a783ec532a25a14.png

bea971a5707a9f4b099530847d40dce4.png

83b98c99f7a6d871af3efdec40a6175f.png

b26bb68e6122a9f42afeee8b42f3787f.png

3fb33ccf2316e5882525a03d1a3e0532.png

b37e5fce49702de51ca60fc8ce81a18b.png

977b70d30e984dfaea282526adc0ead1.png

3d3b2ff2ac912b1dfdeab958a4707bd1.png

问题和需要注意的地方:

1. 分析业务问题前先理清楚业务逻辑,从哪些表找数据,用哪种种联结方法

2. SQLZOO 第10题有陷阱, 列出该场馆和该场馆的进球看似很简单,用inner join 就错了, 要得出该场馆所有的进球数据应该用联结,且进球数据一定要统计到每个球员

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值