mysql 两张表合并查询_sql 第五关多表查询

  1. 表的加法:将两张工作表加在一起,可以用sql从多张表中查找数据
  2. 合并两个表、加法:union

5595f31b4f671150b05355deb28bc67c.png
将score和score1两张表加和在一起,未保留重复的行

1bad97fb8784002bc462e93b35ae0a6e.png
union all 表示保留重复的行
  1. 表的联结(join): 各表之间建立起联系,并最终联系在一起
  2. 交叉联结(cross join) 内联结(inner join) 左联结(left join) 右联结(right join) 全联结(full join)
  3. 表和表之间通过列产生关系.涉及到多个表查询用联结。

b7fa4754798aae4e77965173d9d8cbb0.png
  1. 交叉联结(cross join):行数是两张表行数的乘积 (实际应用中比较少)
  2. 内联结(inner join):查找出同时存在于两张表的数据;学生表和成绩表重合的地方是学号让两张表产生匹配,之后交叉联结;on表示两个表通过on后面的学号产生关系

bccf5038d9577c2e93dea71d1c207d8b.png
select子句后面都加了列的别名,避免表名太长

左联结(left join):左联结就是把左侧联结的表(主表)数据全部取出来,右边的表只选择和左边表相同学号的行,将两表之间的数据进行合并,交叉联结。

8799d48513479f056063253cb77eb03d.png

03ec514308b75caa507c357c0a4ea106.png
选出了左边表,但是去掉了两个表公共的部分

右联结:(right join)把右侧表数据全部取出来,左边只选出和右边表相同的部分。将两个表取出的数据合并,交叉联结。

全联结(full join)返回左表和右表的所有行;如果两表有匹配的地方,两表进行合并。如果没有合并的话,两表对应的值用空值null填充。mysql不支持全联结的

986c426c153264f2f1b261bb32c4d632.png

三、联结应用案例

78386c72f6c3d01300c0ccfae1b9446a.png
  1. 查询所有学生的学号、姓名、选课数、总成绩
  2. 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
  3. 查询学生的选课情况:学号,姓名,课程号和课程名称(三表联结)

58f3309ccc5d772b43840d023f708325.png
1、对多个表进行查询时用到联结,因为查到每个学生的信息,保留学生表的所有学号,用到左联结

fe1ca849c4151e8b2de2f06e257cd1cb.png
2、错误写法:where子句后不能使用avg()函数,所以报错

正确写法:

6a38eebc60a725f0a8d11cdc1365ebb4.png
2、平均成绩需要按学号去分组,然后求平均成绩;平均成绩大于85,平均成绩是分组得到的,所以得给分组加上条件,用having子句

0211f5f2dc14aeeb941f2be3c1130f17.png
3、注意三表联结:第二个left join直接加在on a.学号=b.学号后面,不需要在加from子句

b75fffca0d240c2ab5bce44ef927a322.png

d634877b8abd9c3ed35088810c18f2b4.png
as给case表达式起了别名,新列名’是否及格‘

4abd63b9822e34625fba6083ffa84d85.png

489932d0f61c9d1736ba308d954a8d21.png
先查询每门课程的人数。因为涉及及格和不及格两种情况,所以要用到case表达式。把及格人数设置为1,不及格人数设置为0,是为了sum汇总做准备的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值