leftjoin多表联合查询_SQL系列文章(五):多表查询

你好,我正在学习SQL(Structured Query Language),以写文章的方式整理和输出所学,这是系列文章第五篇,主题是多表查询。

我在前面讲过了简单查询、分组汇总和复杂查询,它们都是在同一张表中查询数据,当想要查询的数据在多张表中,就得用多表查询了。

多表查询要求表与表之间有关联,否则还不如直接用单表查询,具体的原因我会在后面解释,你先记住这个结论。

表的联结

表与表的关联叫做联结,通过表的列来实现。

bb041b5f2ce5de6dcc86cf536f898bde.png
引用自“猴子数据分析”

从上图可以看出,这四张表是通过相同的列名两两联结起来的,通过这种联结关系就可以从多个表中查询数据了。下面,我们来看看具体的实现过程。

为了后面的演示,我创建了下面四张表。

810afe09ddb7dd1b60cfe1ebe875b08e.png
student——学生信息表

7a3507a86c01cc598c7ecafa931590ee.png
score——成绩表

15c90c4376de2467012b0adff19bf428.png
course——课程表

894f044584a7bde3d727c946b343daf8.png
teacher——教师表

多表查询语法

多表查询常用的语法是这样的:

fe00a0dd28b983704037304dd2d333be.png

看起来很复杂,有点懵哈。别急,现在只是让你有个大概的认识,我会逐项拆开讲清楚的。

首先看第2行中的带有表名的部分:

14e7d5e0a6ee6a5c83cedfdd80696887.png

b2c22c7ccfeaf93c3fd989f6f7dc67fb.png

这是在给表table_a和表table_b取别名,这样后面就可以直接使用别名,而不需要写很长的表名,使用起来更方便。

再来看第二行的on语句:

19817485643975525d34da2d03c1cc20.png

on语句的作用是给两张表指定联结条件,即两个表通过哪个列联结。以第一张图“联结关系图”为例,学生表和成绩表通过“学号”这一列联结起来,写成sql语句就是这样的:

on a.学号=b.学号。

bb041b5f2ce5de6dcc86cf536f898bde.png

再看将tablea和table_b合并起来的代码:

4866524efd9d3170e78f42a83753faf3.png

将两表合并在一起的关键字是join,[]内的关键字是可选项,分别给出不同的合并方式。可选项的意思是说你可以根据具体问题决定是否使用以及使用哪一个。

最后看第三行:

4abe9dcdcf1f32065667a1b52bccd630.png

当要在三张及三张以上的表中查询数据,只进行一次合并显然不行,这时就要用到第三行所示的代码了,它会对之前合并后的结果与其后的表进行合并。

下面,我详细说明三种合并方式。

inner join

inner join 的意思是内联结,与集合中的交集类似,就是找到在两张表中起到联结作用的列中都存在的值,将那些共同值所在的行一一匹配起来。下面的图形象的描述了这个过程。

80886eaf65cde8cf8549582a9e3c1642.png
引用自“猴子数据分析”

图中学号这一列中,值'0001'是两表共有的,学生表中学号为0001所在的行就和成绩表中学号为0001所在的两行相匹配。

c5b41a13bba5332ad3d3918d0b737f76.png
引用自“猴子数据分析”

上图中出现了一个新的概念“交叉联结”,所谓交叉联结就是指两张表中的行两两组合形成新行。如果左边的表有1行,右边的表有2行,组合后就会产生新的两行数据;如果左边的表有3行,右边的表有2行,组合后就会产生新的6行数据。

7f83b1884a1b86e35859194a4844b0dc.png

我举个具体的例子。查询所有已经选了课的学生的信息,显示学号、姓名、课程号和成绩。

9e14bd9e43bb7f399269931d504b428e.png

“已经选了课”这个条件要求学生的学号要同时在学生表和成绩表中出现,所以用 inner join 合并两张表,在学生表中没有选课的学生“马云”和“王思聪”的信息就不会出现在查询结果中。

810afe09ddb7dd1b60cfe1ebe875b08e.png

另外,因为现在从两个表中查询数据,为了避免错误和混淆,select语句中列名前面都加了别名。

left join

left join 的意思是左联结,如图所示

f8fd396a1d16d379150dcbe827d60a44.png
引用自“猴子数据分析”

7f487e9ef1061e0264c5a1dfc2a37d5d.png
引用自“猴子数据分析”

left join 与 inner join 的不同之处在于,left join 的结果不仅包含了两表中匹配的行,也包含在左表中但不在右表的行。即 left join 的结果由两部分组成:第一、inner join 的结果;第二、在左表中且与右表没有匹配的行,右表中相应位置的值用空值替代。

举个例子,查询所有学生的选课情况,要求显示学生的学号,姓名,课程号,成绩。

456e59fa198583bb82303c09236b1759.png

查询结果不仅显示选了课的学生的信息,也显示没有选课的学生的信息。

right join

顾名思义,这是右联结。

0f9b6f7a2b3f33c3ac158dece38eb683.png
引用自“猴子数据分析”

1d28a5c3b187932396656aa63e3ae809.png
引用自“猴子数据分析”

与 left join 恰好相反,右联结的结果中包含的是在右表中且与左表没有匹配的行。

举个例子。查询所有课程被选择的情况,显示学号,课程号和课程名称。

ec4168352652e13f1477cc85671c7b51.png

生物这门课没人选。

上面这些例子都是从两张表查询数据,下面我举两个在三个表及更多的表中查询数据的例子。

从三个表中查询。查询所有学生的选课情况及成绩,显示学号,姓名,课程号,课程名称,成绩。

5d4f89978110ed14dff15493db1cf2c1.png

从四个表中查询。查询所有学生的选课情况、成绩及任课教师信息,显示学号,姓名,课程号,课程名称,成绩,教师号,教师姓名;

57eb4f51e588fe3a7e663505d4ac1e96.png

如果两个表之间没有关联,会发生什么情况呢?你应该已经得到了,要么结果是空的,要么就是只得到某一个表的数据。

inner join

72be7677f49ac2531e041dbe25b4c3e6.png

left join

b049f380ca727afb86a88b9ff71d5d27.png

right join

adbe7e39a8d6a004537736e28273e8e3.png

所以说,如果表与表之间没有关联,就不适合用多表查询来查询其中的数据。

最后,我给你做个小结:

1、表与表通过由关联的列联结在一起;

2、多表查询的基本语法是:

fe00a0dd28b983704037304dd2d333be.png

最后的最后,感谢阅读,欢迎指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值