SQL中的IN语句和EXISTS语句

news2024/12/24 11:29:10

大家好,使用SQL时经常需要根据其他表的值过滤数据,常见方法是使用IN和EXISTS子句。这两者都用于检查子查询中值的存在,但它们的工作方式略有不同,并可能对性能产生不同影响。本文将探讨IN和EXISTS的定义、工作原理及其使用场景,并通过一些示例使这些概念更易于理解。

一、IN子句和EXITS子句

1.1 IN子句

IN子句用于根据列值是否与列表或子查询中的任何值匹配来过滤结果集。可以将其理解为在问:“这个值在这个列表中吗?” 如果是,则该行包含在结果集中。

以使用IN与列表为例,假设有一个名为students的表:

student_idnameage
1Arjun21
2Riya22
3Kiran23
4Sanjay21
5Priya24

要找出所有注册过任意课程的学生,可使用如下IN子句:

SELECT name
FROM students
WHERE student_id IN (SELECT student_id FROM courses);

查询结果如下:

name
Arjun
Riya
Sanjay

在这个过程中,子查询(SELECT student_id FROM courses)返回courses表中的student_id列表。IN子句检查students表中的student_id是否与这些ID中的任何一个匹配,如果匹配,则将该学生包含在结果中。

也可使用IN与子查询,假设有另一个名为courses的表:

course_idstudent_idcourse_name
1011Mathematics
1023Physics
1032Chemistry
1044Biology

要找出所有注册过任意课程的学生,可使用如下IN与子查询:

SELECT name
FROM students
WHERE student_id IN (SELECT student_id FROM courses);

查询结果如下:

name
Arjun
Riya
Kiran
Sanjay

在这个过程中,子查询(SELECT student_id FROM courses)返回courses表中的student_id列表。IN子句检查students表中的student_id是否与这些ID中的任何一个匹配,如果匹配,则将该学生包含在结果中。

1.2 EXSITS子句

EXISTS子句用于检查子查询是否返回任何行。与检查值匹配不同,EXISTS检查子查询是否至少找到一行。如果找到,则条件为真,该行将包含在结果集中。

使用相同的students和courses表,让我们找出所有注册了任何课程的学生,但这次使用EXISTS。

使用EXISTS与子查询如下:

SELECT name
FROM students s
WHERE EXISTS (
    SELECT 1
    FROM courses c
    WHERE c.student_id = s.student_id
);

查询结果如下:

name
Arjun
Riya
Kiran
Sanjay

在这个过程中,对于students表中的每一行,EXISTS子句运行子查询以检查courses表中是否存在student_id相同的行。如果子查询找到匹配项,EXISTS子句返回true,并将该学生包含在结果中。

二、IN与EXISTS区别与使用场景

2.1 IN与EXISTS的主要区别

乍一看,IN和EXISTS可能看起来非常相似,在许多情况下,它们可以互换使用。然而,有以下一些重要的区别需要考虑。

性能

  • IN:IN子句中的子查询执行一次,结果存储在内存中。这对于小列表可以高效,但如果列表很大,可能会变慢。

  • EXISTS:EXISTS子句中的子查询为外部查询中的每一行执行。当子查询返回大量行时,这可能更高效,尤其是在找到匹配项后可以停止检查的情况下。

NULL处理

  • IN:如果子查询返回NULL值,可能会导致意外结果,因为在SQL中,NULL比较比较复杂。

  • EXISTS:不存在NULL问题,因为它只检查行是否存在,而不管其值如何。

使用场景

  • IN:当您有一个值列表或一个小的子查询结果要比较时,最为合适。

  • EXISTS:当您想检查另一个表中相关数据的存在性时,尤其是在子查询结果很大或很复杂的情况下,最为合适。

2.2 何时使用IN

当处理一个小的、静态的值列表或返回可管理数量行的子查询时,可使用IN。它非常适合检查列的值是否与列表或简单子查询的结果匹配的情况,示例代码如下:

SELECT name
FROM students
WHERE age IN (21, 22, 23);

2.3 何时使用EXISTS

如需检查另一个表的行存在与否,应使用EXISTS。这在相关子查询中特别有用,因为条件取决于外部查询。它非常适合子查询可能返回多行,但实际只关心任何行是否存在的情况,示例代码如下:

SELECT name
FROM students s
WHERE EXISTS (
    SELECT 1
    FROM courses c
    WHERE c.student_id = s.student_id
);

三、结论

IN和EXISTS都是SQL中强大的工具,它们能够根据其他表或子查询中的条件过滤数据。虽然在很多情况下它们可以互换使用,但了解它们在性能、NULL处理和使用场景方面的区别,将帮助大家在特定情况下选择合适的工具。

总体来说,如果有一个特定的值列表或小的子查询结果需要检查时,使用IN;需要验证另一个表中行的存在性时,使用EXISTS,尤其是处理大的或复杂的数据集时。

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

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

相关文章

SpringBoot3集成Junit5

目录 1. 确保项目中包含相关依赖2. 配置JUnit 53. 编写测试类4、Junit5 新增特性4.1 注解4.2 断言4.3 嵌套测试4.4 总结 在Spring Boot 3中集成JUnit 5的步骤相对简单。以下是你可以按照的步骤: 1. 确保项目中包含相关依赖 首先,确保你的pom.xml文件中…

[数据结构从小白到大牛]第五篇:3分钟带你吃透双链表并用C语言模拟实现

目录 1->前言 2->链表的概念和结构 2.1链表概念 2.2->带头双向循环链表结构 3->模拟实现带头双向循环链表 3.1定义链表结点 struct ListNode 3.2创建链表结点 CreateLTNode 函数 3.3链表初始化函数 ListInit函数 3.4链表打印函数 ListPrint函数 3.5链表…

前端通过nginx部署一个本地服务的方法

前端通过nginx部署一个本地服务的方法: 1.下载ngnix nginx 下载完成后解压缩后运行nginx.exe文件 2.打包你的前端项目文件 yarn build 把生成的dist文件复制出来,替换到nginx的html文件下 3.配置conf目录的nginx.conf文件 主要配置server监听 ser…

不同的浮点数类型

不同的浮点数类型 尽管4字节的浮点数可表达相当大的数值,但对于人类而言,总不够用。一般而言,浮点数有3种类型,单精度的float和双精度的double以及更长的long double, 可参考:数据类型大小 不同语言的浮点数类型 C/Obj…

蓝桥杯第21场小白入门赛补题

5.蓝桥派对 思路 :一个区间与多少个其他区间有关联,先对所有区间左端点和右端点从小到大排序,对于每个询问,我们先算出[1,r]这个区间里有多少个区间的起点即区间总数,使用upper_bound函数,然后使用lower_bo…

推荐一款功能强大的数据库开发管理工具:SQLite Expert Pro

SQLite Expert Professional是一个功能强大的工具,旨在简化SQLite3数据库的开发。 它是SQLite的一个功能丰富的管理和开发工具,旨在满足所有用户从编写简单SQL查询到开发复杂数据库的需求。 图形界面支持所有SQLite功能。 它包括一个可视化查询构建器&a…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

Unity的gRPC使用之实现客户端

应用背景&#xff1a;本想Unity调用C的dll库获取一些数据资源&#xff0c;但是由于自己调用的C库模块化处理的不太理想&#xff0c;众多dll之间相互依赖&#xff0c;使得在调用dll的时候&#xff0c;会忽略一些dll的缺失&#xff0c;使Unity项目报错&#xff0c;故想到了使用gR…

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列&#xff08;password hash&#xff09;​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

[大模型]视频生成-Sora简析

参考资料&#xff1a; Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密&#xff01;Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

STM32学习笔记-外部中断和外部时钟

文章目录 EXTI基本结构AFIO 定时器1. STM32 定时器的种类2. 定时器的主要功能3. 定时器的配置4. 定时器 PWM 输出模式5. 定时器中断配置输出比较1. 输出比较模式概述2. 输出比较模式的配置今天实在有点疲惫了&#xff0c;明天继续学吧。 EXTI基本结构 AFIO 中断引脚选择&#…

【测试小白--如何写好测试用例--测试用例编写的方法+结合常见登录模块为实例--保姆级教学】

测试用例编写方法&登录模块实例 一、测试用例编写方法1. 等价类划分2. 边界值分析3. 状态转换测试4. 决策表测试5. 错误推测6. 用户场景测试7. 安全测试用例 二、登录模块测试用例实例1. 等价类划分2. 边界值分析3. 状态转换测试4. 决策表测试5. 错误推测6. 用户场景测试7.…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

Ubuntu Linux

背景 Ubuntu起源于南非&#xff0c;其名称“Ubuntu”来源于非洲南部祖鲁语或豪萨语&#xff0c;意为“人性”、“我的存在是因为大家的存在”&#xff0c;这体现了非洲传统的一种价值观。Ubuntu由南非计算机科学家马克沙特尔沃斯&#xff08;Mark Shuttleworth&#xff09;创办…

yolov8涨点系列之轻量化主干网络替换

文章目录 YOLOv8 替换成efficientvit轻量级主干网络的好处计算效率提升模型部署更便捷方便模型移植 模型可扩展性增强便于集成其他模块支持模型压缩技术 主干网络替换1.创建yolov8_efficeintVit.py2.修改task.py(1)引入创建的efficientViT文件(2)修改_predict_once函数(3)修改p…

碧桂园服务启动“乘梯无忧”专项行动 携手业主共筑电梯安全新未来

摘要&#xff1a;全国400城8000项目全面覆盖 电梯是当代社会不可或缺的垂直交通工具&#xff0c;电梯安全问题不仅关系到居民的日常生活&#xff0c;更关乎到他们的生命财产安全。随着生活节奏的加快&#xff0c;居民对电梯的运行效率也有了更高的要求和期待。 碧桂园服务在2…

应对AI与机器学习的安全与授权管理新挑战,CodeMeter不断创新引领保护方案

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术正在快速发展&#xff0c;逐渐应用到全球各类主流系统、设备及关键应用场景中&#xff0c;尤其是在政府、商业和工业组织不断加深互联的情况下&#xff0c;AI和ML技术的影响日益广泛。虽然AI技术的…

【AI换装整合包及教程】OOTDiffusion: AI换装工具的革命性创新

引言 在当今这个数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;从最初的语音识别、图像识别到现在的自然语言处理&#xff0c;AI的应用范围不断扩大&#xff0c;深刻地改变了我们的生活方式和工作模式。特别是在时尚界&#xff0c;…

全面解析:网络协议及其应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 全面解析&#xff1a;网络协议及其应用 文章目录 网络协议概述定义发展历程主要优势 主要网络协议应用层协议传输层协议网络层…

零基础‘自外网到内网’渗透过程详细记录(cc123靶场)——下

细节较多&#xff0c;篇幅较大&#xff0c;分为上/下两部分发布在两篇文章内 另一部分详见下面文章 零基础‘自外网到内网’渗透过程详细记录(cc123靶场)——上https://blog.csdn.net/weixin_62808713/article/details/143572185 八、第二层数据库服务器权限获取 猜到新闻资…