Oracle Anti Join

2025年2月13日 | 阅读 4 分钟

反连接用于使查询运行更快。它是 Oracle 提供的一种非常强大的 SQL 结构,用于加速查询。

两个表之间的反连接返回第一个表中的行,这些行在第二个表中找不到匹配项。 它与半连接相反。 反连接返回第一个表中每个找不到匹配项的行的副本。

反连接是使用 NOT EXISTS 或 NOT IN 构造编写的。

示例

让我们创建两个表“部门”和“客户”

部门表


Oracle Anti Join

Customer 表


Oracle Anti Join 2

执行此查询

输出

Oracle Anti Join 3

Oracle 为我们提供了反连接 SQL 结构,作为一种使查询运行更强大的方式。 该技术帮助我们查找一个表中缺少另一个表中对应条目的信息。 反连接与半连接相反。 半连接返回匹配的数据库行,而反连接显示第一个表的结果,而第二个表中没有匹配项。

在 Oracle SQL 中,您可以通过 NOT EXISTS 和 NOT IN 关键字序列执行反连接。 当您知道如何有效地使用反连接时,SQL 查询将在大型数据集上运行得更快。

反连接的特征

反连接最适合于我们查找并行表中不存在的数据行的情况。

以下特征定义了反连接操作

  1. 返回不匹配的行:当通过连接条件在第二个表中未找到相关条目时,反连接从第一个表返回结果。
  2. 半连接的对立面:半连接标识匹配的数据,而反连接报告数据何时不匹配。
  3. 性能优化:反连接以优化的方式执行其工作,而不会浪费存储空间。 这些工具有效地加快了数据过滤过程。
  4. 实现:您可以使用 NOT EXISTS 或 NOT IN 语法编写反连接。 这两种模式产生相同的结果,但它们的语法需要差异以及性能变化。

反连接的实际用例

反连接适用于各种实际场景,例如

  • 识别未使用的资源:例如,查找未分配客户的部门。
  • 缺少分配:查找未分配到任何项目的员工。
  • 数据验证:确保一个表中的某些记录在另一个表中没有相应的不合规条目。

示例表:“部门”和“客户”

为了更好地理解反连接的工作原理,让我们考虑两个示例表:DEPARTMENTS 和 CUSTOMER。

Departments 表

客户表

使用 NOT EXISTS 的反连接

NOT EXISTS 构造是实现反连接的最有效方法之一。 当子查询涉及相关条件时,它特别有用。

查询

要检索所有没有分配客户的部门,我们可以编写以下查询

说明

  1. 外部查询:外部查询从 departments 表中检索数据,特别是 department_id 和 department_name 列。
  2. 子查询:子查询检查 customer 表中是否存在 department_id 匹配的匹配行。
  3. NOT EXISTS:确保结果中仅返回没有匹配客户的部门。

使用 NOT IN 的反连接

实现反连接的另一种常见方法是使用 NOT IN 构造。 虽然它可以实现与 NOT EXISTS 相同的结果,但在性能和行为方面存在重要差异。

查询

说明

  1. 子查询:子查询从 customer 表中获取所有 department_id 值。
  2. NOT IN:过滤掉 department_id 存在于子查询结果中的部门。
  3. 关键区别:与 NOT EXISTS 不同,如果子查询返回任何 NULL 值,NOT IN 构造可能会失败。 这是因为与 NULL 的比较会导致未定义的行为。

示例数据和输出

让我们用一些示例数据填充表

Departments 表

DEPARTMENT_IDDEPARTMENT_NAME
1销售
2HR
3IT
4营销

客户表

CUSTOMER_IDFIRST_NAMELAST_NAMEDEPARTMENT_ID
101JohnDoe1
102JaneSmith3

使用 NOT EXISTS 或 NOT IN 查询,结果将是

输出

DEPARTMENT_IDDEPARTMENT_NAME
2HR
4营销

比较 NOT EXISTS 和 NOT IN

虽然这两个构造具有相同的用途,但它们在性能和行为方面存在明显的差异。

特性NOT EXISTS不在其中
性能使用索引子查询通常更快处理大型数据集时速度较慢
NULL 处理与 NULL 值有效配合使用如果子查询返回 NULL 则失败
复杂度更适合相关的子查询对于简单的条件更容易

一般来说,NOT EXISTS 是大型数据集或涉及相关条件的查询的首选。

性能优化技巧

  1. 索引:确保正确索引连接条件中涉及的列(例如,department_id)以提高查询性能。
  2. 避免 NULL 值:如果使用 NOT IN,请确保子查询不返回 NULL。 或者,使用 NOT EXISTS 以获得更好的可靠性。
  3. 使用大型数据进行测试:评估您的特定数据集上两种构造的性能,以确定最佳方法。

结论

使用 NOT EXISTS 或 NOT IN 实现的 Oracle 反连接是过滤掉两个表之间不匹配的行的不可或缺的工具。 它们提供了一种强大而有效的方式来处理关系不存在的查询。 通过了解它们的差异和用例,您可以优化 SQL 查询并获得更快的结果。 通过适当的索引和注意查询构造,反连接可以改变数据库性能。


下一个主题Oracle 半连接