sql 如何将一行数据填充到领一个表_SQL数据分析 - 5 多表查询

一、表的加法不同连接的应用场景举例

在SQL中,通过union连接词实现多表相加

练习:如何合并两个表

union对于重复数据只保留其中一个:

978252d89a703178f2d722d9d075fcf6.png

union all会将重复数据都进行保留:

3bf8a8f6a9c47093b952a127aa7ec202.png

二、表的联结

当进行多个表查询的时候,需要通过联结进行。

在联结中,表和表之前是通过列产生对应关系的,联结是通过表和表之间的关系将两个表合并在一起的操作。

fcee12709084c3fe7f55f8326a241e4e.png

常用的联结包括:

  1. 交叉联结(笛卡尔积):将一张表中的每一行都与另一张表中的每一行合并在一起。交叉联结结果的行数是两张表中行数的乘积

2. 内联结:选取出同时存在于两张表中的数据,关键词on后面的表示两张表通过哪个列匹配产生关系从而联结起来的

59f33ffa6a3a0c0640606730a9911593.png

79192b02bd7ce3e4a5934e0a08bf6d04.png

3. 左联结:将左侧表中的数据全部取出来。两个表进行左联结的时候,会将左侧的表作为主表,主表中的数据全部读取出来。

如果想要如下图所示的效果该怎么办呢?

d6bef01e13e7ab2ccbab32e29d88bb8d.png

这是在左联结的基础上去掉了两张表中共同的地方,也就是去掉了两个圆圈的公共部分。在刚才左联结的sql语句中加入一个where子句,实现效果:

4fb6dfbb571afc5b58abecc954b59e8a.png

4. 右联结:将右侧表中的数据全部取出来。两个表进行右联结的时候,会将右侧的表作为主表,主表中的数据全部读取出来。

8885792a661487ea740835c702f0e237.png

如果想要如下图所示的效果该怎么办呢?

9f8cb5fc56f05cda459e4080d24a0f77.png

这是在右联结的基础上去掉了两张表中共同的地方,也就是去掉了两个圆圈的公共部分。在刚才右联结的sql语句中加入一个where子句,实现效果:

2acb645bb7afeaad25fc44c66dc7f8b3.png

5. 全联结

全联结的查询结果会返回左表和右表中的所有行,当某行和另一张表中的某行有匹配的时候,两个行进行合并;如果某一行和另一张表中没有匹配的行时,另一张表中的值对应的地方用空值来填充。

值得注意的是:MySQL不支持全连接

6dad08fba3fc18c3341a7773ffd20cc4.png
  1. 当实际工作业务中想要生成固定行数的表单,或者特别说明了要哪一张表里的全部数据的 时候,会使用左联结或右联结
  2. 其他情况用内连接来获取两张表的公共部分

各联结文氏图表达:

999c076357d1d8f0821c955e1f14fc48.png

(字丑,见谅)

三、联结应用案例

利用联结解决实际业务中的问题

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

因为问题中需要查询的四个字段涉及到多个表(两张表),因此本题需要通过联结学生表和成绩表进行查询。

通过写分析思路(在各子句中写)来看如何把问题的每个部分对应到每个子句后面

注:用联结的时候要考虑到两个问题

a. 两个表如何联结?此题中两张表是通过学号来产生匹配关系的

b. 用哪种联结方式?因为要查到每个学生的信息,所以要保留左边学生表里的所有学号,因此用左联结。

把分析思路里的各个子句写成对应的sql,如下图:

bc87387dc75a283fe87437666d92abd3.png

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

问题可拆解为下图中两部分

接下来把分析思路里的各个子句写成对应的sql,首先写出第一部分对应的sql,如下图:

63a94694a14684f87969742efce34c26.png

在上面提到的分析思路中,第一步是查询出所有学生的学号、姓名和平均成绩。第二步是要平均成绩大于85分,所以现在应该把第二部分的条件加到上面的sql语句中去。而平均成绩是分组以后得到的,所以需要给分组结果加上条件,平均成绩大于85分用having子句。如下图:

9fe8914f77d32209e1780b571db22df4.png

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

三张表联结的sql语句,其实就是在from子句中加入了多个join两两相连

03d0a784087f2b9cd818689e22be4bdf.png

四、case表达式

使用case表达式可以帮助解决复杂的查询问题,当有多种情况需要条件判断的时候可以使用case表达式。case表达式的作用相当于一个进行条件判断的函数,用来判断某一行是否满足某一个条件。

case表达式的sql语句:

006d0eeb831a33e3cbfca4c4072794d8.png

其中when子句的判断表达式用来判断某行数据是否满足某个条件,

  1. 如果符合条件,就运行后面的then子句,则case表达式运行到此终止,不会运行后面的when子句了。
  2. 如果不符合某个条件,则进入下一个when子句。
  3. 如果直到最后的when子句也没有找到符合条件的数据,则会运行else中的表达式。

问题1:查询出每门课程的及格人数和不及格人数

df820d8505f12f299f49c5d898738b78.png

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

5e5e24d949774c374b9e372aa22cba1e.png

五、sql join练习题

e2f212e7edf305cd610a8fb53c6f86f6.png

46aa467f4cbe0f991c76694e847df665.png

d50bc7e63bb8e80ae2b498685ab3c2b2.png

db3a76ac867e3edde598036d76aa3c11.png

26f15996986b28c885f40f63af53fd4d.png

9486fd7a6161470eb3c126dbde51bef1.png

777c879cdf3a3ca62f38f7060c4e9ca4.png

a69ce1f8162bfd0ce7ea270f7f831bf5.png

81b91f0924037c795af357042565e844.png

632934f197bb65e5e76b22c3cb6de311.png

61ec08d9778c6fe372c01c2b12792c2e.png

0cd5481f39f14cee75e4f35baf7e4490.png

5ef850c099f5e26b6813dd2f785ab78d.png

以上就是第五节课程《多表查询》的内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值