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

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作,它提供了一种优雅而简单的方法,将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过,有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的,通过包含一个谓词来连接表,连接也可以用于此目的。这种连接被称为反连接,对于回答各种与业务相关的问题很有帮助,例如:

  • 哪些客户没有下单?
  • 哪些员工还没有被分配到部门?
  • 本周哪些销售人员没有达成交易?

本期博客将以 PostgreSQL dvdrental 数据库 为例,介绍反连接的类型以及如何编写反连接。 我们将在 Navicat Premium Lite 17 中编写和执行查询。

反连接的两种类型

这是两种类型的反连接:

  • 左反连接:返回左表中没有匹配右表记录的记录
  • 右反连接:返回右表中与左表中不匹配的记录

下图中 蓝色 显示部分表示返回的行:

anti-join_venn_diagram (56K)

下一节将以左反连接为例,介绍我们可以用来创建反连接的几种不同语法。

使用 EXISTS 的左反连接

比方说,我们想在 dvdrental 数据库中找到所有没有出现在任何电影中的演员。遗憾的是,SQL 没有这种操作的内置语法,但我们可以使用 EXISTS,或更具体地说,使用 NOT EXISTS 来模拟这种操作。下面是这种查询的结果:

SELECT *
FROM actor a
WHERE NOT EXISTS (SELECT * FROM film_actor faWHERE a.actor_id = fa.actor_id
)

若我们在 Navicat Premium Lite 17 中运行它,我们会获得下面的结果:

left_anti-join (85K)

请注意 NOT IN!

既然 EXISTS 和 IN 是等价的,你可能会得出结论,NOT EXISTS 和 NOT IN 也是等价的,但事实并非总是如此!只有当右表(本例中为 film_actor)的外键(actor_id)上有 NOT NULL 约束时,它们才是等价的。

film_actor_table_design (82K)

在这个特定示例中,由于 actor_id 列上的 NOT NULL 约束,NOT IN 查询会返回相同的结果:

left_anti-join_using_not_in (78K)

如果 actor_id 列允许空值,则将返回空结果集。我们可以通过下面的查询来验证这一点:

SELECT *
FROM actor
WHERE actor_id NOT IN (1, 2, 3, 4, 5, NULL)

no_results_using_not_in (57K)

上述查询没有返回任何行,因为在 SQL 中,NULL 代表一个未知值。由于我们无法确定 actor_id 是否在一个值集中(其中一个值是未知的),因此整个谓词(predicate)就变成了未知(UNKNOWN)!

要避免 NOT IN 语法带来的危险,最简单的方法就是坚持使用 NOT EXISTS。因为 DBA 可能会暂时关闭该约束以加载一些数据,从而使你的查询在此期间毫无用处。

替代语法

正如介绍中提到的,也可以使用左连接和右连接执行反连接。要做到这一点,需要添加一个带有 IS NULL 谓词的 WHERE 子句。下面是该语法的 LEFT JOIN 版本:

SELECT a.*
FROM actor aLEFT JOIN film_actor faON a.actor_id = fa.actor_id
WHERE fa.actor_id IS NULL

left_anti-join_using_left_join (80K)

请注意,左/右连接语法的运行速度可能会更慢,因为查询优化器不会将其识别为反连接操作。

结语

在今天的博客中,我们学习了如何使用三种不同的 SQL 语法来模拟左反连接。其中,NOT EXISTS 应该是首选,因为它能最好地传达反连接的意图,而且执行速度最快。

有兴趣试用 Navicat Premium Lite 17 吗?你可以下载它进行 为期 14 天的全功能免费试用 。 它适用于 Windows、macOS 和 Linux 操作系统。

Navicat 17 最新资讯 & 技术干货

- Navicat 17 体验官火热招募中

- Navicat- 17 新特性 | 用户界面再升级

- Navicat 17 新特性 | 模型设计创新与优化

- Navicat 17 新特性 | 查询与配置

- Navicat 17 新特性 | Navicat BI 功能革新升级

- Navicat 17 新特性 | 原生支持国产 Linux ARM 平台以及银河麒麟与统信操作系统

- 聚焦 Navicat 17 新特性 | 数据字典提升数据结构清晰度

- Navicat 17 新增 PolarDB 与 Garnet 数据库

- Navicat 17 新特性 | 聚焦 MongoDB

- Navicat 17 新特性 | 新增 Redis 哨兵部署模式

- 免费版 Navicat Premium Lite

相关文章:

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作,它提供了一种优雅而简单的方法,将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过,有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的,通过包…...

JSON 反对序列化 public final class LocalDateTime 日期格式错误

错误日志为: java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.time.LocalDateTime (no Creators, like default construct, exist): no String-argument constructor/factory meth…...

Java 集合

1. 集合框架概述 集合框架(Collection Framework) 是 Java 中为处理一组对象而设计的一套标准化 API,它包括一组通用的接口、实现类和算法。这些接口和类为各种数据结构和操作方法提供了统一的实现方式,使得开发者可以轻松地对数…...

爬虫日常实战

爬取美团新闻信息,此处采用两种方法实现: 注意点:因为此处的数据都是动态数据,所以一定要考虑好向下滑动数据包会更新的情况,不然就只能读取当前页即第一页数据,方法一通过更新ajax数据包网址页数&#xf…...

复写零--双指针

一&#xff1a;题目描述 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理分析 三&#xff1a;代码编写 void duplicateZeros3(vector<int>& arr) {int dest -1, cur 0, n arr.size();//1.找到要复写的最后一个数字while …...

跟着小土堆学习pytorch(二)——TensorBoard和Transform

文章目录 一、TensorBoard1.1 add_scalar()1.1,1 报错&#xff1a;TypeError: MessageToJson() got an unexpected keyword argument including_default_value_fields1.1.2 图像重叠1.1.3 代码展示 1.2 add_image()1.2.1 代码 二、transform2.1 介绍——对图片进行一些变化2.2 …...

自由学习记录(10)

Sprite Packer ~Mode & 图集 packer Project Setting经常是金屋藏娇 创建的项目如果不是2d项目&#xff0c;则默认disable打包 编辑模式就是你没点运行看游戏效果&#xff0c;在狼狈敲码创对象写逻辑的那个状态&#xff0c; 运行模式从点了|>之后&#xff0c;就一直…...

Redis提供了专门的命令来实现自增操作

Redis中的自增操作并不是直接通过CAS&#xff08;Compare and Set&#xff09;操作实现的。Redis提供了专门的命令来实现自增操作&#xff0c;这些命令能够确保操作的原子性&#xff0c;而不需要显式地使用CAS机制。 Redis中的自增操作 Redis中的自增操作主要依赖于以下几个命…...

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…...

GenerativeU:生成式开放目标检测

论文&#xff1a;https://arxiv.org/abs/2403.10191 代码&#xff1a;https://github.com/FoundationVision/GenerateU 感想 目标检测任务已经逐渐从闭集场景专项开集场景&#xff0c;在LLM加持下&#xff0c;速读越来越快。该方法仍然依赖于预先定义的类别&#xff0c;这意味着…...

element plus e-table表格中使用多选,当翻页时已选中的数据丢失

摘要&#xff1a; 点击第一页选中两个&#xff0c;再选择第二页&#xff0c;选中&#xff0c;回到第一页&#xff0c;之前选中的要保留&#xff01; element ui table 解决办法&#xff1a; :row-key“getRowKeys” &#xff08;写在el-table中&#xff09; methods中声明 ge…...

CentOS 7 网络连接显示“以太网(ens33)不可用”

1.创建linux虚拟机&#xff0c;配置网络和主机名显示" 以太网&#xff08;ens33&#xff0c;被拔出&#xff09;" 2.桌面右键此电脑&#xff0c;管理&#xff0c;找到“服务和应用程序”&#xff0c;点击“服务”&#xff0c;找到下图两个服务&#xff0c;点击圈起来…...

qt QNetworkProxy详解

一、概述 QNetworkProxy通过设置代理类型、主机、端口和认证信息&#xff0c;可以使应用程序的所有网络请求通过代理服务器进行。它支持为Qt网络类&#xff08;如QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer、QNetworkAccessManager等&#xff09;配置网络层代理支持…...

推荐IDE中实用AI编程插件,目前无限次使用

插件介绍 一款字节跳动推出的“基于豆包大模型的智能开发工具” 以vscode介绍【pycharm等都可以啊】&#xff0c;这个插件提供智能补全、智能预测、智能问答等能力&#xff0c;节省开发时间 直接在IDE中使用&#xff0c;就不用在网页中来回切换了 感觉还可以&#xff0c;响应速…...

【华为HCIP实战课程十五】OSPF的环路避免及虚链路,网络工程师

一、避免域间路由环路 1、区域内部的防环:区域内同步了LSA,SPF就决定了区域内部没有环路 2、区间的防环机制:非正常的ABR不更新3类LSA 为防止区域间的环路OSPF定义了骨干区域和非骨干区域和三类LSA的传递规则 1)、OSPF划分了骨干区域和非骨干区域,所有非骨干区域均直接…...

【编程语言】正则表达式:POSIX 与 PCRE 的全面比较及应用

目录 正则表达式&#xff1a;POSIX 与 PCRE 的全面比较及应用1. 正则表达式的基本概念1.1 基本元素1.2 正则表达式的历史 2. POSIX 正则表达式2.1 POSIX 正则表达式的语法2.1.1 基本正则表达式 (BRE)2.1.2 扩展正则表达式 (ERE) 2.2 POSIX 正则表达式的使用场景2.3 使用 POSIX …...

Spark Streaming 数据流处理

一、创建Spark Streaming 环境 二、读取数据&#xff08;监听端口&#xff09; 三、任务处理 四、启动程序 我这里写的是简单的单词数量统计 import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} import org.apache.spark.{SparkConf, SparkConte…...

高效规划神器 markmap:一键将 Markdown 变思维导图!

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; 微信公众号&#xff5c;搜一搜&…...

微服务基础架构(图)

微服务基础架构是一种现代化的软件架构模式&#xff0c;旨在将大型复杂的应用程序拆分为多个小型、独立的服务。每个微服务专注于特定的业务功能&#xff0c;可独立开发、部署和扩展。 在微服务基础架构中&#xff0c;通常会使用轻量级的通信机制&#xff0c;如 RESTful API 或…...

中电金信:大模型时代 金融机构企业架构转型如何更智能化?

随着人工智能技术的不断进步&#xff0c;AI大模型在金融行业已经广泛应用&#xff0c;推动金融机构实现更高效、智能化的服务&#xff0c;同时也为金融科技领域的发展带来新的挑战。中电金信基于业务建模的企业架构转型解决方案也顺势而动&#xff0c;关注大模型在具体场景上的…...

Python3.9实战应用:数据分析环境搭建与常用库安装指南

Python3.9实战应用&#xff1a;数据分析环境搭建与常用库安装指南 1. 引言 Python作为数据科学领域的首选语言&#xff0c;其3.9版本在性能和功能上都为数据分析工作提供了坚实基础。本文将带你从零开始搭建一个专业的数据分析环境&#xff0c;涵盖Miniconda环境配置、Jupyte…...

【开题答辩全过程】以 基于Android的个人财务管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

罗技鼠标宏:专业级压枪系统构建指南

罗技鼠标宏&#xff1a;专业级压枪系统构建指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在竞技射击游戏中&#xff0c;精准控制武器后坐力…...

《奇迹 MU:荣耀出征》荣耀 12 区:职业选择 + 开荒路线 + 搬砖技巧全攻略!

作为正版奇迹 MU 授权的复古魔幻手游&#xff0c;《奇迹 MU&#xff1a;荣耀出征》的核心魅力不仅在于经典职业的热血回归与自由交易的搬砖乐趣&#xff0c;更在于从新手开荒到高阶攻坚的完整成长链路、全阶段高爆地图的刷宝惊喜、世界 BOSS 的全服混战与战盟攻城的巅峰对决。相…...

ANIMATEDIFF PRO新手避坑指南:常见问题与解决方案全解析

ANIMATEDIFF PRO新手避坑指南&#xff1a;常见问题与解决方案全解析 1. 前言&#xff1a;为什么选择ANIMATEDIFF PRO 如果你正在寻找一款能够生成电影级质量AI视频的工具&#xff0c;ANIMATEDIFF PRO可能是目前最强大的选择之一。基于AnimateDiff架构和Realistic Vision V5.1…...

SmolVLA效果展示:三视角图像对齐误差对最终动作精度影响分析

SmolVLA效果展示&#xff1a;三视角图像对齐误差对最终动作精度影响分析 1. 项目概述 SmolVLA是一个专门为经济实惠的机器人技术设计的紧凑高效视觉-语言-动作模型。这个模型最大的特点是能够在有限的硬件资源下实现高质量的机器人控制&#xff0c;让更多开发者和研究者能够接…...

ChatGLM3-6B-128K部署指南:Ollama环境配置避坑大全

ChatGLM3-6B-128K部署指南&#xff1a;Ollama环境配置避坑大全 本文面向需要处理长文本任务的开发者和研究者&#xff0c;手把手教你如何快速部署ChatGLM3-6B-128K模型&#xff0c;避开环境配置中的常见坑点。 1. 环境准备与快速部署 在开始部署之前&#xff0c;我们先简单了解…...

GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事

GME-Qwen2-VL-2B助力AIGC内容创作&#xff1a;自动为图片生成创意文案与故事 你有没有过这样的经历&#xff1f;面对一张精心拍摄的照片&#xff0c;却怎么也憋不出几句像样的文案。或者&#xff0c;看着一张充满故事感的图片&#xff0c;脑海里思绪万千&#xff0c;落到笔尖却…...

2023最新版Prometheus+Grafana监控系统搭建指南(含Docker-compose部署)

2023云原生监控实战&#xff1a;基于Docker-compose的PrometheusGrafana全栈部署指南 在云原生技术席卷各行各业的今天&#xff0c;监控系统已成为保障业务稳定性的神经中枢。传统监控方案在面对容器化、微服务架构时往往力不从心&#xff0c;而Prometheus作为CNCF毕业项目&…...

高效掌握Mermaid:从文本到可视化的实战指南

高效掌握Mermaid&#xff1a;从文本到可视化的实战指南 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器&#xff0c;支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图的开发者…...