自然连接
自然连接作用于两个关系(也可理解为两个表),并产生一个关系作为结果。
相比于笛卡尔积,它会将第一个关系和第二个关系的所有出现的元组(即数据表的行)都进行连接。而自然连接只考虑哪些在两个关系模式中都出现的且取值相同的元组对。
另外需要注意的是,自然连接不会重复列出在两个关系都出现的属性。而且结果的顺序也是有规定的:先是两个关系模式中的共同属性,然后是只出现在第一个关系的属性,最后是只出现在第二个关系模式的属性。
Sql 格式如下:
select A1, A2, ... An
from r1 natural join r2 natural join ... natural join rm
where P;
举个栗子:
select name, title
from instrucor natural join teaches, course
where teaches.course_id = coures.course_id
解释:先计算 instructor 和 teches 的自然连接得到结果1,然后计算结果1与course的笛卡尔积,最后where子句在结果中提取这样的元组。
外连接
实际上外连接有三种形式:
- 左外连接(left outer join) : 只保留出现在左外连接运算之前(左边)的关系中的元组。
- 右外连接(right outer join) : 只保留出现在右外连接运算之后(右边)的关系中的元组。
- 全外连接(full outer join) : 保留出现在两个关系的元组。
简单来讲,左外连接就是在进行两个表的匹配时,对于左边表出现的每一个元组:
如果右边的表存在对应的匹配项,则直接匹配列出对应的结果;
如果右边的表不存在对应的匹配项,则需要在右边表的列全都补上空值,再列出结果。
举个栗子:
select ID
from t_student natural left outer join t_takes
这样,t_student 表中的所有元组都列出在结果中,如果在 t_takes 表中存在匹配项,则分别取对应的匹配值,没有则取空。
右外连接则相反,对于右边表出现的每一个元组:
如果左边的表存在对应的匹配项,则直接匹配列出对应的结果;
如果左边的表不存在对应的匹配项,则需要在右边表的列全都补上空值,再列出结果。
全外连接可以理解为左外连接和右外连接的组合。即左右两侧的关系中所有元组都添加到结果中,不匹配的添上空值。
内连接
不保留未匹配元组的连接运算都称为内连接运算(inner join),sql查询中,当join子句没有使用outer前缀,默认情况下都为内连接。
总结
连接类型 | 连接条件 |
inner join | natural |
left outer join | on |
right outer join | using (A1, A2, … An ) |
full outer join |
在上表中,任意的连接形式(内连接、左外连接、右外连接或全外连接)可以和任意的连接条件(自然连接、using条件连接或on条件连接)进行组合。