提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:吉伟伟|2024-10-25 09:56:43.420|阅读 9 次
概述:本文将以 PostgreSQL dvdrental 数据库为例,介绍反连接的类型以及如何编写反连接,以及如何在 Navicat Premium Lite 17 中编写和执行查询。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
SQL 最强大的功能之一是 JOIN 操作,它提供了一种优雅而简单的方法,将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过,有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的文章中看到的,通过包含一个谓词来连接表,连接也可以用于此目的。这种连接被称为反连接,对于回答各种与业务相关的问题很有帮助,例如:
本文将以 PostgreSQL dvdrental 数据库 为例,介绍反连接的类型以及如何编写反连接。 我们将在 Navicat Premium Lite 17 中编写和执行查询。
反连接的两种类型
这是两种类型的反连接:
下图中 蓝色 显示部分表示返回的行:
下一节将以左反连接为例,介绍我们可以用来创建反连接的几种不同语法。
使用 EXISTS 的左反连接
比方说,我们想在 dvdrental 数据库中找到所有没有出现在任何电影中的演员。遗憾的是,SQL 没有这种操作的内置语法,但我们可以使用 EXISTS,或更具体地说,使用 NOT EXISTS 来模拟这种操作。下面是这种查询的结果:
SELECT * FROM actor a WHERE NOT EXISTS ( SELECT * FROM film_actor fa WHERE a.actor_id = fa.actor_id )
若我们在 Navicat Premium Lite 17 中运行它,我们会获得下面的结果:
请注意 NOT IN!
既然 EXISTS 和 IN 是等价的,你可能会得出结论,NOT EXISTS 和 NOT IN 也是等价的,但事实并非总是如此!只有当右表(本例中为 film_actor)的外键(actor_id)上有 NOT NULL 约束时,它们才是等价的。
在这个特定示例中,由于 actor_id 列上的 NOT NULL 约束,NOT IN 查询会返回相同的结果:
如果 actor_id 列允许空值,则将返回空结果集。我们可以通过下面的查询来验证这一点:
SELECT * FROM actor WHERE actor_id NOT IN (1, 2, 3, 4, 5, NULL)
上述查询没有返回任何行,因为在 SQL 中,NULL 代表一个未知值。由于我们无法确定 actor_id 是否在一个值集中(其中一个值是未知的),因此整个谓词(predicate)就变成了未知(UNKNOWN)!
要避免 NOT IN 语法带来的危险,最简单的方法就是坚持使用 NOT EXISTS。因为 DBA 可能会暂时关闭该约束以加载一些数据,从而使你的查询在此期间毫无用处。
替代语法
正如介绍中提到的,也可以使用左连接和右连接执行反连接。要做到这一点,需要添加一个带有 IS NULL 谓词的 WHERE 子句。下面是该语法的 LEFT JOIN 版本:
SELECT a.* FROM actor a LEFT JOIN film_actor fa ON a.actor_id = fa.actor_id WHERE fa.actor_id IS NULL
请注意,左/右连接语法的运行速度可能会更慢,因为查询优化器不会将其识别为反连接操作。
结语
在今天的文章中,我们学习了如何使用三种不同的 SQL 语法来模拟左反连接。其中,NOT EXISTS 应该是首选,因为它能最好地传达反连接的意图,而且执行速度最快。
如果您有兴趣试用 Navicat Premium Lite 17,它适用于 Windows、macOS 和 Linux 操作系统,你可以点此下载或咨询。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
Navicat for Oracle是一套超强的Oracle数据库系统管理工具,包括数据模型工具、数据或结构同步、导入或导出、和报表,令维护数据的进程更容易。
Navicat for SQL Server 是一套专为 Mircosoft SQL Server设计的强大数据库管理及开发工具
从 Visual Paradigm 17.2 版开始,您可以创建自己的项目模板并与团队共享。这样团队成员就可以轻松创建符合团队标准的新项目。本文将指导您完成为团队创建项目模板的过程。
本文主要介绍如何使用DevExpress WinForms Data Grid组件实现固定列,欢迎下载最新版组件体验!
长期以来,Navicat 的数据库管理和开发工具一直都有将协同合作融合到设计理念中。本文将重点介绍如何使用 Navicat Premium 17 共享数据库对象。
在日常操作 Excel 文档时,复制行、列和单元格是非常常见的需求。本文将介绍如何使用 Spire.XLS for .NET 和 C# 在 Excel 中复制行、列和单元格并保留格式。
Navicat for MySQL 是一套管理和开发 MySQL 或 MariaDB 的理想解决方案。
Navicat for PostgreSQLNavicat for PostgreSQL是一套专为PostgreSQL设计的强大数据库管理及开发工具
Navicat for OracleNavicat for Oracle是一套超强的Oracle数据库系统管理工具,包括数据模型工具、数据或结构同步、导入或导出、和报表,令维护数据的进程更容易。
Navicat for SQL ServerNavicat for SQL Server 是一套专为 Mircosoft SQL Server设计的强大数据库管理及开发工具
Navicat PremiumNavicat Premium 是一套数据库管理工具,让你使用一个程序即可同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢