首页 > 数据库 >SQL 查询 exist join in 的用法和相应的适用场景 (优化查询)

SQL 查询 exist join in 的用法和相应的适用场景 (优化查询)

时间:2024-03-31 17:22:56浏览次数:26  
标签:join name 查询 索引 exist 表中 id select

在SQL中常用的存在的 关联查询 exist join in ,优化查询

一、 “查询A表中在(或者不在)B表中的记录”

1、 join /in /exists 都可以用来实现,,这种查询,在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是: exists <= in <= join
当表中字段允许NULL时,not in 的方式最慢;
not exists <= left join <= not in

比较:

  • JOIN 和 IN
    select * from A where id in(select id from B)
    select * from A left join B on A.id = B.id
    使用join也可以实现这种功能(“查询A表中在(或者不在)B表中的记录”),但是往往吃力不讨好,因为还需要处理NULL,JOIN的使用场景是连接两个表,而不是判断一个表的记录是否在另一个表中

  • in 和 exists
    select * from A where id in(select id from B)

但是,通常情况下,两个表中数据是一个较大,一个较小,这种情况下,
in适合子查询表B 数据小的情况
exists适合子查询表B 数据大的情况

原因:in在查询的时候,先查子查询的表B,然后将内表和外表做一个笛卡尔积,然后按照条件筛选,所以子查询表比较小的时候,in的速度较快; 而exists 是对外表A做loop循环,每次loop循环再对内表B进行查询,即我们先查询的不是子查询B的内容,而是查我们的主查询的表A,所以子查询表数据比较大的时候,exists的速度较快

select 3 in (1,2,3); -- true
select 3 in (1,2,4); -- false
select 3 in (1,2,null); -- null
select 3 not in (1,2,null); -- null

SELECT EXISTS (SELECT 1 FROM (SELECT 3 AS num) AS temp WHERE temp.num IN (1,2,4,3)) AS result; -- true
SELECT EXISTS (SELECT 1 FROM (SELECT 3 AS num) AS temp WHERE temp.num IN (1,2,4)) AS result; -- false
SELECT EXISTS (SELECT 1 FROM (SELECT 3 AS num) AS temp WHERE temp.num IN (1,2,4,null)) AS result; -- false

当 ansi_nulls 打开时,3 <> NULL 被解释为 UNKNOWN,因为在 ANSI SQL 中,任何与 NULL 进行比较的结果都是未知的。
当 ansi_nulls 关闭时,3 <> NULL 被解释为 TRUE,因为 SQL Server 认为 3 不等于 NULL。

ansi_nulls 表示是否严格遵循 ANSI SQL 标准,ansi_nulls
  • not in 和 not exists
    select * from A where id not in(select id from B)

无论哪个表大,not exists 总是比 not in 执行效率高

2、sql性能优化 性能优化

3、 索引

  • 单列索引(Single-Column Index):
    单列索引是针对单个列创建的索引。在给定的表中,每个索引项只包含一个列的值。
    例如,CREATE INDEX idx_table_name ON table_name(name); 创建的是一个针对 name 列的单列索引。
    单列索引适用于对单个列进行查询、排序、过滤和连接操作。它可以加速对单个列的等值查询(=)、范围查询(BETWEEN)、排序查询(ORDER BY)等操作。

  • 组合索引(Composite Index):
    组合索引是针对多个列组合而成的索引。在给定的表中,每个索引项包含多个列的值。
    例如,CREATE INDEX idx_table_name ON table_name(name, comment_info); 创建的是一个针对 name 列和 comment_info 列的组合索引。
    组合索引适用于对多个列进行联合查询、排序、过滤和连接操作。它可以加速联合查询中的多个列的等值查询、范围查询、排序查询等操作。另外,组合索引也可以减少索引的数量,节省存储空间。

  • 唯一索引(Unique Index):
    唯一索引是保证索引列的值唯一的索引。在给定的表中,每个索引项包含的列的值都是唯一的。
    例如,CREATE UNIQUE INDEX unique_idx ON table_name(table_id); 创建的是一个唯一索引,确保 table_id 列中的值都是唯一的。
    唯一索引适用于确保表中某个列或列组的值唯一性,通常用于主键约束或唯一性约束。

标签:join,name,查询,索引,exist,表中,id,select
From: https://www.cnblogs.com/herebug/p/18106961

相关文章

  • java毕业设计基于微信公交查询小程序设计与实现
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着移动互联网技术的飞速发展,智能手机已经成为人们日常生活中不可或缺的一部分。微信作为国内领先的即时通讯软件,其小程序功能为用户提供了便捷的服务和......
  • C108 整体二分+树状数组(区修+区查)P3332 [ZJOI2013] K大数查询
    视频链接:C108整体二分+树状数组(区修+区查)P3332[ZJOI2013]K大数查询_哔哩哔哩_bilibili   参考:C82树状数组区修+区查P3372线段树1-董晓-博客园(cnblogs.com)LuoguP3332[ZJOI2013]K大数查询//整体二分+树状数组(区修+区查)O(n*logn*logn)#include<iost......
  • JoinPoint 常用的方法
    Object[]getArgs:返回目标方法的参数SignaturegetSignature:返回目标方法的签名ObjectgetTarget:返回被织入增强处理的目标对象ObjectgetThis:返回AOP框架为目标对象生成的代理对象*JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象......
  • 登录者个人信息查询
    目录......
  • openGauss 全密态数据库等值查询
    全密态数据库等值查询可获得性本特性自openGauss1.1.0版本开始引入。特性简介密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后......
  • 查询手机号码是否支持携号转网的API接口
      手机号码携号转网已经成为了一个热门话题,很多人在选择运营商时都会考虑这个因素。然而,要知道一个手机号码是否支持携号转网,并且查询其转网前及转网后所归属的运营商,是一件比较困难的事情。不过,幸运的是,有一些API接口可以帮助我们实现这个功能。今天,我要向大家介绍的就是一......
  • centos7提示 file /root/.serverauth.13703 does not exist
    情况背景:安装虚拟数据服务器,使用系统为centos7,安装完成后,开始安装图形化程序,在虚拟服务器上一切正常,输入startx也会正常显示图形操作界面问题来源:现在通过其他电脑远程连接虚拟数据服务器,输入地址进入也是正常,但是输入“startx”命令后就显示失败代码,无法进入图形操作界面,如......
  • VOL框架 GetPageData 前端加入自定义查询条件的处理方法
    VOL框架GetPageData前端加入自定义查询条件的处理方法前端加入两个自定义条件:开始日期,结束日期publicoverridePageGridData<ST_QueryFeeReceiveable>GetPageData(PageDataOptionsoptions){QuerySql=$@"SELECTFeeReceivableID,R.FeeI......
  • 安卓app 地铁最短路径查询 完成
     我通过三个函数完成了这个功能首先 创建哈希表根据起始站名终点站名然后根据哈希表建立起邻接表‘最后根据迪杰斯特拉算法完成这个功能/***function:起终查询*///构建邻接表publicstaticMap<String,Map<String,Integer>>buildAdja......
  • 手把手教你做阅读理解题-初中中考阅读理解解题技巧005-attract people to join Fitnes
    PDF格式公众号回复关键字:ZKYD005阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解1预览文章结构在开始深入阅读之前,快速浏览文章的标题、段落开头和结尾,可以迅速把握文章的主题、大致内容和结构标题通常能概括文章......