Oracle 中的多表查询详解
Oracle 中的多表查询详解
在实际业务系统中,数据往往存储在多个相关的表中,通过多表查询(Multi-Table Query)才能获得完整的信息。Oracle 支持多种多表查询方式,理解和掌握这些方法,是数据库开发的必备技能。
一、什么是多表查询?
多表查询是指在 SQL 中同时访问两个或两个以上的表,通过字段之间的逻辑关系,整合并返回符合条件的数据集合。
二、多表连接分类
Oracle 中多表查询通常采用 连接(JOIN) 的方式,可以分为以下几类:
三、准备示例数据
我们以经典的两个表为例:emp
(员工表)和 dept
(部门表)。
emp 表(员工):
dept 表(部门):
四、等值连接(最常用)
SELECT e.ename, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno;
说明:emp
表和 dept
表通过 deptno
字段进行匹配。
五、Oracle 特有语法:旧式连接写法
在早期 Oracle 中,外连接可以通过 (+)
运算符表示。
-- 左外连接:以 emp 为主表
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno(+);
等价于:
SELECT e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno;
建议:现代开发中使用 ANSI 标准 JOIN 更清晰、可维护性更好。
六、外连接示例
1. 左外连接(LEFT JOIN)
SELECT e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno;
说明:显示所有员工,即使员工没有对应部门也显示,部门信息为 NULL。
2. 右外连接(RIGHT JOIN)
SELECT e.ename, d.dname
FROM emp e
RIGHT JOIN dept d ON e.deptno = d.deptno;
说明:显示所有部门,即使没有员工也显示,员工信息为 NULL。
3. 全外连接(FULL JOIN)
SELECT e.ename, d.dname
FROM emp e
FULL JOIN dept d ON e.deptno = d.deptno;
说明:显示所有员工和所有部门,即使它们没有匹配项。
七、自连接(Self Join)
用于一个表内的关联查询,如查找员工的上级。
SELECT e1.ename AS employee, e2.ename AS manager
FROM emp e1
LEFT JOIN emp e2 ON e1.mgr = e2.empno;
八、交叉连接(CROSS JOIN)
会生成表之间所有行的组合(笛卡尔积),用于特定统计分析。
SELECT e.ename, d.dname
FROM emp e
CROSS JOIN dept d;
九、多表连接查询的组合应用
可以同时连接多个表:
SELECT e.ename, d.dname, l.city
FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN location l ON d.loc = l.loc_code;
十、实战案例
案例 1:列出所有员工及其所属部门名和工作地点
SELECT e.ename, d.dname, d.loc
FROM emp e
JOIN dept d ON e.deptno = d.deptno;
案例 2:列出没有部门的员工
SELECT e.ename
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno
WHERE d.deptno IS NULL;
十一、多表查询注意事项
十二、总结
附录:JOIN 类型对比图(简化版)
INNER JOIN → 交集
LEFT JOIN → 左表所有 + 匹配右表
RIGHT JOIN → 右表所有 + 匹配左表
FULL JOIN → 左右表并集
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Noah
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果