一文搞懂Oracle数据库外连接查询17认证网

正规官方授权
更专业・更权威

一文搞懂Oracle数据库外连接查询

在Oracle中,外连接(Outer Join)是用于查询两个或多个表中数据时,不仅返回满足连接条件的匹配行,还会返回其中一个(或两个)表中不满足条件的所有行(未匹配的行对应的另一表列用NULL填充)。外连接是相对内连接(只返回匹配行)的重要扩展,主要用于需要保留“主表”全部数据的场景。

一、外连接的分类

根据需要保留数据的表的位置,外连接分为三类:

1. 左外连接(LEFT OUTER JOIN)

定义:保留左表(连接条件中写在左侧的表)的所有行,同时返回右表中满足连接条件的匹配行;右表中无匹配的行,对应列用NULL填充。
核心:“左表数据全保留,右表只留匹配的”。

2. 右外连接(RIGHT OUTER JOIN)

定义:保留右表(连接条件中写在右侧的表)的所有行,同时返回左表中满足连接条件的匹配行;左表中无匹配的行,对应列用NULL填充。
核心:“右表数据全保留,左表只留匹配的”。

3. 全外连接(FULL OUTER JOIN)

定义:保留左表和右表的所有行,同时返回两表中满足连接条件的匹配行;左表无匹配的行,右表列用NULL填充;右表无匹配的行,左表列用NULL填充。
核心:“两表数据全保留,互相匹配的合并,不匹配的补NULL”。

二、外连接的语法

Oracle支持两种外连接语法:传统语法(使用(+)符号) 和 ANSI标准语法(使用OUTER JOIN关键字)。推荐使用ANSI标准语法,更清晰且兼容性更好。

1. ANSI标准语法(推荐)

语法格式:

-- 左外连接
SELECT 列名
FROM 左表
LEFT [OUTER] JOIN 右表
ON 连接条件;

-- 右外连接
SELECT 列名
FROM 左表
RIGHT [OUTER] JOIN 右表
ON 连接条件;

-- 全外连接
SELECT 列名
FROM 左表
FULL [OUTER] JOIN 右表
ON 连接条件;

说明:OUTER关键字可以省略(如LEFT JOIN等价于LEFT OUTER JOIN)。

2. 传统语法((+)符号)

通过在“非保留表”的列后加(+)表示“该表是被匹配的,不保留其未匹配行”。

左外连接:(+)加在右表的列上(右表是非保留表);
右外连接:(+)加在左表的列上(左表是非保留表);
全外连接:传统语法不直接支持,需通过UNION合并左外和右外连接实现。

语法格式:

-- 左外连接(保留左表,右表加(+))
SELECT 列名
FROM 左表, 右表
WHERE 左表.列 = 右表.列(+);

-- 右外连接(保留右表,左表加(+))
SELECT 列名
FROM 左表, 右表
WHERE 左表.列(+) = 右表.列;

三、示例说明

以经典的EMP(员工表)和DEPT(部门表)为例:

EMP:包含员工编号(EMPNO)、姓名(ENAME)、部门编号(DEPTNO)等;
DEPT:包含部门编号(DEPTNO)、部门名称(DNAME)、位置(LOC)等;
连接条件:EMP.DEPTNO = DEPT.DEPTNO

1. 左外连接(保留所有员工,包括无部门的员工)

需求:查询所有员工的姓名及其所属部门名称(即使员工没有部门,也需显示员工姓名)。

ANSI语法:

SELECT e.ENAME, d.DNAME
FROM EMP e
LEFT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO;

传统语法:

SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE e.DEPTNO = d.DEPTNO(+); -- 右表DEPT加(+),表示保留左表EMP

结果:所有员工都会显示,若员工无部门(DEPTNONULL),则DNAMENULL

2. 右外连接(保留所有部门,包括无员工的部门)

需求:查询所有部门的名称及其包含的员工姓名(即使部门没有员工,也需显示部门名称)。

ANSI语法:

SELECT e.ENAME, d.DNAME
FROM EMP e
RIGHT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO;

传统语法:

SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE e.DEPTNO(+) = d.DEPTNO; -- 左表EMP加(+),表示保留右表DEPT

结果:所有部门都会显示,若部门无员工,则ENAMENULL

3. 全外连接(保留所有员工和所有部门)

需求:查询所有员工和所有部门,匹配的显示对应信息,不匹配的补NULL

ANSI语法:

SELECT e.ENAME, d.DNAME
FROM EMP e
FULL JOIN DEPT d
ON e.DEPTNO = d.DEPTNO;

传统语法(需用UNION合并左外和右外连接):

-- 左外连接结果(保留员工)
SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE e.DEPTNO = d.DEPTNO(+)
UNION
-- 右外连接结果(保留部门,排除已在左外连接中出现的行)
SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE e.DEPTNO(+) = d.DEPTNO
AND e.DEPTNO IS NULL;

结果:所有员工和所有部门都会显示,无匹配的列用NULL填充。

四、注意事项

1
(+)符号的限制

只能用于传统语法,且必须加在“非保留表”的列上;
不能与OR条件一起使用(会导致逻辑错误);
一个连接条件中,(+)只能出现在一侧(不能同时在左右表列上)。
2
过滤条件的位置

若需过滤“保留表”的行,条件放在WHERE子句中;
若需过滤“非保留表”的行,条件必须放在ON子句中(否则会导致外连接失效,退化为内连接)。

示例(错误 vs 正确):

-- 错误:右表过滤条件放WHERE,会过滤掉部门无员工的行(外连接失效)
SELECT e.ENAME, d.DNAME
FROM EMP e
RIGHT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
WHERE d.LOC = 'NEW YORK'; -- 部门位置为纽约

-- 正确:右表过滤条件放ON,保留所有纽约的部门(包括无员工的)
SELECT e.ENAME, d.DNAME
FROM EMP e
RIGHT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO AND d.LOC = 'NEW YORK';
3
全外连接的兼容性:Oracle 9i及以上版本支持ANSI标准的FULL OUTER JOIN,低版本需用UNION实现。

总结

外连接的核心是“保留指定表的全部数据”,通过LEFT/RIGHT/FULL JOIN(ANSI语法)或(+)(传统语法)实现。实际开发中推荐使用ANSI语法,更易读且能避免(+)的限制。需注意过滤条件的位置,避免外连接失效。

想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

未经允许不得转载:17认证网 » 一文搞懂Oracle数据库外连接查询
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师