多表查询的返回结果用什么接收_第五关SQL之多表查询

从简单到复杂,从单一到多表,上一关经历复杂,这一次我们开始多表查询了,多表查询的首要任务其实就是把多表变成一个表,然后再继续下一步动作,怎么把多表变成一个表呢?开始我们的学习吧。

1、表的加法(union)

结构一样,但是数据不一样,利用表的加法,把两张表合并成一张表

7bc6c5591d1c5f51de002babb78442c2.png

union:直接将两个表的数据按照行合并到一起,删除重复数据;

8c239de8a715c8638fde6eba7b605b27.png

union all:将两个表的数据按照行合并到一起,保留重复数据;

ecaed54bae2486c96189b576acf8236d.png

2、表的联结(join)

联结是通过表和表之间的关系,把表合并到一起的操作,重点是关系,常用的联结有以下几种:

交叉联结(cross join):两个表没有关系,返回被连接的两个表所有数据行的笛卡尔积;

内联结(inner join):表中至少有一个匹配,则返回数据;

左联结(left join):右表中有没有匹配,都从左表返回数据;

右联结(right join):左表中有没有匹配,都从右表返回数据;

全联结(full join):只要其中一个表有匹配,则返回数据;

实操:

交叉联结(cross join):

dbe2c5a79b8aa27f573feea976578d8a.png

交叉联结相当于乘法,所以数据量很大,一般不直接使用,也不常用,不过是所有联结的基础;

内联结(inner join):

d2dd587c49a350dd6f1899cc6049c327.png

a04bb120796bfa3c7924139731d273a0.png

90cccd05b330c0c29c7dca38a7d6a26a.png

左联结(left join)和右联结(right join):

两个原理是一样的只是方向不一样,

024de383281b876a20aed88f19520785.png

248180844b3caf6fc36616e98013a483.png

f52794d2013be0130acadbf1f496a8e6.png
左联结

1771350fb9b61eafc268246b83a23089.png
右联结

加上where是可以取消两表中的重复部分

2b74b5bbe7047c400a80da0d6cfcf5f3.png

全联结(full join):

3f125f3b8f1a0017848c3784dc42648d.png

返回左表和右表的所有数据,有匹配就数据合并,没有就用空值填充,my sql不支持全联结;

dd8cba5fc0603a3f47217d80b7a122db.png

3、联结应用案例

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

分析:

1)学号、姓名(学生表 student)

2)选课数(每个学生的选课数目:成绩表score,按学号分组,对课程号计数count)

3)总成绩(每个学生的总成绩:成绩表 score,按学号分组,对成绩求和sum)

e09d91d2945277946c7923208c7076f6.png

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

分析:

1)查询出所有学生的学号,姓名,平均成绩;学号,姓名(在学生表student);

平均成绩(每个学生的平均成绩:在成绩表score,按学号分组,平均成绩:avg(成绩));

2)平均成绩>85

32b1435454d0fbdd627ff8559bf86c1c.png

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

分析:

1)学号,姓名在学生表(student)

2)课程号,课程名称在课程表(course)

学生表和课程表没有直接的关系,需要通过成绩表建立关系

384d71674828b4fdfc449a326da2d773.png

4、case 表达式

当有多种情况需要判断的时候,就需要使用case表达式了;

如何符合某个条件,就运行后边的then子句,不符合条件继续进行运行when子句,如果还没有查找到合适的数据,就会到else子句。

问题:判断学生的成绩是否及格

分析:

成绩大于等于60分及格,小于60分就不及格,其他就是空值。

f9d8a286fe4cf06087507c66df2aa982.png

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

分析:

统计合格的人数,大于等于60分就统计一个及格人数,没有就是0,然后计算总数

统计不合格的人数,小于60分就统计一个不及格人数,没有就是0,然后计算总数

5804ecba9a82e4ff356ffb664081c8c8.png

问题:使用分段{100-85}、{85-70}、{70-60},{<60}来统计各科成绩,根据课程号、课程名称统计各分段人数

分析:

这一题和上面是同样的道理,要判断分段的人数,所以用case语句,因为课程号,课程名和分数不是同一个表,要用到联结。

0449c130bae32de6b2f5e6713a7e5697.png

总结:本次学习的东西信息量挺大的,要多观察多表格之间的联系,而且要熟悉运用联结,这个需要多练习,而且练习之余要多思考,我脑洞大了一下,计算人数,第一时间想到计数函数count,想了老半天,还是觉得sum最合适,这个就是经验了,经验源于苦练,多多练习。

加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值