分享

Excel VBA ADO SQL入门教程014:多表连接查询(上)

 L罗乐 2018-03-11

我们好像在哪儿见过你记得吗 好像那是一个春天我刚发芽 我走过 没有回头 我记得 我快忘了……

1.

前尘往事如云烟,聊了SQL辣么久,总算聊到连接查询了……

连接查询……有时称多表查询……有时又称多表连接查询……名字有差异,但意思总是一样——在多表之间创建指定关系的连接,并按指定连接条件进行数据查询。

在语句形式上,连接查询通常有两种实现方式。一种是FROM子句列出所有需要连接的表,然后通过WHERE子句列出筛选条件;另一种是通过关键字JOIN建立表和表之间的连接,再通过关键字ON指定连接条件。


2.

我们今天先聊简单、粗暴的第一种方法,该方法在语法上可以简单总结如下:

SELECT 字段名 FROM 表1,表2 WHERE 表1.字段名=表2.字段名

FROM子句列出需要连接查询的多个表,不同表名之间使用英文逗号间隔,然后WHERE子句指定了筛选的条件,最后SELECT子句指定需要提取字段的名称。

举个小栗子。

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

现在我们需要查询班组为‘二组’的人员成绩明细……

查询结果如下:

这问题是不是有点眼熟?我们好像在哪见过你还得吗?是的,我们上期刚分享过子查询的解决方案,不知道相关语句你是否还记得……

使用连接查询的方式,SQL语句如下:

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

以上语句中,花名册$和成绩表$两个表名反复出现,使代码书写和阅读都趋于复杂,此时我们可以使用表的别名进行简化。

和字段别名一样,定义表的别名关键字也是AS,但和字段别名不同的是,在对表定义别名时,关键字AS可以省略。

比如以下语句,我们将[花名册$]定义别名为a , [成绩表$]定义别名为b:

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

代码也可以写成:

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

对比上一条的语句,不难发现部分字段名省略了表名,这是因为相关字段名称在连接表中是独一无二的;而‘姓名’是花名册和成绩表都存在的字段名,则必须提供表名,否则系统无法识别字段来源,会发出错误提示:

说完表的别名,我们再说下语句的含义和运算过程。

通过第11章的内容(Excel VBA ADO SQL入门教程011:SELECT语法结构和运算顺序),我们知道,系统首先执行FROM子句。

本例中,FROM子句存在两个表,花名册和成绩表,系统读取它们的别名,并计算两个表的笛卡尔积,也就是列出这两个表中行的所有可能的组合,形成一个中间表。

该过程类似于以下语句:

SELECT * FROM [花名册$]a , [成绩表$]b

运行该语句获得结果如下:

这个结果显然并不是我们最后希望获取的,但通过观察该表,我们也不难发现,只要我们通过WHERE子句指定两个条件即可获得目标数据,也就是组别='二组'以及a.姓名=b.姓名。

……下一步,系统按照WHERE指定的筛选条件(WHERE 组别='二组' AND a.姓名=b.姓名),对中间表进行筛选,去除中间表不符合条件的记录。该过程运算结果等同于以下语句:

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

运行该语句得出结果如下:

观察该表,a.姓名和b.姓名字段内容重复,而我们只需要其中一个即可,因此我们在SELECT子句中提供了3个字段名(SELECT 组别,a.姓名,成绩)

最后,系统按我们提供的字段名,从执行WHERE子句后得出的中间表中提取记录作为结果表……最后结果如下:

摊手,整个过程就酱紫~


3.

FROM WHERE的这种连接查询方式,虽简单,但也过于粗暴。

它会产生笛卡尔积,也就是会列出了连接表之间行的所有可能组合。

比如两个表,各有10行记录,行的所有可能组合也就是10X10=100行……

如果两个表各有1万行呢?那就是1万X1万=1万万……

如果两个表各有30万行呢?那就是……抱谦,你电脑可以重启了,谢谢。

在SQL查询中,我们通常会尽量避免笛卡尔积的产生,除非您就是需要笛卡尔积,比如列出所有产品组合的可能性……

那么如何在不产生笛卡尔积的前提下对数据进行连接查询?河中生灵为何神秘死亡?下游居民为何染上怪病?河畔植物为何不断变异?是残留农药还是可怕细菌?今日说法下期播出~

下期见~

还是皮一下比较开心……

为什么讨厌甚至反感写书……就因为写书我没办法皮啊,像老夫子一样一板一眼的写枯燥的教程想想也还是觉得厌倦……

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多