SQL——连接表达式

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;

但这样是达不到想要的效果的。因为对于没有选修课程的同学是不包括在结果集当中,而这里要求的是所有学生。如下图:

《SQL——连接表达式》 takes表
《SQL——连接表达式》 student表

《SQL——连接表达式》 结果表

那么我们应该怎么做,这个时候外连接就起到了作用。外连接会在结果在创建包含空值元组的方式,保留那些在连接中丢失的元组,外连接有三种形式:

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;

《SQL——连接表达式》 左外连接
《SQL——连接表达式》 右外连接

有人可能会问,会什么右外连接结果跟内连接是一样的。这里的原因能是因为右外连接只保留之后的关系中的元组,也就是所谓在takes表中,被选修的课程总有对应的学生,就不会出现学生为空的情况。

全外连接是左外连接与右外连接的组合。在内连接结果结果结算出来之后,左侧关系中不匹配右侧关系任何元组被添上空值并加到结果中。类似的,右侧关系中不匹配左侧关系任何元组也被添上空值并加到结果中。

3、总结

连接类型:外连接(<left,right,full>outer join)、内连接(inner join)
连接条件:natural、on<predicate>、using(A1,A2)

    原文作者:薛定谔与猫的故事
    原文地址: https://www.jianshu.com/p/f2306379c3d0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞