sql中两列合并_Excel VBA+ADO+SQL入门教程16:外连接

点上方 关注我们 ,每日 1练 ,每天进步一点点 fb83f6570bcb42a4a43a360fede93dfb.gif  1. 诸君好,咱们之前聊了交叉连接和内连接,今天来聊外连接,也就是OUT JOIN…… 外连接又分为三种类型,分别是左外连接、右外连接以及全外连接。 左外连接的关键字是LEFT OUT JOIN,它返回左表所有的记录行。 右外连接的关键字是RIGHT OUT JOIN,它返回右表所有的记录行。 全外连接的关键字是FULL OUT JOIN,它返回左右表所有的记录行——但Excel和ACCESS不支持该用法。也就是说,我们目前只需要学习左、右外连接就可以了。 2bacd8a494b9de474a3afa3099466975.png            不管哪一种外连接,关键字OUT都是可省略的,比如LEFT OUT JOIN可以写成LEFT JOIN…… 另外,外连接的语法和内连接基本是一样的,都是通过关键字ON指定连接条件。  2. 这么多概念……烦的一匹? …… 照例还是举栗子吧,其实还是蛮简单的。 如下图所示,有两张表,左边是花名册,右边是成绩表。 2574fb8731d361a1ede204285c272531.png            问题一:查询花名册表中,每一个学员的考试成绩。 SELECT a.* , b.成绩 FROM [花名册$]a LEFT JOIN  [成绩表$]b ON a.姓名=b.姓名 语句采用左外连接的方式,将’花名册’和’成绩表’相连,连接的条件是两表的姓名相等(ON a.姓名=b.姓名)。 查询结果如下图所示:           2b7d6c1d06a7e877cc14882f0b082d71.png            由于采用了左外连接的方式,因此不管位于左侧的表(‘花名册’)的记录是否得到匹配,都将返回所有的记录行。 如果某条记录行未得到匹配,对应的结果值会以null表示,在Excel中也就是返回空白,例如传说中英俊、帅气、调皮、可爱、集万千宠爱于一身的‘看见星光’同学,它的成绩即为NULL。 也许有朋友问,这个问题能否使用右外连接的方式解决呢? 当然可以的。 右外连接的特性是,不管右表的记录行是否得到匹配,都将返回所有的记录; 因此我们只要将‘花名册’表放在连接位置的右边也就是了。 语句如下: SELECT b.*, a.成绩  FROM  [成绩表$]a RIGHT JOIN [花名册$] b   ON a.姓名=b.姓名 查询结果和左外连接别无二样。 问题2:查询成绩表中每一位学员的学号 ……哒哒哒,时间过去20秒,坦白说这个问题和上个问题并没有什么本质区别,仔细想想,是不是这个理儿? 介事儿,同样既可以用左外连接,也可以用右外连接的方式解决之。 左外连接: SELECT a.*, b.学号  FROM  [成绩表$]a LEFT JOIN [花名册$] b  ON a.姓名=b.姓名 右外连接: SELECT b.*, a.学号  FROM  [花名册$]a RIGHT JOIN [成绩表$] b   ON a.姓名=b.姓名 查询结果如下: 1cea3a992ed18be6eba8c366996e914a.png            问题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多表数据合并 ,这里就不再重复。 得到查询结果如下: 02a60ed0463eef9cca59d7088a17d229.png            如果觉得这查询结果不是很理想,比如,我们希望两个表的名字合并为一列,而不是分成两列,那我们可以继续: 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.姓名。 查询结果如下: 6baf58991873cdfb7a70f8b15ce2ec71.png             3. 打个响指: 有关SQL查询语句的多表连接部分,我们先后分享了简单粗暴的FROM+WHERE的交叉连接、INNER JOIN的内连接以及LEFT JOIN左外连接和RIGHT JOIN右外连接等。 交叉连接会得出笛卡尔积,效率偏低,不建议新手经常使用。 另外,交叉连接和内连接一样,最终都是返回连接表符合连接条件的记录行,舍弃不符合条件的; 与它们不同的是,不管是否得到匹配,左外连接都会返回左表的所有记录,右外连接都会返回右表的所有记录; 后两者显然是我们日常工作中更常使用到的,建议优先掌握其一。 挥挥手,送你一捧月光……和月光里的我~ OVER 致安~ ……   系统学习Excel,推荐加入我的Excel社群

a5042581b89930fe38931535a9626ac7.png

更多教程&练习

  • 001:零基础学Excel(一)什么是Excel?

  • 002:30个工作日后(含特定节假日)是哪天?

  • 003:连续区间查询的常用方法有哪些?


©看见星光 3eee0c06667cea9f8512c703063f51a4.png
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值