sql server ado报连接失败_Excel VBA+ADO+SQL入门教程15:内连接

点上方 关注我们 ,每日 1练 ,每天进步一点点 d7a257fb726db7b1ae2d1a8b3201a7c5.gif

大部分时间里,我们并不存在;在某些时间,有你而没有我;在另一些时间,有我而没有你;在有些时间,你我都存在……

——博尔赫斯《交叉小径的花园》

 1.

咱们上期说,在语句形式上,多表连接查询通常有两种实现方式,当时也聊了第1种,也就是简单粗暴的FROM+WHERE,今天咱们就来聊第2种方式,JOIN+ON……

语法如下:

SELECT column FROM join_table JOIN_TYPE join_table ON(join_condition)

Join_table是指定参与连接的表名。

JOIN_TYPE是连接的类型。

ON (join_condition)是指定连接的条件,通常由字段名和比较运算符、逻辑运算符构成。

连接的类型(JOIN_TYPE)常用的有3种,内连接(INNER JOIN)、外连接(OUT JOIN)和交叉连接(CROSS JOIN)。

我们先来说交叉连接(CROSS JOIN)……

为什么先说CROSS JOIN?次要原因是在这个早晨它总是让我想起笛卡尔,想起博尔赫斯,想起博尔赫斯《小径分叉的花园》,这让我难过;更次要原因是我们对它是比较熟悉的……

咦,为什么说我们对他比较熟悉……

交叉连接是返回连接表所有数据行的笛卡尔积,也就是列出连接表之间所有行的可能性组合——这和我们上期分享的FROM+WHERE是不是如出一辙?

事实上,FROM+WHERE的多表连接实质便是交叉连接;以下两个表达式也完全是等价的。

SELECT 字段名 FORM 表1,表2

SELECT 字段名 FROM 表1 CROSS JOIN 表2

举个小例子

……

……

还是不举了

不举例子的原因是,EXCEL和ACCESS并不支持CROSS JOIN语句,如果需要交叉连接,请使用FROM +WHERE的方式。

这就是我们先聊CROSS JOIN的主要原因——没得聊。

卒。

 2.

再说下内连接。

内连接通过关键字INNER JOIN 将多表连接,并通过关键字ON,指定连接条件。

语法如下:

SELECT 字段名 FROM 表1 INNER JOIN 表2 ON 连接条件

内连接又称等同连接,返回连接表所有相匹配的记录,舍弃不匹配的记录。

这句话是什么意思呢?举个例子。

如下图所示,有两张表,左边是‘花名册’,后边是‘成绩表’

4290286f9571214cee5a40cdd05ad893.png          

现在我们需要查询组别为‘二组’的人员的成绩。

也就是查询‘看见星光’,‘小苏’和‘VBA编程’三个人的成绩。

语句如下:

SELECT a.*,b.成绩 FROM [花名册$]a INNER JOIN [成绩表$]b ON a.姓名=b.姓名 WHERE 组别='二组'

系统先运算FROM子句,FROM [花名册$]a INNER JOIN [成绩表$]b ON a.姓名=b.姓名 该语句中,我们使用内连接的方式将‘花名册’和‘成绩表’两个表格相连,连接的条件是两个表姓名记录相等,得到中间表如下:

19da62a3371c882b5c5d73a116ece5e5.png          

然后系统运算WHERE子句,WHERE 组别='二组',从中间表中删除组别不等于’二组’的记录。

最后按SELECT子句提取字段内容。SELECT a.*,b.成绩, a是[花名册$]的别名,a.*意思就是[花名册$]的所有列。b.成绩就是[成绩表$]的成绩列。

最终获得查询结果如下:

68ed0c8b73400d1846c8502b10dddd69.png          

此时我们发现一个秘密。

花名册的二组明明有三个人,但查询结果却只有两个人,少了谁?少了‘看见星光’。

为什么谁都不少,偏偏少了‘看见星光‘呢?’看见星光‘这家伙到底有和不同寻常之处?脸大?跑的快?还是年纪大不洗澡?……

真相只有一个。

4a44fed8bfca86f5e4b520fcf82d32e5.png          

内连接只返回连接表中符合连接条件的记录。

示例中的连接条件是ON a.姓名=b.姓名,也就是只返回’花名册’和’成绩表’姓名相等的记录,花名册有‘看见星光’,但‘成绩表’并没有这位大爷,因此该条记录明显不相等,不予返回。冷漠脸。

如果我们使用交叉连接的方式,是否查询结果会有不同呢?

比如使用我们上期讲过的语句:

SELECT 组别,a.姓名,成绩 FROM [花名册$]a , [成绩表$]b  WHERE 组别='二组' AND a.姓名=b.姓名

然后发现结果并无不同,依然不见’看见星光’的踪影。

d7dbf1f8aa767c30b710b1afc656c3e1.png          

……

……

 3.

不管是内连接还是交叉连接(FROM+WHERE),都是由连接表中符合连接条件的行构成结果表,也就是说,任何一个表中的行在另外一个表中不匹配,也就不会出现在最后的结果表中……

但有时候我们并不希望如此;比如A表和B表两表连接查询,不管是否有匹配结果,我们都希望保留A表的所有行,或者保留B表的所有行,再或者保留两个表合起来的所有行……

如何解决这个问题?

——啪!欲知后事如何,且听下回分解外连接~

我给你瘦落的街道、绝望的落日、荒郊的月亮。

我给你一个久久地望着孤月的人的悲哀。

博尔赫斯《我用什么才能留在你》

……
……

  系统学习Excel,推荐加入我的Excel社群

6ed1416dcfeb8ca123d8914e48292ffd.png

更多教程&练习

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

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

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


©看见星光 1cc38ac77b1722e2d299a5c8750830c1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值