1、连接条件
前面中提到了自然连接(natural join),且使用了join……using子句,join-using子句是一种自然连接的形式,只需要在指定的属性上的取值匹配,using里面的参数必须是被连接的两个表的共有属性。
区别于using条件,on条件允许在参与连接的关系上设置通用的谓词。该谓词的写法于where子句中谓词写法相同,出现在连接表达式的后面。例如
SELECT *
FROM student JOIN takes ON student.id = takes.id;
上面的连接表达式几乎与 student natural join takes一样,也与下面的书写是等价的,
select *
from student,takes
where student.id = takes.id;
与natural join和join -using不同的是,join-on使用的是通用谓词,为了显示这种区别,我们对第一个做个改动:
SELECT *
FROM student JOIN takes
ON student.id = takes.id AND dept_name='computer science';
很明显,join-on的谓词的域是包含natural join和join-using的域(取值空间)。
2、外连接
假设我们要显示一个所有学生的列表,以及他们选修的课程(尽管没有选修),我们可能会写:
select *
from student natural join takes;
但这样是达不到想要的效果的。因为对于没有选修课程的同学是不包括在结果集当中,而这里要求的是所有学生。如下图:
takes表 student表 结果表
那么我们应该怎么做,这个时候外连接就起到了作用。外连接会在结果在创建包含空值元组的方式,保留那些在连接中丢失的元组,外连接有三种形式:
1)左外连接(left outer join) 只保留出现在左外连接运算之前的关系中的元组
2)右外连接(right outer join) 只保留出现在右外连接运算之后的关系中的元组
3)全外连接(full outer join) 保留出现在两个关系中的元组
先比较之前使用的连接,不保留未匹配元组的连接运算称之为内连接运算。三种外连接。
左外连接:
SELECT *
FROM student NATURAL LEFT OUTER JOIN takes;
右外连接:
SELECT *
FROM student NATURAL RIGHT OUTER JOIN takes;
左外连接
右外连接
有人可能会问,会什么右外连接结果跟内连接是一样的。这里的原因能是因为右外连接只保留之后的关系中的元组,也就是所谓在takes表中,被选修的课程总有对应的学生,就不会出现学生为空的情况。
全外连接是左外连接与右外连接的组合。在内连接结果结果结算出来之后,左侧关系中不匹配右侧关系任何元组被添上空值并加到结果中。类似的,右侧关系中不匹配左侧关系任何元组也被添上空值并加到结果中。
3、总结
连接类型:外连接(<left,right,full>outer join)、内连接(inner join)
连接条件:natural、on<predicate>、using(A1,A2)
网友评论