sql 所有字段 关键字_Excel VBA+ADO+SQL入门教程14:交叉连接

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

本章概要:

1),交叉查询

2),交叉查询的运算过程

3),笛卡尔积的优劣

 1

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

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

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

 2.

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

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

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

举个小栗子。

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

098d32aba14ac3592bd5384a35d1b44b.png          

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

查询结果如下:

d0585b21d425617d1c4314a18a36cb17.png          

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

使用连接查询的方式,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.姓名

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

0d7c18e8a2c8a912be00ea4a437d50d3.png          

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

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

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

该过程类似于以下语句:

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

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

741ab9024a8612bcdcca27bfa090f676.png          

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

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

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

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

d824a1ec1f6c45c149bccec12ed3e782.png          

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

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

d0585b21d425617d1c4314a18a36cb17.png          

摊手,整个过程就酱紫~

 3.

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

07c189a734ce6fe2eebbfcdbef06a0b3.png          

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

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

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

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

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

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

下期见~

还是皮一下比较开心……

晚安,我……

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

c0859a45549a888f9ae19297d4999bc5.png

更多教程&练习

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

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

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值