[TOC]
1. 自然连接、using条件连接、on条件连接:内连接
- 连接条件-natural:natural join
select * from student natural join takes;
ID属性列出现一次。注:mysql57不能加inner
- 连接条件-using条件:join ... using ...
select * from student join takes using(ID); # default to be inner
# or
select * from student inner join takes using(ID);
ID属性列出现一次。由于student表与takes表仅ID属性值相同,两者(natural join与join...using)查询结果一致。
- 连接条件-on条件:允许在参与连接的关系上设置通用的谓词,谓词写法与where子句类似;on条件可以表示任何
SQL
谓词,使用on可以表示比自然连接更为丰富的连接条件
select * from student join takes on student.ID=takes.ID;
上面两个查询ID属性列出现两次,查询结果一致。
2. 外连接
- 左外连接:只保留出现在左外连接运算之前(即左边)的关系中的元祖
select *
from student natural left outer join takes;
outer可不写:
如何计算?
- 计算自然连接(内连接)的结果;
- 对于内连接左侧关系的任意一个与右侧关系任意元祖不匹配的元祖t,结果添加元祖r
- 元祖r从左侧关系得到的属性被赋为t中的值;
- r的其它属性被赋为空;
- 右外连接:只保留出现在右外连接运算之后(即右边)的关系中的元祖
select *
from takes natural right outer join student;
上述查询结果与左外连接查询结果一致。
- 全外连接:保留出现在两个关系的元祖(mysql不支持,可以针对左外连接与右外连接的结果采用union来实现)
select *
from (select *
from student
where dept_name = 'Comp.Sci') as A
natural full outer join
(select *
from takes
where semester = 'Spring' and year = 2009
) as B
- 带on条件的外连接
select * from student left outer join takes on student.ID=takes.ID;
与natural left outer join查询结果一致,但与下面的查询结果不一致(由于natural条件不存在,故 on true 作为一个连接条件不能缺少),因为on和where在外连接的表现是不同的:
References: [1] Abraham Silberschatz, Henry F Korth, S Sudarshan. Database System Concepts. New York: McGraw-Hill, 2010 Database System Concepts