首页 > 数据库 >SQL中exists和in的用法以及区别

SQL中exists和in的用法以及区别

时间:2024-08-14 17:30:11浏览次数:12  
标签:语句 返回 exists 外表 用法 SQL 查询

SQL中exists和in的用法以及区别

 

 

目录

 

一、in 用法

in 语法为:

select *
from table_name
where col_name in (value1, value2,...);

in 操作符允许在 where 子句中规定多个值。

in 查询相当于多个 or 条件的叠加,比较好理解。

in 查询就是先将子查询条件的记录全都查出来。

in 查询的子条件返回结果必须只有一个字段。

二、exists 用法

exists 语法为:

select *
from table_a a
where exists (select 1 from table_b b where b.id = b.id);

exists 对外表用 loop 逐条查询,每次查询都会查看 exists 的条件语句。

当 exists 里的条件语句能够返回记录行时(无论返回多少记录行,只要能返回),条件就为真,返回当前 loop 到的这条记录。

反之如果 exists 里的条件语句不能返回记录行,则当前 loop 到的这条记录被丢弃。

exists 的条件就像一个 bool 条件,当能返回结果集则为 true,不能返回结果集则为 false

当子查询为 select NULL 时, mysql 仍然认为它是 True

三、in 与 exists 的区别

in 语句:只执行一次

确定给定的值是否与子查询或列表中的值相匹配。

in 在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。

所以相对内表比较小的时候,in 的速度较快。

exists 语句:执行n次(外表行数)

指定一个子查询,检测行的存在。

遍历循环外表,检查外表中的记录有没有和内表的的数据一致的。

匹配得上就放入结果集。

区别和应用场景

in 和 exists 的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用 in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用 exists

其实我们区分 in 和 exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如果是 exists,那么以外层表为驱动表,先被访问,如果是 in ,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系 ,另外 in 是不对 NULL 进行处理。

in 是把外表和内表作 hash 连接,而 exists 是对外表作 loop 循环,每次 loop 循环再对内表进行查询。一直以来认为 exists 比 in 效率高的说法是不准确的。

not in 和 not exists

如果查询语句使用 not in,那么内外表都进行全表扫描,没有用到索引;

而 not exists 的子查询依然能用到表上的索引。所以无论那个表大,用 not exists 都比not in 要快。

四、结论

1. 外层查询表小于子查询表,则用 exists,外层查询表大于子查询表,则用 in ,如果外层和子查询表差不多,则爱用哪个用哪个。

2.not exists 比 not in 效率高。

in 的遍历是在内存中遍历。

而 exists 需要查询数据库。

查询数据库所消耗的性能更高,而内存比较快

标签:语句,返回,exists,外表,用法,SQL,查询
From: https://www.cnblogs.com/cytc/p/18359408

相关文章

  • Mysql 中Exists
    existsexists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录;反之,如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件......
  • exists 用法
    exists用法exists 语法为:select*fromtable_aawhereexists(select1fromtable_bbwhereb.id=b.id);exists 对外表用 loop 逐条查询,每次查询都会查看 exists 的条件语句。当 exists 里的条件语句能够返回记录行时(无论返回多少记录行,只要能返回),条件就为真......
  • C++中STL用法汇总
    1什么是STL? STL(StandardTemplateLibrary),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++StandardLibrary)中,是ANSI/ISOC++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++......
  • SQLServer 错误: 8646,在数据库 'msdb',表 1077578877 的索引 ID 1 中找不到索引条目
    一台非生产服务器,磁盘被打满了,刚开始以为只是正常的磁盘使用增长满了,就清理了一部分空间出来,没过一会,就又满了,排查到sqlserver的错误日志文件一直在增 同时查看sqlserver错误日志,大量报错日志:[298]SQLServer错误:8646,在数据库'msdb',表1077578877的索引ID1中找不到索......
  • postgresql常用快捷命令
    查看帮助信息通过此命令查看数据库命令帮助信息,本文中的所有命令都可以在帮助命令列表找到命令格式:?示例:\?查看所有数据库命令格式:\l示例:\l切换数据库命令格式:\c数据库名称示例:\ctest_database执行成功会切换到指定的数据库查看数据库对象的相关信息命......
  • MySQL快速查询表和列
    1、获取某个库的所有表信息select*frominformation_schema.TABLESwhereTABLE_SCHEMA=(selectdatabase())即可查询当前数据库的表信息,包括了表名,注释等。2、查询某个表的字段信息select*frominformation_schema.COLUMNSwhereTABLE_SCHEMA=(selectdatabase())......
  • CTFHub~SQL注入超简单详细教程
    0x01整数型注入#本题告诉我们是整数型,所以就很容易了#判断字段数量1orderby2#判断回显点-1unionselect1,2#查询全部数据库名-1unionselect1,group_concat(schema_name)frominformation_schema.schemata#判断数据库中的表名-1unionselec......
  • 基于 canal+mysql 实现 yjs-schema 数据实时同步
    MySQL自动同步开源工具在现代的数据处理中,数据同步是非常重要的一个环节。MySQL作为一个广泛应用的数据库管理系统,自动同步数据也是一个比较常见的需求。今天我们将介绍一些开源工具,可以帮助我们实现MySQL数据库的自动同步。1.MaxScaleMaxScale是一个开源的MySQLProxy工具,它......
  • 在Centos系统源码安装postgreSQL数据库及postGIS扩展
    本次安装的各版本如下postgresql-13.5.targeos-3.10.2gdal-3.4.1proj-8.2.1postgis-3.2.1一、安装postgreSQL1.1安装包下载地址选postgresql-13.5.tar.gz。使用工具将下载好的包传到服务器。解压,进入解压目录[root@localhostlocal]#yuminstallgccreadline-develzlib-d......
  • Mysql跨库操作
    在MySQL中,操作多数据源(例如从库A和库B)进行联查的情况,可以分为以下两种场景:A库和B库在同一个MySQL实例当A库和B库在同一个MySQL实例下时,可以直接使用跨库联查查询。示例如下:SELECTA.column1,B.column2FROMA.table1ASALEFTJOINB.table2ASBONA.id=......