第十二节 ACCESS SQL的JOIN(连接)查询
JOIN子句在SQL中用于连接两个或更多个表或查询中的记录,这种连接是依据表或查询中字段间已存在的相互关系进行的。
一、JOIN(连接)查询的类型
SQL JOIN(连接)查询有多种类型,具体如下:
-
INNER JOIN(内部连接):返回两个表中相关字段存在匹配值的记录。
-
LEFT OUTER JOIN(左外部连接):返回左表中全部记录,并同时返回右表中与之相匹配的记录。
-
RIGHT OUTER JOIN(右外部连接):返回右表中的全部记录并同时返回左表中与之相匹配的记录。
-
FULL OUTER JOIN(全外部连接):返回所有的与左表或者与右表关联匹配的记录。
为了大家能更好地理解JOIN查询所体现的两表之间的逻辑关系,我们用图示来反映它们的相互关系,如图12-1至图12-4所示:
图12-1:内部连接(INNER JOIN)中表间关系
图12-2:左外部连接(LEFT JOIN)中表间关系
图12-3:右外部连接(RIGHT JOIN)中表间关系
图12-4:全外部连接(FULL OUTER JOIN)中表间关系
二、INNER JOIN(内部连接)查询
从图12-1我们可以明确发现,INNER JOIN(内部连接)查询的目的是要找出两个相关联的表中有交叉的记录,就是两者的交集。
1、INNER JOIN(内部连接)查询语法
INNER JOIN(内部连接)查询的SQL语句的语法为:
Select column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
这里的“column_name(s)”是查询中将要显示或提取出的字段的列表或叫数据列的列表;“table1”及“table2”是将要对其进行JOIN(连接)查询的第一个表与第二个表的名字;ON关键字后的“table1.column_name = table2.column_name”是关系表达式,用于测试两表相关字段的关系,用于筛选它们的交集。
2、INNER JOIN(内部连接)查询实例
这里我们使用MS ACCESS自带的示例数据库中的表作为例子数据来说明问题,先看一看“订单”表,如图12-5所示:
图12-5:订单表中的数据行
再来浏览一下“客户”表的内容,如图12-6所示:
图12-6:客户表中的数据行
下面我们使用JOIN(连接)查询的SQL语句来查询所有订单的客户信息,如图12-7所示:
图12-7:JOIN(连接)查询语句示例
此查询执行后的结果如图12-8所示:
图12-8:JOIN(连接)查询的结果
JOIN(连接)查询也可以实现三个表及以上的多表查询,查询语句如图12-9所示:
图12-9:三个表的JOIN(连接)查询
需要注意的是,在ACCESS
SQL中JOIN(连接)三个表及更多表的查询中,后续的JOIN语句均需加上圆括号,不然系统会报错。查询后的结果如图12-10所示:
图12-10:三表JOIN(连接)查询结果
三、LEFT JOIN(左外部连接)查询
MS ACCESS SQL的LEFT JOIN(左外部连接)查询返回左表(即第一个表:表1)的全部记录,同时连接返回右表(即第二个:表2)中与表1相匹配的记录,如果表2中没有相应的与表1相匹配的记录,则返回的右表位置部分为NULL值。
1、LEFT JOIN(左外部连接)查询的基本语法
Select column_name(s)
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
语法结构中的项目与前面INNER
JOIN查询语法中的是一样的,大家可以参考前面的内容,这里不再是赘述,需要说明的是:在MS ACCESS
SQL的LEFT JOIN查询中,OUTER这个关键字是可以省略掉的,这一点应注意。
2、LEFT JOIN查询实例
我们不是以前面用过的“罗斯文商贸”示例数据库中的“订单”表及“客户”表为例来说明LEFT JOIN(左外部连接)查询的基本用法。
我们把“客户”表作为左表即表1,“订单”表作为右表即表2,用下面的语句进行查询:
Select 客户.公司, 订单.[订单 ID]
FROM 客户
LEFT OUTER JOIN 订单 ON 客户.ID = 订单.[客户 ID]
ORDER BY 客户.公司;
执行查询后得到如图12-11所示的效果:
图12-11:LEFT JOIN(左外部连接)查询结果
四、RIGHT JOIN(右外部连接)查询
RIGHT OUTER JOIN(右外部连接)查询与左外部连接查询极其相似,所不同的是RIGHT OUTER JOIN(右外部连接)返回右表(表2)的全部记录,同时连接返回左表(表1)中与右表相匹配的记录,左表中没有相应匹配记录的位置的值为NULL。
其基本语法为:
Select column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
说明同前,示例如下:
Select 订单.[订单 ID], 员工.姓氏, 员工.名字
FROM 订单
RIGHT OUTER JOIN 员工 ON 订单.[员工 ID] = 员工.ID
ORDER BY 订单.[订单 ID];
这里我们连接表1(订单表)与表2(员工表),返回“员工”表中的所有记录,并返回“订单”表中与“员工”表关联匹配的记录,在无匹配的地方为NULL值。如图12-12所示:
图12-12:RIGHT JOIN(右外部连接)查询结果
五、FULL OUTER JOIN(全外部连接)查询
FULL OUTER JOIN(全外部连接)查询返回全部左表和右表的所有记录,如果两表有相匹配的记录就连接输出,如果无相匹配的,在左表或右表位置处显示NULL值。ACCESS SQL未直接提供FULL OUTER JOIN查询命令,不过我位可以变通一下来实现,就是用UNION关键字合并一个LEFT JOIN查询与一个RIGHT JOIN查询来实现FULL OUTER JOIN(全外部连接)查询的功能,示例语句如下:
Select 客户.公司, 订单.[订单 ID]
FROM 客户
LEFT OUTER JOIN 订单 ON 客户.ID = 订单.[客户 ID]
ORDER BY 客户.公司
UNION ALL
Select 客户.公司, 订单.[订单 ID]
FROM 客户
RIGHT OUTER JOIN 订单 ON 客户.ID = 订单.[客户 ID]
ORDER BY 客户.公司;
执行该查询后结果如图12-13所示,与其它数据库的FULL OUTER JOIN(全外部连接)查询的效果一样。
图12-13:ACCESS SQL实现的FULL JOIN效果