本章概要:
1),交叉查询
2),交叉查询的运算过程
3),笛卡尔积的优劣
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查询中,我们通常会尽量避免笛卡尔积的产生,除非您就是需要笛卡尔积,比如列出所有产品组合的可能性……
那么如何在不产生笛卡尔积的前提下对数据进行连接查询?河中生灵为何神秘死亡?下游居民为何染上怪病?河畔植物为何不断变异?是残留农药还是可怕细菌?今日说法下期播出~
下期见~
还是皮一下比较开心……
晚安,我……
系统学习Excel,推荐加入我的Excel社群 ▼更多教程&练习
001:零基础学Excel(一)什么是Excel?
002:30个工作日后(含特定节假日)是哪天?
003:连续区间查询的常用方法有哪些?
©看见星光