mysql 两张表合并查询_中级数据分析-多表查询

  • 表的加法
  • 表的联结
  • 联结应用案例
  • case应用案例

一、表的加法

b808961647f9210dd54ffa0f56be8e36.png

加法:union

391c27001fd31c9b87d353e03e8242e5.png

表的加法是把两个表的数据,按行合并在一起。

表的加法,会把两个表里重复的数据删除,只保留一个。

如果想保留重复数据,可以使用 union all

e3fc88553c58bba10d6e6412aa343d37.png

这样就保留了全部的重复数据

二、表的联结

b08aae223dd56ec5d42d02c7af3a6ae0.png
  • 交叉联结
  • 内联结
  • 左联结
  • 右联结
  • 全联结

(1)交叉联结-cross join

交叉联结也叫作 笛卡尔积

6566b6407ec5bc0ea1450069d650e4e2.png

(2) 内联结 - inner join

内联结 是同时查找出存在于两张表中的数据

5419cab513cc7ec0e048fb45b588d9e5.png

edfbdf5d1f30b174e2d738bd544b2c82.png

内联结步骤:根据条件,从两张表中找出符合条件的行,再通过交叉联结合并

写法:

c65d9f25969dcf14a70aa704aa5c99d5.png

结果:

5fc99104a9a7a171d573b77d75bd8ba5.png

(3) 左联结 - left join

538c21e17cccf1b6e52d00e29a23a06f.png

左联结是把左边表中的数据,全部取出来

左联结步骤:将左侧的表作为主表,主表中的数据全部读取出来。再根据条件,取出右边表中符合条件的行,通过交叉联结合并。

e31c7f802cd2fad3eaeee68e9085ff14.png

写法:

9b45b70319e8ae189ef3752987826e04.png

结果:

81265b9ed092bf77c48a0445a2449bdd.png

下面我们来看个问题,下图中,红色的部份如何用SQL表示出来,

178965b13ba76e0e76bf95c55cf4ad40.png

写法:

b0080dbe60bffecd4f0e0269564fb23e.png

结果:

0a05aa347dfa257ba4eaf8fdd6775489.png

(4) 右联结 - right join

f5663a5b4a8001620b0fdd0d67fee765.png

右联结是把右边表中的数据,全部取出来

右联结步骤:将右侧的表作为主表,主表中的数据全部读取出来。再根据条件,取出左边表中符合条件的行,通过交叉联结合并。

e31c7f802cd2fad3eaeee68e9085ff14.png

写法:

53bcc39a8dfd69ccda1f6311bfd30590.png

结果:

45b6fa839ade9c0bf147beea4ff712f2.png

下面我们来看个问题,下图中,红色的部份如何用SQL表示出来,

30c2082ca241a73e50c85dd00c8afb42.png

写法:

9055676c77b0fce504b5ca80cdfccd95.png

结果:

525e2d66f16f6ff101c7d312a782c77f.png

本次结果,因为右边score表中,所有数据在左表中都存在,所以结果为空。

(5) 全联结 - full join

b7273e5c6c15999b9a464bac41e92514.png

全联结步骤:返回左边和右表所有的行。当条件匹配时,两个行进行合并,如果不匹配,另一个表中对应的值用空值来填充。

需要注意下,mysql是不支持全联结的,这里理解下概念即可。

三、总结-一张表记住所有联结

d11ecd9cd13950cbfd9019dca47cdbd4.png

四、联结应用案例

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

1f1f5139de37da3854da150e74150ac9.png

写法:

22c46ebfb7a5f14e5b3d0f8ba9c8b4b4.png

结果:

3789178f0d692cfab595927b61b01578.png
  • 问题2:查询平均成绩大于85分的所有学生的学号、姓名和平均成绩

写法:

9dcb92588d16149acbefd7f8eb7390d9.png

结果:

7db3cf2249e234eee33073caa23a9a8c.png
  • 问题3:查询学生的选课情况: 学号, 姓名, 课程号, 课程名称

579adfae9afc1af14b4f9bc7f4ae07d0.png

这里涉及到3张表的联结了

写法:

0ee266bdf313e7f6d267aabcb6b3a5d1.png

结果:

fe0b09e1b9728b205289b489bb51661e.png

五、case表达式

83864bf811daa07a0bd0ebe4079058bc.png

案例:

7e2f847fab13aae30b88d0b83a802f95.png

下面我们要来看一下,查询每门课程的及格和不及格人数。我们按照课程号分组,但是每门课程对应的不是一个值,而是两个值:及格和不及格。相当于两种情况,这样的问题就可以用case表达式来实现。

写法:

c4a223791fc59c5b8d842c9efd218efb.png

使用case表达式注意事项:

(1)else子句可以省略,会默认为空值但为了更好的书写习惯,最好还是保留

(2)end不能省略不写

(3) case表达式可以写在sql语句的任意子句里

case表达式的作用:当有多种情况需要条件判断时,就可以使用case表达式

下面我们再来看一个案例

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

分析:这里要用到两个表,课程表和成绩表

写法:

bfc0ad9fa952085de390bd13ebc5e541.png

这里为什么要使用两个列来分组呢。因为使用group by时,select子句里面的列名,只能是group by 里面的列名,或者使用聚合函数的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值