EXISTS、NOT EXISTS、IN和NOT IN辨析

文章目录

    • 概要
    • EXISTS
    • NOT EXISTS
    • IN
    • NOT IN
    • 辨析

概要

EXISTS、NOT EXISTS、IN 和 NOT IN 是 SQL 中用于查询时进行条件判断的关键字,它们在功能上有相似之处,但使用场景和性能表现上有所不同。

EXISTS

1.用途:用于子查询中,判断子查询是否返回至少一行数据。

2.性能:通常比 IN 或 NOT IN 更高效,尤其是当子查询返回大量数据时。这是因为 EXISTS 只需要找到第一个符合条件的记录就返回 TRUE,而不需要遍历整个子查询结果集。

3.使用场景:
EXISTS:当你需要验证至少存在一个满足条件的记录时。

假设有两个表:employees(员工表)和departments(部门表)。我们想要找出那些至少属于一个部门的员工。

SELECT employee_name  
FROM employees e  
WHERE EXISTS (  SELECT 1  FROM departments d  WHERE d.department_id = e.department_id  
);

在这个例子中,EXISTS子查询检查是否存在至少一个与employees表中的员工相关联的部门。如果存在,则返回该员工的名字。

NOT EXISTS

NOT EXISTS:需要验证不存在任何满足条件的记录时。

继续使用上面的employees和departments表,但这次我们想要找出那些不属于任何部门的员工。

SELECT employee_name  
FROM employees e  
WHERE NOT EXISTS (  SELECT 1  FROM departments d  WHERE d.department_id = e.department_id  
);

在这个例子中,NOT EXISTS子查询检查是否不存在任何与employees表中的员工相关联的部门。如果不存在,则返回该员工的名字。

IN

1.用途:用于将某个字段的值与子查询或静态值列表中的值进行比较,判断该字段的值是否存在于列表中。

2.性能:当子查询返回大量数据时,IN 或 NOT IN 的性能可能会受到影响,因为需要遍历整个子查询结果集或静态值列表。

3.使用场景:
IN:当你需要筛选出字段值在给定列表中的记录时。

假设有两个表:products(产品表)和categories(类别表)。我们想要找出属于类别1或类别2的所有产品。

SELECT product_name  
FROM products  
WHERE category_id IN (1, 2);

在这个例子中,IN关键字用于检查products表中的category_id列的值是否在列表(1, 2)中。如果是,则返回相应的产品名称。

NOT IN

NOT IN:当你需要筛选出字段值不在给定列表中的记录时。
继续使用products和categories表,但这次我们想要找出不属于类别1和类别2的所有产品。

SELECT product_name  
FROM products  
WHERE category_id NOT IN (1, 2);

在这个例子中,NOT IN关键字用于检查products表中的category_id列的值是否不在列表(1, 2)中。如果不在,则返回相应的产品名称。

辨析

1.性能差异:
在处理大量数据时,EXISTS/NOT EXISTS 往往比 IN/NOT IN 更高效,因为 EXISTS/NOT EXISTS 在找到第一个符合条件的记录后就会停止执行,而 IN/NOT IN 可能需要遍历整个列表。
然而,当子查询返回的数据量很小,或者列表中的值数量很少时,这种性能差异可能不那么明显。

2.使用场景:
如果你只是需要确认是否存在至少一个符合条件的记录,而不需要知道具体的记录内容,那么使用 EXISTS/NOT EXISTS 是更好的选择。
如果你需要筛选出字段值在特定列表中的记录,那么使用 IN/NOT IN 更直接。

3.注意事项:
当使用 NOT IN 时,需要特别注意列表中包含 NULL 的情况。如果列表中包含 NULL,那么整个 NOT IN 条件将不会返回任何结果,因为任何值与 NULL 的比较都会返回 UNKNOWN,而不是 TRUE 或 FALSE。

在某些情况下,NOT EXISTS 可以作为 NOT IN 的替代,以避免 NULL 带来的问题。
总之,选择 EXISTS/NOT EXISTS 还是 IN/NOT IN,需要根据具体的查询需求、数据量大小以及性能考虑来决定。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:cv.absdiff函数含义

在OpenCV库中,absdiff函数是一个非常重要的图像处理函数,其意义在于计算两个输入数组(通常是图像)之间对应元素差的绝对值。这个函数在图像处理和计算机视觉领域有着广泛的应用,如图像对比、运动检测等。 函数的基本用…

python第三方库【numpy.array】的使用(超详细)

NumPy 是 Python 中用于科学计算的基础库之一,它提供了高性能的多维数组对象以及这些数组的操作。NumPy 的核心数据结构是 ndarray(N-dimensional array,N维数组),它提供了一种高效的存储和操作大型多维数组的方法。以…

熬了一晚上,我从零实现了 Transformer 模型,把代码讲给你听

自从彻底搞懂Self_Attention机制之后,笔者对Transformer模型的理解直接从地下一层上升到大气层,瞬间打通任督二脉。夜夜入睡之前,那句柔情百转的"Attention is all you need"时常在耳畔环绕,情到深处不禁拍床叫好。于是…

客户案例|某大型证券公司数据库运维场景数据安全实践

证券行业涉及股票、债券、基金等金融产品的发行、交易和监管,业务具有数据规模大、数据价值高、数据应用场景复杂的显著特点,其中高速流转的业务系统中含有海量的客户个人信息、交易、行情、咨询等高敏感高价值信息。由于证券期货业务场景所具有的特殊性…

初中生物知识点总结(人教版)

第一章 认识生物 一、 生物的特征: 1. 生物的生活需要营养 2. 生物能进行呼吸 3. 生物能排出身体内产生的废物 4. 生物能对外界的刺激做出反应 5. 生物能生长和繁殖 除病毒以外,生物都是由细胞构…

单例模式(大话设计模式)C/C++版本

单例模式 C 饿汉 /* HM hungry man 饿汉 */ #include <iostream> using namespace std; class Singleton { private:Singleton() { cout << "单例对象创建&#xff01;" << endl; };Singleton(const Singleton &);Singleton &operator(c…

C++:cv.contourArea()函数解析

cv::contourArea是OpenCV库中用于计算轮廓面积的函数。该函数非常适用于图像处理中的形状分析、物体检测等领域。以下是关于cv::contourArea的详细介绍&#xff1a; 一、函数概述 cv::contourArea是OpenCV中用于计算封闭轮廓面积的函数。它接受一个轮廓作为输入&#xff0c;并…

Fedora 41 移除 Python 2支持

2024年的今天&#xff0c;在 Python 3 发布 16 年后&#xff0c;Fedora 发行版项目宣布 Fedora 41 将移除 Python 2.7。 除了 PyPy&#xff0c;Fedora 41 以及之后的版本将不再有 Python 2.7。运行时或构建时需要 python2.7 的软件包也将面临退役。 Fedora 41 将包含图像处理…

C++ 十进制与十六进制之间相互转换

十进制与十六进制之间相互转换 10_to_16 与二进制类似&#xff0c;十进制转十六进制对16整除&#xff0c;得到的余数的倒序即为转换而成的十六进制&#xff0c;特别地&#xff0c;如果超过10以后&#xff0c;分别用ABCDEF或abcdef来代替10、11、12、13、14、15。 代码1: #in…

【密码学基础】基于LWE(Learning with Errors)的全同态加密方案

学习资源&#xff1a; 全同态加密I&#xff1a;理论与基础&#xff08;上海交通大学 郁昱老师&#xff09; 全同态加密II&#xff1a;全同态加密的理论与构造&#xff08;Xiang Xie老师&#xff09; 现在第二代&#xff08;如BGV和BFV&#xff09;和第三代全同态加密方案都是基…

Git 快速上手

这个文档适用于需要快速上手 Git 的用户&#xff0c;本文尽可能的做到简单易懂 ❤️❤️❤️ git 的详细讲解请看这篇博客 Git 详解&#xff08;原理、使用&#xff09; 1. 什么是 Git Git 是目前最主流的一个版本控制器&#xff0c;并且是分布式版本控制系统&#xff0c;可…

合规与安全双重护航:ADVANCE.AI让跨境支付更无忧

近年来&#xff0c;随着全球化进程的加速和跨境贸易的蓬勃发展&#xff0c;跨境支付的需求大幅增加。根据Grand View Research的报告&#xff0c;2021年全球跨境支付市场规模估计为22.09万亿美元。到2025年&#xff0c;全球跨境支付市场预计将达到35.9万亿美元&#xff0c;较20…

rfid资产管理系统解决方案 rfid固定资产管理系统建设方案

在现代化的仓库储备中&#xff0c;仅仅完成对货物进出的简单批次处理已经不再足够&#xff0c;对库内货品的种类、数量、生产属性、垛位等信息的清晰记录变得至关重要。然而&#xff0c;传统的资产管理方式如条形码在长期使用中逐渐暴露出不耐脏、数据存储量小、读取间隔短、不…

优质可视化大屏模板+动态图表+科技感原件等

优质可视化大屏模板动态图表科技感原件等 软件版本&#xff1a;Axure RP 9 作品类型&#xff1a;高保真 作品内容&#xff1a; 1、大屏可视化模版&#xff08;100套&#xff09;&#xff1a;包含智慧城市、智慧社区、智慧园区、智慧农业、智慧水务、智慧警务、城市交通、电…

新加坡工作和生活指北:教育篇

文章首发于公众号&#xff1a;Keegan小钢 新加坡的基础教育在东南亚处于领先地位&#xff0c;这点基本是人尽皆知&#xff0c;但很多人对其教育体系只是一知半解&#xff0c;今日我们就来深入了解一下。 新加坡的学校主要分为三大类&#xff1a;政府学校、国际学校、私立学校。…

Python 中将字典内容保存到 Excel 文件使用详解

概要 在数据处理和分析的过程中,经常需要将字典等数据结构保存到Excel文件中,以便于数据的存储、共享和进一步分析。Python提供了丰富的库来实现这一功能,其中最常用的是pandas和openpyxl。本文将详细介绍如何使用这些库将字典内容保存到Excel文件中,并包含具体的示例代码…

如何理解Node.js?NPM?Yarn?Vue?React?

一、背景 对后端技术栈更熟悉&#xff0c;对前端技术栈不了解&#xff0c;希望通过前后端的技术栈进行对比&#xff0c;可以更直观地了解前端技术栈。 二、Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行环境。它使得 JavaScript 可以在服务器端运…

Xterminal工具的安装与使用体验

Xterminal工具的安装与使用体验 一、Xterminal简介二、Xterminal核心特性三、Xterminal使用场景四、Xterminal下载地址五、Xterminal的基本使用5.1 设置仓库密码5.2 SSH连接5.3 Windows远程桌面5.4 笔记功能5.5 AI工具 六、总结 一、Xterminal简介 Xterminal是一款专为开发者设…

【大模型】智能体探秘:从概念到实践的全面指南

智能体探秘&#xff1a;从概念到实践的全面指南 引言一、智能体的基本概念二、智能体的类型三、设计智能体的步骤四、智能体设计实例&#xff1a;迷宫求解智能体五、智能体的评估与优化六、智能体的未来方向结语 引言 在人工智能领域&#xff0c;智能体&#xff08;Agent&…

【Linux进阶】vim的用法

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…