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(+)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值