多表连接查询

多表查询是使用SQL必须掌握的技能。多表查询实现的本质是笛卡尔积,在数据库中对应的操作定义为连接。也就是说,在数据库中,使用连接实现多表查询——将多个表连接起来,使其看起来像一个表。

多表查询-笛卡尔积

通过from子句,可以定义一个在该子句中所列出关系上的笛卡尔积。除了使用集合理论来形象化地定义,这里通过迭代的过程来理解,此过程可为from子句的结果关系产生元组。
for each 元组 t 1 t_1 t1 in 关系 r 1 r_1 r1
     ~~~~     for each 元组 t 2 t_2 t2 in 关系 r 2 r_2 r2
     ~~~~           ~~~~     
     ~~~~           ~~~~     for each 元组 t m t_m tm in 关系 r m r_m rm
     ~~~~           ~~~~      t 1 t_1 t1, t 2 t_2 t2, …, t m t_m tm连接成单个元组 t t t
     ~~~~           ~~~~      t t t加入到结果关系中
此结果关系具有来自from子句中所有关系的所有属性。对于关系 r i r_i ri r j r_j rj中可能出现相同的属性名的情况,在属性名前加上关系名作为前缀,表示该属性来自哪个关系。
使用where子句中的谓词来限制笛卡尔积所建立的组合,只留下那些对所需答案有意义的组合。

自然连接

在进行多表查询时,需要定义匹配条件,用以表示在所有匹配名称的属性上相等。针对这种通用的情况,SQL引入一种被称为自然连接的运算。自然连接可以简化from子句中多表上所有匹配名称的属性值相等的处理。自然连接是为了简化SQL编程者的工作
自然连接运算作用于两个关系时,会产生一个关系作为结果。不同于两个关系上的笛卡尔积,它将第一个关系的每个元组与第二个关系的所有元组都进行连接;自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。
注意,对于两个关系模式的重复列,只出现一次。同时,也要注意列出属性的顺序。先是两个关系模式中的共同属性,然后是那些只出现在第一个关系模式中的属性,最后是那些只出现在第二个关系模式中的属性。
自然连接简化了两个关系连接的条件输入是:
(1) 连接条件是等值连接,如 t1.col1 = t2.col1;
(2) 两个关系中的列必须同名同类型,如 t1.col1 和 t2.col1 的类型相同。
在一个SQL查询的from子句中,可以用自然连接将多个关系结合在一起,如下所示:
select A 1 A_1 A1, A 2 A_2 A2, …, A n A_n An
from r 1 r_1 r1 natural join r 2 r_2 r2 natural join … natural join r m r_m rm
where P;
更为一般地,from子句可以以如下形式:
from E 1 E_1 E1 , E 2 E_2 E2 , … , E m E_m Em
其中 E 1 E_1 E1 可以是单个关系或 一个包含自然连接的表达式。
为了发扬自然连接的优点,同时避免不必要的相等属性带来的危险,SQL提供一种自然连接的构造形式,允许用户来指定需要哪些列相等。形式如下:
select A 1 A_1 A1, A 2 A_2 A2, …, A n A_n An
from r 1 r_1 r1 join r 2 r_2 r2 using ( A 1 A_1 A1)
其中, A 1 A_1 A1为两个关系的同名、同类型属性。
join…using运算与自然连接类似,只是明确了相等属性,而不是匹配关系的所有相等属性。
类似的,join…on运算的on条件可以表示任何SQL谓词,从而使用on条件的连接表达式就可以表示比自然连接更为丰富的连接条件。

外连接(outer join)

自然连接的一个问题是对不满足匹配条件的元组不会出现在结果关系中,这就导致某些元组可能会以这种方式丢失。SQL根据是否保留未匹配元组,将连接分为外连接和内连接。
外连接通过在结果中创建包含空值元组的方式,保留了那些在连接中丢失的元组。实际上有三种形式的外连接:
(1) 左外连接(left outer join):只保留出现左外连接运算之前(左边)的关系中的元组。
(2) 右外连接(right outer join):只保留出现右外连接运算之前(右边)的关系中的元组。
(3) 全外连接(full outer join):保留出现在两个关系中的元组。全外连接是左外连接与右外连接类型的组合。
注意,不同数据库对全外连接的支持可能不同,如MySQL数据不支持全外连接。

内连接(inner join)

为了把常规连接和外连接区分来开,SQL中把常规连接成为内连接。内连接也称等值连接。注意,关键词inner是可选的,当join子句中没有显示使用inner或outer关键字时,该连接类型则表示inner
此外,自然连接是内连接的一种特殊形式,自然连接连接的是同名属性列,而内连接则不要求两属性列同名。对内连接来说,可以用using或on来指定某两列字段相同的连接条件。
示例如下:

slect * from student join takes using(ID);

等价于

slect *  from student inner join takes using(ID);

类似地,natural join等价于natural inner join。

参考

数据库系统概念(第六版) A. Silberschatz H. F. Korth S. Sudarshan著 杨冬青 等译 第三章-第六章
https://blog.csdn.net/weter_drop/article/details/84729822 mysql 内连接、自然连接、外连接的区别
https://blog.csdn.net/Ber_Bai/article/details/118029011 SQL内连接、外连接、全连接、交叉连接、自连接、自然连接

你可能感兴趣的:(数据库系统概念,数据库,join,多表查询)