多边查询如果按照连接条件的不同,可分为等连接和不等连接,顾名思义,等连接是指查询条件使用等号操作符(=),使用其他连接符的属于不等连接,如<,>;
按照连接类型可将查询分为:内连接、外连接、自连接;
先看举例中使用的两个表的完整信息
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(+)