mysql 多表联合查询_MySQL数据分析:多表查询

9b73d939a9115db64fc251d506176cab.png

本篇文章主题为MySQL多表查询,在实际的业务中,不可能将所有的数据都存到一张表格中,往往会有数张,甚至数十张十张表来支撑整个工作,那我们如何从多个表格中选取需要的数据呢。本节,我们继续对MySQL基础知识深入讲解:如何对多表进行查询

目录:

  • 表的加法
  • 表的联结
  • case表达式

新增一张名为course_1的表格

bdeacbb8b2e7da60c8deafa975546d69.png

表的加法

我们现在有两张课程表分别是课程表course 和 课程表course_1,现在我们想要知道所有的课程都有哪些,我们需要把两张表相加并且不显示重复项,这里我们使用union操作符:

union操作符可以合并多个select语句的结果集。

需要注意的2点:

union内部的select语句必须有相同数量的列;列名顺序必须相同且数据类型必须相似

一般默认union操作符相加的是不同的值,如果允许重复需要全部显示,可以使用union all操作符

我们实例来看:

-- 把课程表course 和 course_1 结合,不允许重复

60c60701539e56a74af03bbfd1340a2f.png
/*把课程表course 和 course_1 结合,允许重复*/

表的联结

如果想要知道每个学生每门功课的成绩,我们需要把学生表student和成绩表score中获取结果,得到一个更加完整的表,从完整表中查询学生的成绩。这里我们介绍新的关键词——join

join 用于根据多个表中的列之间的关系,从这些表中查询数据。

在我们的数据表实例中,各表之间都存在关系,是因为有主键key将这些表联系起来:

b8f51300cebb663a6eecddaa54bc9f03.png

现在将student表和score表格联系起来:

/*用join把学生表student和成绩表score交叉联结,显示学生成绩*/

c6385dcfec647c1afddb4150af65e770.png

我们看到,现在每个学生的“学号”“姓名”“课程号”和“成绩”就都显示出来了。

除了上述实例中的join联结,还有其他的联结方式,下面我列出所有的联结方式:

  • inner join 内联结:返回两个表可匹配的行;
  • left join 左联结:即使左表没有匹配,右表返回所有行;
  • right join右联结:即使右表没有匹配,左表返回所有行;
  • full join 全联结:只要其中某个表存在匹配九返回所有行;

接下来我们依次实例来说明:

1)inner join 内联结

/*用inner join把学生表student和成绩表score交叉联结,显示学生成绩*/

3abc7f421a9160a531a37f30f6e88748.png

2)left join 左联结

/*用left join把学生表student和成绩表score交叉联结,显示学生成绩*/

e2d647d8781dce77565d7862538831d8.png
可以清晰地看出,左连接的时候,左表的数据为主,就算右表中没有符合的数据,也会对应出一行

3)right join 右联结

/*用right join把学生表student和成绩表score交叉联结,显示学生成绩*/

b6550fa42830dde89dd0ee29df97c6c8.png
可以清晰地看出,右连接的时候,右表的数据为主,就算左表中没有符合的数据,也会对应出一行

4)full join 全联结

-- 用full join把学生表student和成绩表score交叉联结,显示学生成绩

MySQL数据库不支持full join语法,但是可以使用union all语法来代替,但是要记住:union内部的select语句必须有相同数量的列;列名顺序必须相同且数据类型必须相似。


case表达式

先说一下case表达式的作用,就像Excel中的if语句和Python中的if···else···语句,case表达式是SQL中的逻辑判断语句。

举例来看:

我们想要查询出每门课程的及格人数和不及格人数:

翻译大白话:

  • 定义条件:成绩>=60分及格,成绩<60分不及格;
  • 按课程号进行分组,对分组结果的人数按照上一步的逻辑条件计数;
# 

4d976e63f5e1f9756d993641b65e1d4c.png

② 我们对各课程的成绩按照[100-85(含)]、[85-70(含)]、[70-60(含)]、[60以下]分段,并统计各分段数人数和课程名

翻译大白话:

  • 定义条件:成绩在100-85(含)为[100-85(含)]段,在85-70(含)为[85-70(含)]段,在70-60(含)为[70-60(含)]段,小于60就是[60以下]分段;
  • 把成绩表score和课程表course交叉联结(右联结),显示课程号、课程名、和分数段;
  • 按课程号、课程名进行分组,对分组结果的人数按照上上述的逻辑条件计数;
-- 对各课程的成绩按照[100-85(含)]、[85-70(含)]、[70-60(含)]、[60以下]分段,并统计各分段数人数和课程名

8558d659474c1c7cc1d91b041d68baaf.png
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值