SQL中的IN语句和EXISTS语句

大家好,使用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 1FROM courses cWHERE 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 1FROM courses cWHERE c.student_id = s.student_id
);

三、结论

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

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

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

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

相关文章

Java学习路线:JUL日志系统(二)使用Properties配置文件

目录 认识properties 使用properties编写日志配置文件 认识properties 之前的学习中,我们学习了使用XML配置文件,但是XML的读取实在有些麻烦。那有没有更简单的方式来配置文件呢? 答案是:使用Properties配置文件 在这里了解pro…

【数据库】elasticsearch

1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片(Shard): 将索引数据分割成多个部分,每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理,从而提高系统的扩展性和性能。 在创建索…

Qt——常用控件

前言:本篇文章,将分享Qt中常用的,具有代表性的一些控件。 一.按钮类控件 在前边的文章中我们也多次分享过PushButton按钮,但Qt中并非只提供这一种按钮。 在Qt中,QPushButton并非直接继承自QWidget,QAbstr…

硬件基础06 滤波器——无源、有源(含Filter Solutions、Filter Pro、MATLAB Fdatool)

推荐设计RC无源滤波器使用,数字滤波器可以使用MATLAB,有源滤波器使用Filter Pro。 一、Filter Solutions 1、软件资源及安装教程如下 FilterSolutions14.1.rar资源 (1)、双击FS14_1_0.exe进行安装;不要安装到中文路…

js WebAPI黑马笔记(万字速通)

此笔记来自于黑马程序员,pink老师yyds 复习: splice() 方法用于添加或删除数组中的元素。 注意: 这种方法会改变原始数组。 删除数组: splice(起始位置, 删除的个数) 比如:1 let arr [red, green, b…

docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、网上最多的默认解决方法1、jenkins界面配置清华源2、替换default.json文件 二、解决低版本Jenkins在线安装插件问题1.手动下载插件并导入2.低版本jenkins在…

spark-on-k8s 介绍

spark-on-k8s 介绍 摘要 最近一段时间都在做与spark相关的项目,主要是与最近今年比较火的隐私计算相结合,主要是在机密计算领域使用spark做大数据分析、SQL等业务,从中也了解到了一些spark的知识,现在做一个简单的总结&#xff…

React教程(详细版)

React教程(详细版) 1,简介 1.1 概念 react是一个渲染html界面的一个js库,类似于vue,但是更加灵活,写法也比较像原生js,之前我们写出一个完成的是分为html,js,css&…

鸿蒙开发:自定义一个车牌省份简称键盘

前言 之前针对车牌省份简称键盘,在Android系统中搞过一个,当时使用的是组合View的形式,考虑到最后一个删除按钮单独占两个格子,做了特殊处理,单独设置了权重weight和单独设置了宽度width,既然鸿蒙系统的应…

电脑蓝屏不要慌,一分钟教你如何解决蓝屏问题

目录 一、检查硬件连接 二、更新驱动程序 三、修复操作系统错误 四、使用系统还原 电脑蓝屏是许多计算机用户经常遇到的问题之一。它可能由硬件故障、驱动程序问题、操作系统错误等多种原因引起。当电脑出现蓝屏时,很多人会感到困惑和焦虑。本文将向您介绍一些常见的解决方…

推荐!一些好用的VSCode插件

那些好用的VSCode插件 前言1、Auto Close Tag(自动补全标签)⭐2、Auto Rename Tag(自动更新标签)⭐3、Chinese(简体中文)⭐4、Git History (查看 Git 提交历史)⭐5、GitLens (增强 Git )6、open in browser (快速预览 )⭐7、Vetur ( Vue相关 )⭐8、Beautify ( 美化代码 )9、bac…

任务调度实现

我的后端学习大纲 XXL-JOB大纲 1、什么是任务调度 1.以下面业务场景就需要任务调度来解决问题: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前…

【SQL50】day 1

目录 1.可回收且低脂的产品 2.寻找用户推荐人 3.使用唯一标识码替换员工ID 4.产品销售分析 I 5.有趣的电影 6.平均售价 7.每位教师所教授的科目种类的数量 8.平均售价 1.可回收且低脂的产品 # Write your MySQL query statement below select product_id from Products w…

【数据结构与算法】第9课—数据结构之二叉树(链式结构)

文章目录 1. 二叉树的性质2. 链式结构二叉树3. 二叉树链式结构的4种遍历方式4. 二叉树节点个数5. 二叉树的叶子节点个数6. 二叉树第k层节点个数7. 二叉树的高度/深度8. 二叉树查找值为x的节点9. 二叉树的销毁10. 判断是否为完全二叉树11. 二叉树练习题11.1 单值二叉树11.2 相同…

ONLYOFFICE 8.2深度体验:高效协作与卓越性能的完美融合

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ONLYOFFICE 8.2 🔍引言📒1. ONLYOFFICE 产品简介📚2. 功能与特点🍁协作编辑 PDF🍂…

一文带你了解,全国职业院校技能大赛老年护理与保健赛项如何备赛

老年护理与保健,作为2023年全国职业院校技能大赛的新增赛项,紧密贴合党的二十大精神,致力于加速健康与养老产业的蓬勃发展,并深化医养康养结合的服务模式。此赛项不仅承载着立德树人的教育使命,更通过竞赛的引领作用&a…

HT71778 实时音频信号跟踪的18V,15A全集成同步升压转换器

1、特点 实时音频信号跟踪的电源供电 SN 短接地,VIN2.7~4.5V, VouT5V~12V RsN(to GND) 100k, ViN 2.7~8.5V, VouT 9V~15V SN 悬空,VIN 2.7~8.5V, VouT9V~18V 可编程峰值电流:15A 高转换效率: 93%(VIN7.4V, VoUT15.5V, IouT 1.5A) 低关断功耗,关断电流1uA 可调节的开…

二叉树 最大深度(递归)

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…

【Spring IoCDI】路径扫描,DI依赖注入

【路径扫描】 Spring注重路径,约定大于配置 例如,这个路径下,Spring默认会去扫描下【com.baiye.ioc】下面所有类中加了五大注解的路径,不在这个路径下是默认不会去扫描的 即:Spring默认的扫描路径是——启动类所在的目录及其子目…

JavaScript中变量的基础知识(超详细)

1.变量 1.1目标 理解变量是计算机存储数据的容器 变量:变量是计算机用来存储数据的容器(盒子)作用:记录计算机数据的不同状态注意:变量不是数据本身,它们仅仅是一个用于存储数值的容器。可以理解为一个用…