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

FULL OUTER JOIN 的作用与使用场景(检查表与表是否存在不同记录)

FULL OUTER JOIN 的作用与使用场景

  • FULL OUTER JOIN 的作用与使用场景详解
    • 概念解析
    • 核心作用
    • 典型使用场景
    • 结果说明
    • 注意事项
    • FULL OUTER JOIN业务中具体使用示例

FULL OUTER JOIN 的作用与使用场景详解

概念解析

FULL OUTER JOIN 是 SQL 中用于合并两个表的关联查询方式,其核心特性是:

  • 返回左表和右表中所有记录
  • 当某条记录在另一表无匹配时,对应字段显示为 NULL
  • 数学上可以理解为 LEFT JOIN + RIGHT JOIN 的并集

核心作用

  1. 数据完整性验证
    用于确认两个数据集之间的关联完整性,例如:
    • 检查订单表与客户表是否存在孤立记录
    • 验证库存表与产品表的数据对应关系
  2. 双向数据合并
    当需要同时保留两个表的独立记录时,例如:
    • 合并员工表和离职员工表生成完整人员档案
    • 整合历史数据与实时数据
  3. 异常数据检测
    通过 NULL 值定位不匹配的异常数据,例如:
    • 找出没有对应部门的员工
    • 识别未关联到任何订单的客户

典型使用场景

-- 创建示例表
CREATE TABLE employees (id INT, name VARCHAR(20), dept_id INT);
CREATE TABLE departments (id INT, dept_name VARCHAR(20));
-- 插入测试数据
INSERT INTO employees VALUES
(1, '张三', 101),
(2, '李四', 102),
(3, '王五', NULL);  -- 无部门员工
INSERT INTO departments VALUES
(101, '技术部'),
(102, '市场部'),
(103, '财务部');  -- 无员工部门
-- 执行FULL OUTER JOIN
SELECT e.name AS 员工姓名,COALESCE(d.dept_name, '未分配部门') AS 部门名称,e.dept_id AS 原始部门ID
FROM employees e
FULL OUTER JOIN departments d ON e.dept_id = d.id;

结果说明

员工姓名部门名称原始部门ID
张三技术部101
李四市场部102
王五未分配部门NULL
NULL财务部103

注意事项

  1. MySQL 8.0 之前版本不支持原生语法,需通过 UNION 模拟:
    (SELECT ... FROM employees LEFT JOIN departments ...)
    UNION
    (SELECT ... FROM employees RIGHT JOIN departments ...)
    
  2. 性能考量:在大数据表关联时,确保关联字段已建立索引
  3. 可视化建议:使用 COALESCE 函数处理 NULL 值提升可读性

FULL OUTER JOIN业务中具体使用示例

在 SQL 查询中,FULL OUTER JOIN 是一种连接操作,它返回左表和右表中的所有行。如果某一边的表中没有匹配的行,则结果集中对应的列将包含 NULL 值。这种连接方式特别适用于需要合并两个表中所有数据的情况,即使某些数据在另一张表中没有对应的匹配项。

  1. 示例说明

    以下 SQL 查询展示了如何使用 FULL OUTER JOIN 来比较两个角色 QA-PE-EngineerQA-Engineer 所拥有的权限(功能):

    SELECTNVL(s1.ROLE_ID, 'QA-Engineer独有权限') AS ROLE_ID_1,NVL2(s1.FUNC_NAME, s1.FUNC_NAME || ':' || s1.FUNC_DESC , '') AS FUNC_1_WITH_ASSEMBLY,NVL(s2.ROLE_ID, 'QA-PE-Engineer独有权限') AS ROLE_ID_2,NVL2(s2.FUNC_NAME, s2.FUNC_NAME || ':' || s2.FUNC_DESC , '') AS FUNC_2_WITH_ASSEMBLY
    FROM(SELECTrf.FUNC_NAME,rf.ROLE_ID,df.FUNC_DESCFROMSCRMROLEFUNC rfLEFT JOIN SCRMFUNCDFNT df ONrf.FUNC_NAME = df.FUNC_NAMEWHERErf.ROLE_ID = 'QA-PE-Engineer'GROUP BYrf.FUNC_NAME,rf.ROLE_ID,df.FUNC_DESC
    ) s1
    FULL OUTER JOIN (SELECTrf.FUNC_NAME,rf.ROLE_ID,df.FUNC_DESCFROMSCRMROLEFUNC rfLEFT JOIN SCRMFUNCDFNT df ONrf.FUNC_NAME = df.FUNC_NAMEWHERErf.ROLE_ID = 'QA-Engineer'GROUP BYrf.FUNC_NAME,rf.ROLE_ID,df.FUNC_DESC
    ) s2 ONs1.FUNC_NAME = s2.FUNC_NAME
    ORDER BY(CASEWHEN s1.FUNC_NAME IS NOT NULLAND s2.FUNC_NAME IS NOT NULL THEN 1WHEN s1.FUNC_NAME IS NOT NULL THEN 2ELSE 3END) DESC;
    
  2. 查询结果解析

    该查询的主要目的是比较两个角色 QA-PE-EngineerQA-Engineer 的权限,找出它们的共有权限和独有权限。

    • s1 子查询获取 QA-PE-Engineer 角色的功能名称、角色 ID 和功能描述。
    • s2 子查询获取 QA-Engineer 角色的功能名称、角色 ID 和功能描述。
    • 使用 FULL OUTER JOIN 连接两个子查询,基于 FUNC_NAME 字段。
    • 使用 NVL 函数处理 NULL 值,使得角色名称在没有匹配项时显示为“独有权限”。
    • 使用 NVL2 函数拼接功能名称和描述,若功能名称为 NULL 则返回空字符串。
    • 最后通过 CASE 表达式对结果进行排序,确保共有权限排在最前面,其次是 QA-PE-Engineer 的独有权限,最后是 QA-Engineer 的独有权限。
  3. 查询结果示例

    ROLE_ID_1FUNC_1_WITH_ASSEMBLYROLE_ID_2FUNC_2_WITH_ASSEMBLY
    QA-PE-Engineerfunc1:功能1描述QA-Engineerfunc1:功能1描述
    QA-PE-Engineerfunc2:功能2描述QA-Engineer独有权限
    QA-Engineer独有权限QA-Engineerfunc3:功能3描述

更多精彩文章可扫码关注公主号查看:
在这里插入图片描述

http://www.dtcms.com/a/351252.html

相关文章:

  • UML 时序图中交互片段操作符的详细解析与 C/C++ 实现示例
  • 五、VSCODE SSH连接linux服务器免密登录
  • Java中 0.05 + 0.01 ≠ 0.06 揭秘浮点数精度陷阱
  • VSCode: 从插件安装到配置,如何实现 Ctrl+S 保存时,完全按照 .eslintrc.js 中的 ESLint 规则自动格式化代码
  • vscode 配置 + androidStudio配置
  • Easy Voice Recorder Pro v2.9.3 简单易用的专业音频录制工具应用
  • 开发手札:UnrealEngine编辑器开发
  • 基于stm32的物联网OneNet火灾报警系统
  • Java面试指南‌——事务:数据库世界的超级英雄联盟
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|22th-24th Aug. , 2025
  • MySQL基本语法及与JAVA程序建立连接
  • 设计模式七大原则附C++正反例源码
  • 学习嵌入式的第三十八天
  • 【网络安全】XSS漏洞——PortSwigger靶场-DOM破坏
  • 常见的 Loader 和 Plugin?
  • 观察者模式 (Observer Pattern)与几个C++应用例子
  • Visual Basic 数据类型应用示例
  • EasyExcel 3.x 导出动态表头,动态sheet页
  • 国产化Excel开发组件Spire.XLS教程:Python 读取 CSV 文件,从基础到进阶指南
  • C shell 学习
  • AI出题人给出的Java后端面经(二十仨)(不定更)
  • 线性代数中矩阵等价与离散数学中关系的闭包之间的关联
  • dapo:开源大规模llm强化学习系统的突破与实现
  • AI提示词30天入门培训计划
  • STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---MQTT篇(三)
  • 【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注
  • 从GPT-5发布来分析LLM大模型幻觉收敛(一)
  • 广告网站与Coze智能体集成
  • 节能率的图表组件的选择
  • MT** 时间指标全景图:从可靠性到可维护性的度量体系