- 论坛徽章:
- 7
|
3.外连接
Oracle语法:
3.1 左外连接
select a.employee_id, a.department_id, b.department_id, b.department_name
from hr.employees a, hr.departments b
where a.department_id = b.department_id(+)
and a.employee_id in (100, 101, 17
order by a.employee_id
EMPLOYEE_ID DEPARTMENT_ID DEPARTMENT_ID DEPARTMENT_NAME
100 90 90 Executive
101 90 90 Executive
178 空值 空值 空值
雇员178号没有部门号,这个如果连接条件是a.department_id = b.department_id,则不会匹配出雇员178,因为雇员表没有雇员178的的部门号,部门表也没有雇员178的部门号,空值与空值的匹配仍然是空值.但是如果是部门表b.department_id(+)这样与雇员表a.department_id进行连接,那么就会把雇员178给匹配出来.这就是oracle的左外连接.
SQL1999语法:
select a.employee_id, a.department_id, b.department_id, b.department_name
from hr.employees a left outer join hr.departments b
on a.department_id = b.department_id
where a.employee_id in (100, 101, 17
order by a.employee_id
得出一样的结果集
3.2 右外连接
select a.employee_id, a.department_id, b.department_id, b.department_name
from hr.employees a, hr.departments b
where a.department_id(+) = b.department_id
and b.department_id in (110,120)
EMPLOYEE_ID DEPARTMENT_ID DEPARTMENT_ID DEPARTMENT_NAME
205 110 110 Accounting
206 110 110 Accounting
空值 空值 120 Treasury
部门号120没有雇员,如果这个连接条件为a.department_id = b.department_id,将不会匹配部门号120的记录,因为雇员表的没有部门为120的部门,为空值,部门表有120号部门,空值与部门120进行匹配,得到的结果仍然是空值。但是如果雇员表想知道部门表里面还有哪些部门是没有雇员的,怎么办?那么这样可以解决这个问题,雇员表department_id(+)与部门表department_id进行连接,则可以将部门表没有雇员的部门也匹配出来。这就是Oracle的右外连接.
SQL1999语法:
select a.employee_id, a.department_id, b.department_id, b.department_name
from hr.employees a right outer join hr.departments b
on a.department_id = b.department_id
where b.department_id in (110,120)
得出一样的结果集
3.2 全外连接
oracle语法中并没有全外连接的写法,在sql1999语法中,有这个写法:
使用 full outer join关键字来连接
(略)
4.自连接
oracle语法中的自连接,是在一张表中进行连接,雇员表中的员工与管理员的关系,可以在一张雇员表中找出来,比如员工的管理者是谁。
举例:
比如90号部门的雇员情况如下:
select w.employee_id,
w.first_name,
w.last_name,
w.manager_id,
w.department_id
from hr.employees w
where w.department_id = 90
EMPLOYEE_ID FIRST_NAME LAST_NAME MANAGER_ID DEPARTMENT_ID
100 Steven King 90
101 Neena Kochhar 100 90
102 Lex De Haan 100 90
员工101,102的的管理者为100,即Steven King.如果通过两张表的连接体现在一行上面.使用oracle的自连接可以实现这一点.
select w.employee_id as "员工编号",
w.first_name || ' '||
w.last_name as "员工姓名",
m.employee_id as "管理者编号",
m.first_name ||' ' ||
m.last_name as "部门管理者",
m.manager_id as "部门管理者编号"
from hr.employees w, hr.employees m
where w.manager_id = m.employee_id
and w.department_id = 90
员工编号 员工姓名 管理者编号 部门管理者 部门管理者编号
101 Neena Kochhar 100 Steven
102 Lex De Haan 100 Steven
使用自连接,实现了一行记录即有员工,也有管理者的记录,其实就是把雇员ID为100的一行记录分别与雇员ID为101,102的两行记录进行了合并而已。
这就是oracle的自连接。
5.using子句进行表连接
sql1999语法:
其实using 子句是相对于natural join来说的,其实就是等值连接
举例:
select department_id "b-department_id",
department_id "a-department_id",
manager_id "b-manager_id",
manager_id "a-manager_id"
from hr.employees a join hr.departments b using (department_id)
where department_id = 30
b-department_id a-department_id b-manager_id a-manager_id
30 30 114 100
30 30 114 114
30 30 114 114
30 30 114 114
30 30 114 114
30 30 114 114
相当于等值连接
注意的是,select 列表中,不允许有别名来限定表名,where 条件中也不允许有别名来限定表名。
也可以这样写:
select department_id "b-department_id",
department_id "a-department_id",
manager_id "b-manager_id",
manager_id "a-manager_id"
from hr.employees a join hr.departments b using (department_id,manager_id)
where department_id = 30
b-department_id a-department_id b-manager_id a-manager_id
30 30 114 114
30 30 114 114
30 30 114 114
30 30 114 114
30 30 114 114
相等于自然连接。
注意的是,select 列表中,不允许有别名来限定表名,where 条件中也不允许有别名来限定表名。
6.on子句
sql1999语法:
其实on子句只不过是等值连接另外一种写法罢了。
举例说明:
select b.department_id "b-department_id",
a.department_id "a-department_id",
b.manager_id "b-manager_id",
a.manager_id "a-manager_id"
from hr.employees a
join hr.departments b
on (a.department_id = b.department_id)
where a.department_id = 30
相当于:
select b.department_id "b-department_id",
a.department_id "a-department_id",
b.manager_id "b-manager_id",
a.manager_id "a-manager_id"
from hr.employees a, hr.departments b
where a.department_id = 30
and b.department_id = a.department_id
得到相同的结果集:
b-department_id a-department_id b-manager_id a-manager_id
30 30 114 100
30 30 114 114
30 30 114 114
30 30 114 114
30 30 114 114
30 30 114 114
注意的是,在on子句中,select 列表中,允许有别名来限定表名,where 条件中允许有别名来限定表名。
end.
|
|