SQL 中 IN 和 NOT IN 用法的那些事

SQL难点对比分析:IN 和 EXISTS 的用法对比 阅读详情
AI摘要

本文介绍了SQL中IN和NOT IN的基本概念、潜在问题,如效率低、易出错。还阐述了它们在MySQL、Oracle、SQL Server、DB2不同数据库中的使用限制和性能优化方法。最后提出使用EXISTS、NOT EXISTS或JOIN代替IN和NOT IN,以提高查询效率和准确性。

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.

老是说面试,没啥意思,今天说点技术的东西,

一、SQL中的IN 和 NOT IN 

(一)基本概念

  • IN :用于指定一个标量值的列表,用于匹配查询结果中是否包含列表中的值。例如:SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...)。

  • NOT IN :用于指定一个标量值的列表,用于匹配查询结果中是否不包含列表中的值。例如:SELECT column_name(s) FROM table_name WHERE column_name NOT IN (value1, value2, ...)。

(二)潜在问题

  • 效率低 :在某些情况下,尤其是数据量较大时,IN 和 NOT IN 的查询效率可能较低。例如,当子查询返回大量数据时,使用 IN 的查询可能需要进行全表扫描,导致查询速度变慢。

  • 容易出错 :在使用 IN 时,如果不小心在子查询中写错了列名,可能会导致查询结果不准确,而且不会报错。对于 NOT IN,如果子查询中包含 NULL 值,那么整个查询结果可能会为空,这可能与预期不符。

二、它们在不同数据库中的使用限制和区别

(一)MySQL

  • 使用限制 :在 MySQL 中,IN 和 NOT IN 的使用基本遵循标准 SQL 的规则。对于子查询返回的结果集,需要注意其返回的值类型应与主查询中的列类型一致。如果子查询返回的结果集中包含 NULL 值,那么使用 NOT IN 时可能会导致查询结果为空。

  • 性能优化 :在某些情况下,MySQL 对 IN 和 NOT IN 的查询可能会进行自动优化。但为了提高查询效率,建议尽量避免在子查询中使用复杂的查询逻辑,或者在子查询中包含大量数据。可以考虑使用 EXISTS 或 JOIN 代替。

(二)Oracle

  • 使用限制 :Oracle 对 IN 和 NOT IN 的使用也有类似的标准 SQL 规则。同样需要注意子查询返回的结果集类型与主查询列类型的一致性。对于 NOT IN,若子查询结果中存在 NULL 值,查询结果可能不会符合预期。

  • 性能优化 :Oracle 通常会根据查询语句的执行计划和表的统计信息来优化查询。在使用 IN 和 NOT IN 时,如果子查询的结果集较大,可能会导致查询效率降低。可以通过调整查询语句的写法,如使用 EXISTS 或 JOIN,来提高查询性能。
    记住:oracle 有in 1000 的限制哦

(三)SQL Server

  • 使用限制 :在 SQL Server 中,IN 和 NOT IN 的使用遵循标准 SQL 规范。需要注意子查询返回值与主查询列的类型匹配问题。对于 NOT IN,当子查询包含 NULL 值时,查询结果可能出现异常。

  • 性能优化 :SQL Server 会根据查询语句的执行计划和索引等来优化查询性能。在某些情况下,使用 IN 和 NOT IN 可能会导致查询效率低下。可以尝试使用 EXISTS 或 JOIN 等其他查询方式来代替,以提高查询效率。

(四)DB2

  • 使用限制 :DB2 对 IN 和 NOT IN 的使用规则与标准 SQL 相符。在使用过程中,要注意子查询返回结果的类型与主查询列的类型一致。当使用 NOT IN 且子查询结果中存在 NULL 值时,查询结果可能不符合预期。

  • 性能优化 :DB2 会根据查询语句的执行计划和表的结构等来优化查询。如果使用 IN 和 NOT IN 的查询性能不理想,可以考虑使用其他查询方式,如 EXISTS 或 JOIN,来提高查询效率。

  • 相知不迷路,来者皆是兄弟,搜索公众号 :“codingba” or “码出精彩” 交朋友,有更多资源相送。

三、替代方案

(一)使用 EXISTS 或 NOT EXISTS 代替

  • 语法示例 :

    • 使用 EXISTS:SELECT * FROM test1 WHERE EXISTS (SELECT * FROM test2 WHERE id2 = id1)

    • 使用 NOT EXISTS:SELECT * FROM test1 WHERE NOT EXISTS (SELECT * FROM test2 WHERE id2 = id1)

  • 优点 :EXISTS 和 NOT EXISTS 的查询效率通常比 IN 和 NOT IN 更高,特别是在子查询返回的结果集较大时。而且不存在因子查询包含 NULL 值而导致 NOT IN 查询结果为空的问题。

(二)使用 JOIN 代替

  • 语法示例 :

    • 使用 INNER JOIN:SELECT id1 FROM test1 INNER JOIN test2 ON id2 = id1

    • 使用 LEFT JOIN:SELECT id1 FROM test1 LEFT JOIN test2 ON id2 = id1 WHERE id2 IS NULL

  • 优点 :通过 JOIN 查询可以将多个表的数据进行关联查询,查询效率通常较高,而且可以避免因子查询出错而导致的结果不准确问题。

综上所述,在使用 SQL 中的 IN 和 NOT IN 时,需要注意其潜在的问题,如效率低和容易出错等。在不同数据库(MySQL、Oracle、SQL Server、DB2)中,它们的使用规则基本一致,但在性能优化方面可能存在差异。为了提高查询效率和准确性,可以考虑使用 EXISTS、NOT EXISTS 或 JOIN 等方式代替 IN 和 NOT IN。在实际应用中,应根据具体的需求和数据库的特点来选择合适的查询方式。

SQL查询中的“IN”操作符:简化条件筛选的秘密武器 为'Fish bean bag toy'、'Bird bean bag toy'或者'Rabbit bean bag toy'的产品信息,你可以选择使用多个。它不仅能简化代码、提高可读性,还在很多情况下可以优化查询性能,特别是在匹配多个值时。操作符可以与子查询结合使用,从而动态生成匹配列表,增加查询的灵活性。操作符,可以更高效地编写SQL查询,并提升数据库操作的灵活性和效率。操作符可以使SQL查询语句更加清晰易读,特别是在需要匹配多个值时。操作符的应用范围更广,可以实现动态条件的查询。 阅读详情

相关推荐

IN 和 NOT IN 在 SQL 条件查询中的详细说明

以下是 IN 和 NOT IN 在 SQL 条件查询中的详细说明,涵盖语法、应用场景、性能陷阱及替代方案:

weixin_51288065的博客 1348

SQL语句之in操作符

SQL语句之in操作符

techenliu的博客 1万+

SQL避坑:当in,not in遇上null这种坑你避过吗?

用in的时候一般问题不大,使用not in的时候需要特别主要,结合本文恰当使用,之所以 造成如此大的差异原因是对NULL的判断上,NULL的判断本质上is null或is not null,in或 not in的判断是等于(=),所以对NULL判断是无效的,需要谨记。.........

石榴姐yyds 9273

sql语句之in 的用法

in 的用法-- 查询匹配多个字段 select in关键字查询匹配单个字段 select id from table where name in('name1','name2') select in关键字查询匹配多个字段 select id from table where (num,name) in ((num1,'name1'),(num2,'name2')) select * from table_name where column_name in (‘nn’,‘mm’,‘hh’,‘gg’)你再

乐乐呀的博客 5万+

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

双硬盘下Ubuntu 16.04与Win10双系统的安装

之前写过一个双系统安装过程,今天再次整理的原因是想重点强调双硬盘的区别。标红的一定要注意看,那就是我自己一步一步踏出来的坑啊...   基础步骤就不再重复,重点讲区别,需要看详细步骤的童鞋(或者你只有一个硬盘)请看我上一篇博客https://blog.youkuaiyun.com/weixin_40308540/article/details/80157444   区别:双硬盘和单硬盘的区别是什么呢?...

不吃包子 1121

16、IN和NOT IN用法详解

MySQL 中的 IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。 NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中;如果不是,返回值为 1,否则返回值为 0。 IN的语法格式如下: expr IN ( value1, value2, value3 ... valueN ) NOT IN的语法格式如下: expr NOT IN ( value1, value2, value3 ... valueN ) exp

you can you up up up的博客 2万+

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 301

SQL语句中in not in exits not exits用法比较

<br /><br /><br />exists (sql 返回结果集为真) <br />not exists (sql 不返回结果集为真) <br />如下: <br />表A <br />ID NAME <br />1    A1 <br />2    A2 <br />3  A3 <br /> <br />表B <br />ID AID NAME <br />1    1 B1 <br />2    2 B2 <br />3    2 B3 <br /> <br />表A和表B是1对多的关系 A.ID

zhangweikai的专栏 7712

MAPPO实战:从理论到代码的协作智能体训练指南

本文详细介绍了MAPPO算法在多智能体协作训练中的实战应用,从理论基础到代码实现全面解析。通过对比PPO与MAPPO的差异,深入讲解CTDE框架、网络架构设计、参数调优等关键环节,并提供实际项目中的调参经验和常见问题解决方案,帮助开发者快速掌握这一强化学习前沿技术。

weixin_42561040的博客 263

从OVITO可视化到LAMMPS计算:ATOMSK堆垛层错模型的全流程避坑指南

本文提供了一份从ATOMSK建模、OVITO可视化诊断到LAMMPS计算的堆垛层错模型全流程实战指南。重点解析了构建“计算友好”模型的核心矛盾,并详细演示了如何通过添加真空层、原子包裹和能量最小化等关键步骤,规避周期性边界条件带来的非物理相互作用,确保广义层错能计算的可靠性与可复现性。

v4w5x6的博客 266

SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别

SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别:IN:确定给定的值是否与子查询或列表中的值相匹配。IN 关键字使您得以选择与列表中的任意一个值匹配的行。当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:SELECT ProductID, ProductName FROM Northwind

feixiang7443的专栏 2744

DISM错误87详解:RestoreHealth选项无法识别的修复方法

DISM(部署映像服务和管理工具)是Windows系统维护与修复的核心命令行工具,常与SFC(系统文件检查器)配合使用,用于扫描和修复组件存储损坏、系统文件缺失等问题。在执行系统健康检查时,用户常会遭遇错误87,提示“未在此上下文中识别出restorehealth选项”。该错误的本质并非工具损坏,而是命令参数结构不符合DISM的语法解析规则,或当前系统环境(如Windows 7、WinRE/PE、32位环境)不支持该参数。理解DISM的命令层级、参数挂载关系以及运行上下文,是精准排除故障的前提。通过核对标准

weixin_34116482的博客 459

sql的exsit,not exsit,in ,not in的理解

参考网址 https://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(select 1 fro...

e10million的博客 1万+

工业相机——靶面尺寸、像元尺寸、分辨率 、传感器尺寸

由Sensor对角线长度表示,单位英寸,这里的1英寸=16mm。——靶面尺寸为宽12.7mm*高9.6mm,对角线16mm。——靶面尺寸为宽8.8mm*高6.6mm,对角线11mm。——靶面尺寸为宽7.2mm*高5.4mm,对角线9mm。——靶面尺寸为宽6.4mm*高4.8mm,对角线8mm。——靶面尺寸为宽4.8mm*高3.6mm,对角线6mm。——靶面尺寸为宽3.2mm*高2.4mm,对角线4mm。——靶面尺寸为宽14*高10.5mm,对角线17mm。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 9604

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 799

exists和not exists用法 代替in和not in

sql exists和not exists用法   exists       (sql       返回结果集,为真)    not       exists       (sql       不返回结果集,为真)  如下:  表A  ID   NAME    1       A1  2       A2  3       A3  表B  ID   AID   N

1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SQL中in和not in用法

SQL中In和NOT In

qq_61820657的博客 3401

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

sql中 in 、not in 、exists、not exists 用法和差别

exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1    A1 2    A2 3  A3 表B ID AID NAME 1    1 B1 2    2 B2 3    2 B3 表A和表B是1对多的关系 A.ID => B.AID SELECT ID,NAME FROM A WHERE EXIST (SELECT 

oathevil的专栏 1210

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SQL中IN和NOT操作符的用法

IN操作符:用于检查字段的值是否在给定的一组可能值中。如果字段值在该组中,则返回TRUE。NOT操作符:用于反转条件表达式的结果,将TRUE变为FALSE,或者将FALSE变为TRUE。通常用于否定某个条件。结合使用IN和NOT可以结合起来,达到更复杂的查询需求,例如使用NOT IN来排除某些特定的值。通过IN和NOT操作符,可以更灵活地进行数据筛选和条件判断,帮助简化SQL查询,提高可读性和效率。

欢迎来到我的博客。 2253

exists 和not exists 用法简介及与IN和not In的区别

使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。差集包含只属于两个集合中的第一个集合的元素。EXISTS:指定一个子查询,检测行的存在。NOT EXISTS:指定一个子查询,检查行的不存在exists (sql 返回结果集为真) not exists (sql 不返回结果集为真=no r

zhoubo200的专栏 3790

SQL中 in 、not in 、exists、not exists 用法和差别

如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AID NAME 1 1 B1 2 2 B2 3 2 B3 表A和表B是1对多的关系 A.ID => B.AID 1 SELECT ID,NAME FROM A WHERE EXIST (SELECT*FROM B WHE...

weixin_30800807的博客 140

sql in not in_SQL IN – SQL NOT IN

sql not in inSQL IN operator is used along with WHERE clause for providing multiple values as part of the WHERE clause. SQL IN运算符与WHERE子句一起使用,以提供多个值作为WHERE子句的一部分。 1. SQL输入 (1. SQL IN) SQL IN operato...

从零开始的教程世界 1003
上一篇: 面试 — 进行时 — 谈薪秘籍
下一篇: YU7,真的这么厉害吗?
supingemail
博客等级 码龄18年 1235粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值