4.4 连接
-
自然连接
自然连接实际指定了搜寻条件。这里包括两部分的内容:首先,自然连接列必须同名,另外,所有同名列都将作为搜索条件。
-
自然连接所使用的关键字为natural join 。其连接原则为,两个数据源的共有列,并且具有相同列值。
-
结合与笛卡尔积的区别进行理解
自然连接与笛卡尔积的区别在于,笛卡尔积无论何时,都将获得两个数据表中所有记录的两两结合。而当两个数据表中存在同名列时,Oracle将同名列作为搜寻条件。相当于强制添加条件——where t1.column = t2.column。但是,当两个表不存在同名列时,Oracle不会添加任何搜寻条件,其效果相当于笛卡尔积。
-
例
-
teachers 表
-
-
student 表
-
-
自然连接teachers 和 student 表
-
select s.name,s.class,teacher_name,t.teacher_course from student s natural join teacher_couse t;
-
-
其中
- s.name
- s.class
- t.teacher_course
- teacher_name:不可以使用限定词,否则报错
-
等同于
-
select s.name,s.class,t.teacher_name,t.teacher_course from student s,teachers t where s.teacher_name=t.teacher_name;
-
-
-
-
-
-
-
内连接
自然连接使用两个表之间的公共列作为搜寻条件;而且要求公共列的值必须相等。这带来了极大的限制,因此,自然连接并不常用。而内连接突破了这两种约束。内连接可以自行指定连接列和连接条件。内连接运算的关键字为inner join.
-
例
- teachers 表
- student 表
-
内连接teachers表和student表
select s.id,s.name,s.class,s.teacher_name ,t.teacher_course from student s inner join teachers t on s.teacher_name=t.teacher_name;
内连接的inner join 中的inner 关键子可以省略
select s.id,s.name,s.class,s.teacher_name ,t.teacher_course from student s join teachers t on s.teacher_name=t.teacher_name;-
-
对于内连接,利用where 条件也可以实现相同的作用,但是:
-
在多于两表关联查询时
含有多个数据源时,例:A,B,C。此时使用where子句方式,from 子句中含有数据源:A,B,C;Oracle 在进行笛卡尔积运算时会进行优化,理想的笛卡尔积运算顺序为:AxBxC ,但是,使用where子句方式时,运算顺序可能会发生改变,得出不正确的结果。此时应使用内连接:
select * from A join B on …join c on …;
-
-
-
-
外连接
内连接所指定的两个数据源,处于平等的地位。而外连接不同,外连接总是以一个数据源为基础,将另外一个数据源与之进行进行条件匹配。即使条件不匹配,基础数据源中的数据总是出现在结果集中。那么,依据哪个数据源作为i基础数据源,便出现了两种外连接的方式——左(外)连接和右(外)连接。因为内连接没有左右之分,所以习惯上,将左外连接和右外连接简称为左连接和右连接。
-
左连接:left join
左连接,以lfet join 左侧的表作为基础表来实现关联
-
例
-
class_one表
-
-
teachers表
-
-
使用左连接,获取class_one表中所有学生对应的老师信息
- select c.*,t.teacher_course from class_one c left join teachers t on c.teacher_name=t.teacher_name;
-
-
-
右连接:right join
与左连接相反,右连接是以运算符右侧的表作为基础表来实现关联。
-
例
-
class_one表
- -
teachers表
-
-
使用右连接,获取teachers表中所有老师对应的学生信息
- select c.id,c.name,c.class,t.teacher_name,t.teacher_course from class_one c right join teachers t on c.teacher_name=t.teacher_name;
-
-
-
完全连接 full join
完全连接实际是一个左连接和右连接的组合。也就是说,如果两个数据源使用了完全连接,那么将首先进行一个左连接,然后进行一次右连接,最后再删除其中的重复记录,即得到完全连接。完全连接,应该使用full join 关键字,并使用on关键字指定连接条件。
-
例
-
class_one表
- -
teachers表
- -
使用full join获取class_one表 和 teachers表的完全连接。
-
select * from class_one c full join teachers t on c.teacher_name = t.teacher_name;
-
-
注意:full join 的执行结果与表的顺序无关,无论表在 full join 的前边还是右边,结果都一样!
- select * from teachers t full join class_one c on c.teacher_name = t.teacher_name;
-
-
-
-