Oracle 11g学习笔记–内连接,外连接和自连接
概念:
内连接:一般默认情况下都是内连接,指的是只有满足条件才会被select出来,也就是说当某一行的一列是空值时,那么将不会被select出来;
外连接:即使某一行的一列包含空值,也会被select出来,那么内连接又分为左连接,右连接,全连接
自连接:顾名思义就是自己和自己连接;
实例:
在此我们使用的是produts和produt_types两张表
produts表
produt_types表
内连接
select
products.name,
product_types.name,
products.price
from
products inner join product_types
on
products.product_type_id = product_types.product_type_id;
--其实它和一下语句执行结果相同
select
products.name,
product_types.name,
products.price
from
products, product_types
where
products.product_type_id = product_types.product_type_id;
执行结果:
外连接
外连接实现方式有两种;
1.full/left/right join实现
2.用(+)实现
1.右连接
显示右表的所有数据,然后根据条件与左表匹配,如果有匹配的就加在左表的后面,如果有多条匹配数据,则显示多条。没有的话,该行以null值填充。
select
products.name, product_types.name, products.price
from
products right join product_types
on
products.product_type_id = product_types.product_type_id;
--用(+)实现
select
products.name,
product_types.name,
products.price
from
products ,product_types
where
products.product_type_id(+) = product_types.product_type_id;
运行结果:
2.左连接
显示左表的所有数据,然后根据条件与右表进行匹配,如果有匹配的就加在左表的后面,如果有多条匹配数据,则显示多条。没有的话,该行的右表就以null值填充
select
products.name, product_types.name, products.price
from
products left join product_types
on
products.product_type_id = product_types.product_type_id;
--用(+)实现
select
products.name,
product_types.name,
products.price
from
products ,product_types
where
products.product_type_id = product_types.product_type_id(+);
运行结果:
3.全连接
select
products.name,
product_types.name,
products.price
from
products full outer join product_types
on
products.product_type_id = product_types.product_type_id;
--注:全连接不能使用(+)实现
运行结果:
自连接
有时可能有这样的需求,一张表要和自己进行连接,这时候就需要自连接;
如有员工(employees)表:
我们现在有输出所有人为的老板是谁,我们就可以使用自连接
select
emp.first_name || ' ' || emp.last_name
|| 'work for' ||
boss.first_name || ' ' || boss.last_name
from
employees emp, employees boss
where
emp.manager_id = boss.employee_id;
执行结果:
Ron Johnson work for James Smith
Susan Jones work for Ron Johnson
Fred Hobbs work for Ron Johnson
补充:
1.自然连接与等值连接:
自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列;
2.这里附上一张图:
来源:http://blog.csdn.net/tianlesoftware/article/details/5795896