当前位置: 首页 > news >正文

(课堂笔记)Oracle 表关联:连接类型、数据发散、自关联、同环比计算

本文系统梳理了Oracle表关联的核心知识,包括:

  1. 连接类型:详细解析INNER JOIN(只返回匹配记录)、LEFT JOIN(保留左表全部)、RIGHT JOIN(保留右表全部)和FULL JOIN(保留两表全部)四种连接方式的特点和使用场景。

  2. 数据发散问题:说明一对多或多对多关系时可能产生的笛卡尔积现象,以及如何通过正确设置连接条件避免数据膨胀。

  3. 自关联技术:演示如何使用表别名实现同一张表的自我连接,典型应用于查询层级关系(如员工-领导关系)。

  4. 实用计算:提供同环比增长率的SQL实现方法,展示如何通过表连接计算业务指标。

  5. 优化建议:给出连接查询的性能优化技巧和常见陷阱的规避方法,包括NULL值处理、连接顺序选择等最佳实践。


课堂笔记


根据你提供的课堂笔记,以下是对Oracle 表关联的详细总结与梳理,涵盖连接类型、数据发散、自关联、同环比计算等核心内容。


一、连接类型详解

1. INNER JOIN(内连接)

  • 返回:两表匹配的记录

  • 特点:不匹配的数据不显示

sql

SELECT * FROM 中国移动 M INNER JOIN 中国联通 N ON M.姓名 = N.姓名; -- 结果:只显示张三、李四(两表都有的)

2. LEFT JOIN(左连接)

  • 返回:左表全部 + 右表匹配部分

  • 特点:左表数据不丢失,右表无匹配则为 NULL

sql

SELECT * FROM 中国移动 M LEFT JOIN 中国联通 N ON M.姓名 = N.姓名; -- 结果:张三、李四、王五(王五在联通表无对应)

3. RIGHT JOIN(右连接)

  • 返回:右表全部 + 左表匹配部分

  • 特点:右表数据不丢失,左表无匹配则为 NULL

sql

SELECT * FROM 中国移动 M RIGHT JOIN 中国联通 N ON M.姓名 = N.姓名; -- 结果:张三、李四、熊大(熊大在移动表无对应)

4. FULL JOIN(全外连接)

  • 返回:两表全部数据

  • 特点:双方数据都不丢失

sql

SELECT * FROM 中国移动 M FULL JOIN 中国联通 N ON M.姓名 = N.姓名; -- 结果:张三、李四、王五、熊大(全部保留)

✅ 全连接注意事项:

sql

-- 正确写法:使用 NVL 处理可能为 NULL 的字段 SELECT NVL(M.姓名, N.姓名) AS 姓名, -- 关键:连接字段要用 NVL NVL(M.话费, 0) + NVL(N.话费, 0) AS 总话费 FROM 中国移动 M FULL JOIN 中国联通 N ON M.姓名 = N.姓名;

二、数据发散(笛卡尔积)

产生原因

当连接条件满足一对多多对多关系时,会产生数据发散。

典型示例

sql

-- 1. 无条件连接 = 笛卡尔积 SELECT * FROM EMP E CROSS JOIN DEPT D; -- 14行 × 4行 = 56行 -- 2. 等价写法 SELECT * FROM EMP E, DEPT D; -- 老式写法 SELECT * FROM EMP E LEFT JOIN DEPT D ON 1=1; -- 恒真条件

📊 行数推算规则

场景1:基于ID范围

  • A表:ID 1~100(100行)

  • B表:ID 61~120(60行)

  • 交集:61~100(40行)

连接类型返回行数
INNER JOIN40 行(交集)
LEFT JOIN100 行(左表全部)
RIGHT JOIN60 行(右表全部)
FULL JOIN120 行(并集)

场景2:基于表记录数

  • A表:10行

  • B表:5行

连接类型最多行数最少行数
INNER JOIN50(笛卡尔积)0(无匹配)
LEFT JOIN50(笛卡尔积)10(无匹配)
RIGHT JOIN50(笛卡尔积)5(无匹配)
FULL JOIN50(笛卡尔积)10(无匹配)

💡口诀

  • 最少行数:INNER可为0,LEFT不少于左表,RIGHT不少于右表,FULL不少于大表

  • 最多行数:都是笛卡尔积(M × N)


三、自关联(Self Join)

定义

同一张表自己与自己连接,需要使用不同的别名区分不同角色。

典型场景:上下级关系

sql

-- 示例:员工及其领导信息 SELECT E.ENAME AS 员工姓名, E.SAL AS 员工薪资, F.ENAME AS 领导姓名, F.SAL AS 领导薪资 FROM EMP E -- 员工表(角色:员工) LEFT JOIN EMP F -- 领导表(角色:领导) ON E.MGR = F.EMPNO; -- 员工的领导编号 = 领导的员工编号

复杂示例:带部门信息

sql

SELECT E.ENAME AS 员工姓名, E.SAL AS 员工薪资, D.DNAME AS 员工部门, F.ENAME AS 领导姓名, F.SAL AS 领导薪资, K.DNAME AS 领导部门 FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO LEFT JOIN EMP F ON E.MGR = F.EMPNO LEFT JOIN DEPT K ON F.DEPTNO = K.DEPTNO;

四、实际应用:同环比计算

场景:计算每月环比增长率

公式:(本期 - 上期) / 上期 = 本期/上期 - 1

sql

-- 创建销售表 CREATE TABLE T_SALES( MONTH NUMBER, AMOUNT NUMBER ); INSERT INTO T_SALES VALUES (4,4432); INSERT INTO T_SALES VALUES (5,434); INSERT INTO T_SALES VALUES (6,232); INSERT INTO T_SALES VALUES (7,46554); INSERT INTO T_SALES VALUES (8,76); INSERT INTO T_SALES VALUES (9,454); COMMIT; -- 计算环比增长率 SELECT M.MONTH AS 月份, M.AMOUNT AS 本月销售额, N.AMOUNT AS 上月销售额, ROUND((M.AMOUNT / N.AMOUNT - 1) * 100, 2) || '%' AS 环比增长率 FROM T_SALES M -- 本月数据 LEFT JOIN T_SALES N ON M.MONTH - 1 = N.MONTH; -- 上月数据

扩展:同比计算(去年同期)

sql

-- 假设有年份字段 LEFT JOIN T_SALES N ON M.YEAR - 1 = N.YEAR AND M.MONTH = N.MONTH

五、重点总结

✅ 连接类型选择指南

需求推荐连接
只要匹配的数据INNER JOIN
左表数据全要LEFT JOIN
右表数据全要RIGHT JOIN
两表数据全要FULL JOIN
避免数据发散确保连接条件能唯一匹配

✅ 常见陷阱

  1. 忘记处理 NULL:全连接中使用NVL处理可能为 NULL 的字段

  2. 数据发散:连接前确认关联字段是否唯一

  3. 自关联忘记别名:必须用不同别名区分同一张表

  4. 连接顺序影响性能:小表驱动大表会更高效

✅ 调试技巧

sql

-- 1. 先查两表的唯一性 SELECT 关联字段, COUNT(*) FROM 表名 GROUP BY 关联字段 HAVING COUNT(*) > 1; -- 2. 用小数据集验证连接结果 SELECT * FROM 表名 WHERE ROWNUM <= 10; -- 3. 逐步添加连接条件 -- 先做单表查询,确认数据正确,再加 JOIN

六、练习答案参考

验证行数极值

sql

-- 1. INNER JOIN 无匹配(最少0行) SELECT * FROM TABLEA A INNER JOIN TABLEB B ON 1=2; -- 0行 -- 2. LEFT JOIN 无匹配(最少10行) SELECT * FROM TABLEA A LEFT JOIN TABLEB B ON 1=2; -- 10行(A表全保留) -- 3. RIGHT JOIN 全匹配(最多5×10=50行) SELECT * FROM TABLEA A RIGHT JOIN TABLEB B ON 1=1; -- 50行 -- 4. FULL JOIN 基于ID(返回并集) SELECT * FROM TABLEA A FULL JOIN TABLEB B ON A.ID = B.ID; -- 10行(1-5匹配,6-10仅A有)
http://www.jsqmd.com/news/700218/

相关文章:

  • 高级安卓开发在DVR类产品中的应用与挑战
  • .NET 集成 SqlSugar、读写分离 、Redis
  • 生产级AI智能体架构实战:从原型到产品的工程化指南
  • DeepSeek V4写完用哪款降AI?2026年4月4款工具横评 - 我要发一区
  • 2026年独立站+TikTok Shop双轨策略:为什么聪明品牌不再押注单一渠道 - SocialEcho社媒管理
  • OpenCore Legacy Patcher终极指南:如何免费让旧Mac焕发新生
  • 【AI工具】2026年实用免费AI工具全分享:聊天、编程、设计三类工具实测对比
  • 终极DOL汉化美化整合指南:5分钟打造完美中文游戏体验
  • 从“学模型”到“做应用”:AI产品的30天实战进化指南
  • 在 Claude Code 里跑 DeepSeek-V4-Pro,三步搞定
  • 毫米波大规模MIMO中的波束空间处理技术解析
  • 效果展示:LFM2.5-VL-1.6B多语言图片理解实测,小模型也有大能耐
  • C语言内存安全面试必考TOP 15题(2026最新真题库+逐行安全分析)
  • 从‘虹猫蓝兔’到终身学习:聊聊Continual Learning如何让AI模型像人一样成长
  • LSTM时间序列预测实战:从原理到销售预测应用
  • 实用高效的AutoHotkey脚本编译指南:轻松将AHK转换为EXE可执行文件
  • 全局坐标转局部坐标推导 - Ladisson
  • 固态硬盘(SSD)优化特辑:TRIM、预留空间与垃圾回收
  • 深度学习必读三书:从理论到实践的经典指南
  • 工业自动化工程师必装的VSCode插件(2026版协议解析器深度拆解)
  • D2RML终极教程:暗黑2重制版一键多开神器,告别繁琐登录!
  • 用STM32CubeMX和HAL库快速上手MAX30102,告别繁琐的寄存器配置
  • 医疗器械管代的职责
  • AtCoder Beginner Contest 455 ABCDEF 题目解析
  • UniApp跨端视频播放器进阶:从官方限制到自定义全功能实现
  • EB Garamond 12:重塑学术排版的古典字体开源解决方案
  • REBOUND框架:硬件锚定的安全回滚技术解析
  • 嵌入式C语言深度适配轻量大模型(GCC内联汇编级优化+Flash XIP加速+中断上下文LLM推理调度)
  • 全球不到17家团队掌握的VSCode量子配置范式:基于AST动态注入与配置沙箱隔离的工业级实践
  • NumPy数组核心操作与机器学习数据预处理技巧