SQL 干货 | 使用 EXISTS 编写 SELECT 查询

基于 SQL 中的 EXISTS 运算符为我们提供了一种基于其他数据是否存在(或不存在)来检索数据的简便方法。更具体地说,它是一个逻辑运算符,用于评估子查询的结果,并返回一个布尔值,该值指示是否返回了行。尽管 IN 运算符可用于类似的目的,但需要注意它们之间的一些差异。今天的博客将介绍如何使用 EXISTS 运算符的几个示例,并提供一些指导,说明何时应使用 EXISTS 而不是 IN。

EXISTS 在实践中的应用

尽管 EXISTS 运算符可以在 SELECT、UPDATE、INSERT 或 DELETE 语句中使用,但为了保持简单,我们将重点介绍 SELECT 查询。因此,我们将使用的语法将非常类似于以下形式:

SELECT column_name(s) 
FROM table_name
WHERE EXISTS ( SELECT column_name(s) FROM table_nameWHERE condition );

我们将在 PostgreSQL 的几个表上执行我们的查询——比如客户和账户表,这些表在银行数据库中很常见。下面是在 Navicat for PostgreSQL 网格视图中显示的这些表:

customer_table (29K)

account_table (28K)

现在,我们可以使用以下查询来查看所有具有与其 customer_id 相关联的账户的客户:

SELECT *
FROM customer C
WHERE EXISTS ( SELECT *FROM account AWHERE C.customer_id = A.customer_id );

以下是在 Navicat Premium 的查询编辑器中执行上述查询的结果:

customers_with_accounts (49K)

使用 NOT EXISTS

相反地,在 EXISTS 运算符前加上 NOT 关键字会导致查询只选择子查询中没有匹配行的记录。我们可以使用 NOT EXISTS 来检索所有孤立的账户,即没有关联客户的账户:

SELECT *
FROM account A
WHERE NOT EXISTS ( SELECT *FROM customer CWHERE A.customer_id = C.customer_id );

由于客户表中没有该 ID 的客户,所以它返回了客户 #4 的账户。

accounts_without_customers (47K)

用 Joins 替换 EXISTS

使用 EXISTS 运算符的查询可能执行起来有点慢,因为子查询需要对外层查询的每一行都执行一次。因此,你应该尽可能考虑使用连接。事实上,我们可以使用 LEFT JOIN 来重写上面的EXISTS 查询:

SELECT C.*
FROM customer CLEFT JOIN account A ON C.customer_id = A.customer_id;

left_join (36K)

IN vs EXISTS 运算符

尽管 IN 运算符通常用于为列的某个值列表设置过滤器,但它也可以应用于子查询的结果。以下是我们第一个查询的等效查询,但这次使用的是 IN 而不是 EXISTS:

SELECT * 
FROM customer 
WHERE customer_id IN (SELECT customer_id FROM account);

请注意,我们只能选择想要进行比较的列,而不能选择 SELECT *。不过,IN 查询会产生相同的结果:

in_query (43K)

由于这两个操作符非常相似,数据库开发人员往往不确定应该使用哪一个。一般来说, 当你想根据特定值列表筛选行时,应该使用 IN 操作符。当你想检查子查询中是否存在满足某些条件的行时,应该使用 EXISTS。

结语

在今天的博客中,我们学习了如何使用 EXISTS 运算符,以及如何决定是使用 EXISTS 还是IN。

有兴趣试试 Navicat Premium 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560341.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

影刀RPA实战:制作Excel工资条

1.实战目标 使用Excel制作工资条是一种常见的做法,每个公司几乎都有这样的需求,我们先介绍下使用excel手动制作工资条的方法,看看不足之处,使用影刀RPA又会给我们带来怎样的便利,让我们更倾向于选择影刀来处理。 工资…

链表的回顾与总结(一)正序、逆序、有序、插入、修改、删除

逆序链表 #include<iostream> using namespace std; struct node {int data;node* next; };//最好不要全局定义指针&#xff0c;很麻烦 void show(node* head) {while (head){cout << head->data << ;head head->next;} } int main() {int i, j, k…

关于相机的一些零碎知识点

热成像&#xff0c;英文为Thermal Imaging&#xff0c;例如型号500T&#xff0c;其实指的就是热成像500分辨率。 相机的CMOS&#xff0c;英文为Complementary Metal Oxide Semiconductor&#xff0c;是数码相机的核心成像部件&#xff0c;是一种互补金属氧化物导体器件。 DPI…

C9800的Flex配置

C9800的配置和AireOS WLC的配置架构有了很大的调整&#xff0c;在配置一个WLAN的时候&#xff0c;可能相对麻烦一些&#xff0c;但是架构还是比较清晰。 这里记录一下针对Flex的配置&#xff0c;主要分为如下几个摘要&#xff08;以及对应的CLI配置&#xff09;&#xff1a; 1…

Carsim 2023.2 安装及使用

在我看来Carsim 2023.2最大的优点在于&#xff1a; 完全不用担心修改了内部参数&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Carsim 2023.2新增了database builder功能&#xff0c;使用者自己可以新建database&#xff0c;而且可以挑选自己所…

留学期间如何提高职业竞争力?

留学期间是提高职业竞争力的关键时期&#xff0c;以下是一些具体的建议&#xff0c;帮助留学生在留学期间增强自身的职业竞争力&#xff1a; 一、深化专业知识与技能 1. 专注于课程学习&#xff1a;努力学习专业课程&#xff0c;掌握扎实的专业知识&#xff0c;这是提高职业竞…

解决Vscode无法解析导入“xxxxx”Pylance的问题

问题&#xff1a; 在使用Vscode本地或ssh远程调试Python代码时&#xff0c;有时需要导入本地的其他模块&#xff0c;比如通过环境变量$PYTHONPATH指定的包路径&#xff0c;或者通过pip、conda、mim安装的pkg。 虽然程序可以正常运行&#xff0c;但Vscode会出现无法解析导入“x…

H264重点笔记记录

H264格式 目前视频中的H.264流行的NALU包装方式有两种&#xff0c;一种叫做annexB&#xff0c;一种叫做avcC。对于这两种格式&#xff0c;不同的厂商支持程度也不太一样&#xff0c;例如&#xff0c;Android硬解码MediaCodec只接受annexB格式的数据&#xff0c;而Apple的Video…

Linux-呈现数据

输入和输出 在脚本中重定向输出 在脚本中重定向输入 创建自己的重定向-创建输出文件描述符/重定向文件描述符 创建自己的重定向-创建输入文件描述符/创建读写文件描述符 创建自己的重定向-关闭文件描述符 列举打开的文件描述符 阻止命令输出 创建临时文件 记录消息

观诺奖感言:学好数理化,都被AI打趴下!

10月8日&#xff0c;瑞典皇家科学院宣布&#xff0c;将2024年诺贝尔物理学奖授予两位人工智能先驱——约翰霍普菲尔德&#xff08;John Hopfield&#xff09;和杰弗里辛顿&#xff08;Geoffrey Hinton&#xff09;。 在接到瑞典方打来的电话后&#xff0c;Hinton还在反复确认&a…

低功耗接地故障控制器D4145

一、概述 D4145 是一个接地故障断路器。它能够检测到不良的接地条件&#xff0c;譬如装置接触到水时&#xff0c;它会在有害或致命的电击发生之前将电路断开。 D4145能检测并保护从火线到地线,从零线到地线的故障.这种简单而传统的电路设计能够确保其应用自如和长时间的可靠性。…

鸿蒙开发之ArkUI 界面篇 二十八 ForEach

ForEach语法格式如下&#xff1a; ForEach(数组名字,(Item&#xff0c;index) >{item要做的事情}) 实现下图效果&#xff1a; 代码如下&#xff1a; Entry Component struct IndexTest {State titles:string[] [学鸿蒙,赢取白富美,走向人生巅峰,影音娱乐,海外旅游]build…

MES管理系统对中小企业有哪些帮助

MES管理系统解决方案对中小企业具有显著的帮助&#xff0c;主要体现在以下几个方面&#xff1a; 一、提升生产效率 MES管理系统能够实时监控生产过程&#xff0c;提供准确的生产数据和及时的反馈。这种实时监控与数据分析能力&#xff0c;使中小企业能够精准把握生产脉搏&…

机器学习、深度学习评价指标汇总:TP、TN、FP、FN、AP、mAP、IoU、mAP@3、Prec@10、 Acc@10

系列文章目录 文章目录 系列文章目录一、真正例&#xff08;True Positive&#xff09;、假正例&#xff08;False Positive&#xff09;、真负例&#xff08;True Negative&#xff09;和假负例&#xff08;False Negative&#xff09;是评估分类模型性能的重要概念。1. 定义2…

Excel中使用SQL语句的四种方法

总结在 Excel 中使用 SQL 语句的四种方法&#xff0c;各种方法都有各自的适用场景&#xff0c;可以选择自己熟悉的或喜欢方式。本文以在 Excel 中操作 MS SQL 数据库的数据为例进行说明。MS SQL 的数据如下&#xff0c;使用微软 SQLExpress 版本。 方法 1&#xff1a; Excel 现…

YOLOv10改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6

前言 在卷积神经网络中&#xff0c;激活函数通过在神经网络中引入非线性&#xff0c;使网络能够学习和逼近复杂函数&#xff0c;从而处理复杂的模式识别与分类问题。 文章目录 前言一、YOLOv11激活函数SiLU激活函数特性与其他激活函数的比较实现代码 二、替换激活函数&#xf…

上市四天暴涨又暴跌,扫描全能王背后公司坐上“过山车”

股价四天涨五倍&#xff0c;遇到回调跌一半&#xff0c;扫描全能王母公司——合合信息&#xff0c;一上市就坐上了“过山车”。 合合信息其实早在2021年就向科创板申请上市&#xff0c;并在2023年成功过会&#xff0c;但直到9月13日才开启申购&#xff0c;IPO之路一走就是三年…

ssm基于Javaee的影视创作论坛的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1选题动因 1 1.2目的和意义 1 1.3论文结构安排 2 第2章 开发环境与技术 …

minio集群部署

最近接触到minio&#xff0c; 将本地集群部署&#xff0c;分别在ubuntu、centos stream9上进行了搭建&#xff0c;目前看里面的小坑不小&#xff0c;记录以下教程&#xff0c;以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求&#xff0c;集群部署必须使用挂载非 roo…

已经被这几种广告彻底逼疯……还好有救了

这个假期回家团聚&#xff0c;爸妈小心翼翼问我手机越来越难用了&#xff0c;让我帮忙看看是不是中病毒了&#xff0c;了解后才知道原来事情是这样的&#xff1a; 以前开屏广告不小心误触已经让人恼火&#xff0c;现在是手机轻微动一动就会进入广告&#xff0c;打开app最后都不…