天涯论坛

 找回密码
 立即注册
搜索
查看: 55|回复: 2

Excel VBA+ADO+SQL入门教程016:多表连接查询(下)

[复制链接]

3090

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098768
发表于 2024-8-4 10:50:28 | 显示全部楼层 |阅读模式

1.

诸君好,咱们之前聊了交叉连接和内连接,今天来聊外连接,便是OUT JOIN……

外连接又分为三种类型,分别是左外连接、右外连接以及全外连接。

左外连接的关键字是LEFT OUT JOIN,它返回左表所有的记录行。

右外连接的关键字是RIGHT OUT JOIN,它返回右表所有的记录行。

全外连接的关键字是FULL OUT JOIN,它返回上下表所有的记录行——但Excel和ACCESS不支持该用法。便是说,咱们日前必须学习左、右外连接就能够了。

不管哪一种外连接,关键字OUT都是可省略的,例如LEFT OUT JOIN能够写成LEFT JOIN……

另一,外连接的语法和内连接基本是同样的,都是通过关键字ON指定连接要求

2.

这么多概念……烦的一匹……

按例还是举栗子吧,其实还是蛮简单的。

如下图所示,有两张表,左边是花名册,右边是成绩表。

问题一:查找花名册表中,每一个学员的考试成绩。

SELECT a.* , b.成绩 FROM [花名册$]a LEFT JOIN  [成绩表$]b ON a.姓名=b.姓名

语句采用左外连接的方式,将’花名册’和’成绩表’相连,连接的要求是两表的姓名相等(ON a.姓名=b.姓名)。

查找结果如下图所示:

因为采用了左外连接的方式,因此呢不管位置于左侧的表(’花名册’)的记录是不是得到匹配,都将返回所有的记录行。

倘若某条记录行未得到匹配,对应的结果值会以null暗示,在Excel中便是返回空白,例如传说中调皮的‘看见星光’童鞋,它的成绩即为NULL。

许有伴侣问,这个问题能否运用右外连接的方式处理呢?

当然能够的。

右外连接的特性是,不管右表的记录行是不是得到匹配,都将返回所有的记录;因此呢咱们只要将‘花名册’表放在连接位置的右边便是了。

语句如下:

SELECT b.*, a.成绩  FROM  [成绩表$]a RIGHT JOIN [花名册$] b   ONa.姓名=b.姓名

查找结果和左外连接别无二致。

问题2:查找成绩表中每一位学员的学号

……哒哒哒,时间过去20秒,坦白说这个问题和上个问题并什么本质区别,仔细想想,是不是这个理儿?

介事儿,一样能够用左外连接,能够用右外连接的方式处理之。

左外连接:

SELECT a.*, b.学号  FROM  [成绩表$]a LEFT JOIN [花名册$] b  ON a.姓名=b.姓名

右外连接:

SELECT b.*, a.学号  FROM  [花名册$]a RIGHT JOIN [成绩表$] b   ONa.姓名=b.姓名

查找结果如下:

问题3,查找‘花名册’和‘成绩表’所有学员的成绩以及学号

介个问题,倘若运用全外连接的方式,语句能够写成如下:

SELECT * FROM  [花名册$]a FULL JOIN [成绩表$] b ON a.姓名=b.姓名

然则,之前说过,EXCEL并不支持全外连接的语句。

可是,如果必定必须全外连接的运算结果,咋么办?

——咱们能够经过左外连接+右外连接UNION合并去重的方式来实现。

语句如下:

SELECT * FROM  [花名册$]a LEFT JOIN [成绩表$] b ON a.姓名=b.姓名 

UNION 

SELECT * FROM  [花名册$]a RIGHT JOIN [成绩表$] b ON a.姓名=b.姓名

重视运算符是UNION,不是UNION ALL。它们之间的区别咱们在之前的章节仔细讲过了,Excel VBA+ADO+SQL入门教程012:UNION多表数据合并这儿再也不重复。

得到查找结果如下:

倘若觉得这查找结果不是很理想,例如咱们期盼两个表的名字合并为一列,而不是分成两列,那咱们能够继续:

SELECT 学号,IIF(a.姓名 IS NULL,b.姓名,a.姓名) AS 姓名,成绩 FROM(SELECT * FROM  [花名册$]a LEFT JOIN [成绩表$] b on a.姓名=b.姓名 UNION SELECT * FROM  [花名册$]a RIGHT JOIN [成绩表$] b on a.姓名=b.姓名)

查找中的FROM子句指定的表源自是之前UNON语句得出的中间表。经过IIF函数,系统判断a.姓名的记录是不是为NULL,倘若是NULL,则返回b.姓名,否则返回a.姓名。

查找结果如下:

3.

打个响指:相关SQL查找语句的多表连接部分,咱们先后分享了简单粗暴的FROM+WHERE的交叉连接、INNER JOIN的内连接以及LEFT JOIN左外连接和RIGHT JOIN右外连接等。

交叉连接会得出笛卡尔积,效率偏低,不意见新手经常运用另一,交叉连接和内连接同样最后都是返回连接表符合连接要求的记录行,舍弃不符合要求的;与它们区别的是,不管是不是得到匹配,左外连接都会返回左表的所有记录,右外连接都会返回右表的所有记录;后两者显然是咱们平常工作中更常运用到的,意见优先把握其一。

挥挥手  OVER  致安~

点击【阅读原文】下载示例文件

图文制作:看见星光

VBA编程与实践





上一篇:「每日一道面试题」Mysql内连接与外连接
下一篇:绝了,通俗的给你讲懂MySQL表连接原理
回复

使用道具 举报

3033

主题

312

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99099076
发表于 2024-9-10 01:43:37 | 显示全部楼层
你的努力一定会被看见,相信自己,加油。
回复

使用道具 举报

3090

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098768
 楼主| 发表于 2024-10-26 15:27:53 | 显示全部楼层
感谢您的精彩评论,为我带来了新的思考角度。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 12:55 , Processed in 0.121526 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.