首页 > 代码库 > 自然连接
自然连接
时间:2014.05.04
地点:基地
心情:五月的天,刚诞生的夏天。5月1号和唐彬骑自行车去了岳阳,当天晚上11点抵达岳阳县毛田镇,在明明酒家投宿。次日11点低到目的地岳阳县相思乡相思园,在这里停留了大概一刻钟,然后返回坐班车去岳阳市,在再岳阳市转车回了长沙。回到学校,该是好好学习,加油!
-------------------------------------------------------------------------------------
一、概念
自然连接即通过对参与关系中所有同名的属性取等完成。即要求两个关系中,进行比较的分量必须相同的属性组,并且在结果中会把重复的属性列去掉。
-------------------------------------------------------------------------------------
二、详情
我们都知道,两个关系上的笛卡尔积是将第一个关系的每个元组和第二个关系的每个元组都进行连接,这样m个元组的关系和n个元组的关系,经过笛卡尔积后形成的是一个m x n个元组的关系。自然连接与之区别的是,它只将那些在两个关系模式中都出现的属性上取值相同的元组对进行连接。而且列出时,这些重复属性不会重复列出,顺序是:先两个关系的共同属性,然后是只出现在第一个关系中的属性,再然后是出现在第二个关系中的属性。
例如:考虑对于大学所有讲授课程的教师,找出他们的姓名以及讲授的课程标识,其中instructor关系中是教师的基本个人信息,关系teacher中是关于教师的课程安排信息。我们可以这样写:
select name,course_id from instructor,teachers where instructor.ID=teaches.ID;这里是先形成笛卡尔积,然后在用where谓词去筛选。更简单的吧表示是使用自然连接
select name,course_id from instructor natural join teaches;
在一个SQL查询的from子句中,可以用自然连接将多个关系结合在一起,比如:
select A1,A2,A3,...An form r1 natural join r2 natural join ... natural rm where P;
更为一般的是,from字据的如下形式:
from E1,E2,......,En其中每个Ei都可以是单个关系,也可以是一个包含自然连接的表达式,例如,想要列出教师的名字以及他们所讲授课程的名称,可这样写:
select name,title from instructor natuaral join teachers,course where teaches.couse_id=course.course_id;这里我们先计算了instructor和teaches的自然连接,然后再计算了一个和course的笛卡尔积,最后用where子句从这个结果中提取这样的元组,来自连接结果的课程标志和course关系的课程标识相匹配。
值得注意的是如果我们这样使用(假设我们已经我们的course关系中也包含course_id,title,dept_name等属性):
select name,titile from instructor natural join teaches natural join course;它们的结果是有区别的,因为自然连接是将两个关系模式中都出现的属性上取值相同的元组进行连接,这样,在前一个自然连接的基础上,还要和course进行自然连接,而course的属性还包括有dept_name,于是所形成的查询结果是还必须得在dept_name属性上取值也相同,然而这并非所要求的。为了解决这个问题,同时也不失去自然连接的简洁性,SQL可允许用户指定自然连接需要哪些属性相等。于是可这样:
select name,title from (instructor natural join teaches) join course using (course_id);即,可用join...using运算指定配对的属性列表,通用格式为:join r2 using(A1,A2),它与r1和r2的自然连接类似,但只要求在r1.A1=r2.A2并且r1.A2=r2.A2成立就可以匹配进行连接了,而不管是否r1.A3与r2.A3是否 相等。这样,在上述中,我们就可以允许teaches.dept_name和course.dept_name可以是不同的了。于是就能查询到想要的答案。