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
结果:所有员工都会显示,若员工无部门(DEPTNO为NULL),则DNAME为NULL。
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
结果:所有部门都会显示,若部门无员工,则ENAME为NULL。
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填充。
四、注意事项
(+)符号的限制:
OR条件一起使用(会导致逻辑错误);(+)只能出现在一侧(不能同时在左右表列上)。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';
FULL OUTER JOIN,低版本需用UNION实现。总结
外连接的核心是“保留指定表的全部数据”,通过LEFT/RIGHT/FULL JOIN(ANSI语法)或(+)(传统语法)实现。实际开发中推荐使用ANSI语法,更易读且能避免(+)的限制。需注意过滤条件的位置,避免外连接失效。
想了解更多干货,可通过下方扫码关注

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

17认证网








