mysql两个结果相加_MySQL数据分析:多表查询

本文详细介绍了在MySQL中如何进行多表查询,包括表的加法(使用union和union all操作符)、表的联结(如inner join, left join, right join以及全联结的模拟实现)以及case表达式的使用,通过实例帮助理解这些查询技巧在实际业务中的应用。" 128894137,7783997,UE5多人游戏网络同步详解,"['游戏开发', 'Unreal Engine', '网络编程', '服务器', '客户端']

fe4ed2011ec657e68d707fee757b8881.png

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

目录:

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

新增一张名为course_1的表格

f80cb9a9e310a384d42dabc3d8a45af0.png

表的加法

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

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

需要注意的2点:

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

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

我们实例来看:

-- 把课程表course 和 course_1 结合,不允许重复
SELECT * FROM course UNION SELECT * FROM course_1;

3373cc40b73a1472915aa75507cd18ca.png
/*把课程表course 和 course_1 结合,允许重复*/
SELECT * FROM course UNION ALL SELECT * FROM course_1;

表的联结

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

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

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

4f2c507c21c945cd273cf99186993a1f.png

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

/*用join把学生表student和成绩表score交叉联结,显示学生成绩*/
SELECT a.学号,a.姓名,b.课程号,b.成绩 FROM student as a JOIN score as b ON a.学号=b.学号;

dd829766b557724ea3fa1c5df1e45c04.png

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

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

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

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

1)inner join 内联结

/*用inner join把学生表student和成绩表score交叉联结,显示学生成绩*/
SELECT a.学号,a.姓名,b.课程号,b.成绩 FROM student as a INNER JOIN score as b ON a.学号=b.学号;

2b6d3d643b2f6f77d29af32c30daca4e.png

2)left join 左联结

/*用left join把学生表student和成绩表score交叉联结,显示学生成绩*/
SELECT a.学号,a.姓名,b.课程号,b.成绩 FROM student as a LEFT JOIN score as b ON a.学号=b.学号;

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

3)right join 右联结

/*用right join把学生表student和成绩表score交叉联结,显示学生成绩*/
SELECT a.学号,a.姓名,b.课程号,b.成绩 FROM student as a RIGHT JOIN score as b ON a.学号=b.学号

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

4)full join 全联结

-- 用full join把学生表student和成绩表score交叉联结,显示学生成绩
SELECT a.学号,a.姓名,b.课程号,b.成绩 FROM student as a FULL JOIN score as b ON a.学号=b.学号;

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


case表达式

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

举例来看:

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

翻译大白话:

  • 定义条件:成绩>=60分及格,成绩<60分不及格;
  • 按课程号进行分组,对分组结果的人数按照上一步的逻辑条件计数;
# 查询出每门课程的及格人数和不及格人数
/*
定义条件:成绩>=60分及格,成绩<60分不及格;
按课程号进行分组,对分组结果的人数按照上一步的逻辑条件计数;
*/
SELECT 课程号,
SUM(CASE WHEN 成绩>=60 THEN 1
ELSE 0
END)AS 及格人数,
SUM(CASE WHEN 成绩<60 THEN 1
ELSE 0
END)AS 不及格人数
FROM score
GROUP BY 课程号;
 

cca4cf564ace95e0bad529f007e74877.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以下]分段,并统计各分段数人数和课程名
/*
定义条件:成绩在100-85(含)为[100-85(含)]段,在85-70(含)为[85-70(含)]段,在70-60(含)为[70-60(含)]段,小于60就是[60以下]分段;
把成绩表score和课程表course交叉联结(右联结),显示课程号、课程名、和分数段;
按课程号、课程名进行分组,对分组结果的人数按照上上述的逻辑条件计数;
*/
SELECT a.课程号,b.课程名称,
SUM(CASE WHEN 成绩 BETWEEN 85 AND 100 THEN 1 ELSE 0 END)AS '100-80(含)',
SUM(CASE WHEN 成绩 BETWEEN 70 AND 85 THEN 1 ELSE 0 END)AS '85-70(含)',
SUM(CASE WHEN 成绩 BETWEEN 60 AND 70 THEN 1 ELSE 0 END)AS '70-60(含)',
SUM(CASE WHEN 成绩 <60 THEN 1 ELSE 0 END)AS '60以下'
FROM score AS a RIGHT JOIN course AS b
ON a.课程号=b.课程号
GROUP BY a.课程号,b.课程名称;

3084959ff2db7f14fc1078c750a7841f.png
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值