Oracle 多表查询连接的三种类型

多边查询如果按照连接条件的不同,可分为等连接和不等连接,顾名思义,等连接是指查询条件使用等号操作符(=),使用其他连接符的属于不等连接,如<,>;

按照连接类型可将查询分为:内连接、外连接、自连接;

先看举例中使用的两个表的完整信息

select * from products;

select * from product_types;

1、内连接

平时使用的大多数条件查询都算是内连接,只有当连接中的列包含满足条件的值时才会返回一行,也就是说如果如果连接条件中有一个值为空,那么该列就不会显示;

如上述products表中,product_id为12的那条记录,product_type_id为空,那么如果使用内连接,则该行数据不会显示;

如下:

select pp.product_id, pp.name, pt.name
  from products pp, product_types pt
 where pp.product_type_id = pt.product_type_id

2、外连接

在某些查询条件下,为查看完整的数据,空列也需要显示出来,使用外连接就可以达到这种效果;外连接分为左外连接和右外连接,查询时需在查询条件处加上(+)操作符;

(1)左外连接

以查询条件左边字段的值为条件显示所有的行,(+)操作符在查询条件等号右面

如:select pp.product_id, pp.name, pt.name
  from products pp, product_types pt
 where pp.product_type_id = pt.product_type_id(+)

product_type_id为12的那一列正常的展示出来了;

(2)右外连接

以查询条件右边字段的值为条件显示所有的行,(+)操作符在查询条件等号左面;

select pp.product_id, pp.name, pt.name
  from products pp, product_types pt
 where pp.product_type_id(+) = pt.product_type_id

此时,将显示product_type所有值相关的记录,此时如果product_types有一条记录的product_type_id是products没有的,那么这条记录也会展示出来;

如下,在product_types表中新增一条记录;

然后查询:select pp.product_id, pp.name, pt.name
  from products pp, product_types pt
 where pp.product_type_id(+) = pt.product_type_id

(3)外连接的限制条件

禁止同一个条件中同时使用左外连接和右外连接,如:select pp.product_id, pp.name, pt.name
  from products pp, product_types pt
 where pp.product_type_id(+) = pt.product_type_id(+)

不能同时使用外连接条件和in或者or连接符,如下,如果使用该类连接符,系统会报ora-01719的错误;

select pp.product_id, pp.name, pt.name
  from products pp, product_types pt
 where pp.product_type_id(+) in (1,2,3,4)

ORA-01719: outer join operator (+) not allowed in operand of OR or IN

3、自连接

如果查询信息的条件和结果都在一个表中,这是可使用自连接,顾名思义,连接条件中是同一个表;

如表employees,如果要显示员工的上级领导,即字段manager_id对应的人物姓名,employees表如下;

select * from employees;

select pp.employee_id,pp.first_name||'.'||pp.last_name as name,tt.first_name||'.'||tt.last_name as manager
  from employees pp, employees tt
 where pp.manager_id = tt.employee_id(+)


猜你喜欢

转载自blog.csdn.net/haidibeike/article/details/9014613