数据库:SQLServer中in和 exists函数用法笔记

今天给大家分享一下SQLServer中in和 exists 用法,希望能对大家有所帮助。

一、IN 用法

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

1.1 语法格式

test_expression [ NOT ] IN       ( subquery | expression [ ,...n ]      )

1.2 参数说明

test_expression

为任意有效的SQL表达式。

subquery

包含某字段结果集的子查询。 该字段必须与 test_expression 具有相同的数据类型。

expression[ ,... n ]

表达式列表,用来测试是否匹配。 所有的表达式必须与 test_expression 具有相同的类型**。

注意:在 IN 子句的括号中显式包括数量非常多的值(数以千计,以逗号分隔)可能会消耗资源并返回错误 8623 或 8632。 若要解决这一问题,可以将这些项存储于某个表的 IN 列表中,然后在 IN 子句中使用 SELECT 嵌套查询。

1.3 用法示例:

select  * from t_user where name in ('aaa','bbb','ccc');
Select name from students where studentId 
not in(select stuid from studentScore where score>90);

二、EXISTS 用法

2.1 语法:EXISTS subquery

参数:subquery 是一个受限制的的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。

结果类型:Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE

2.2 示例:

-- null  返回全表
select * from T_user where  exists (select null);
等同于:select * from T_user
-- 常用写法
select * from T_user where exists (select userid from score)

三、IN 和 EXISTS 区别

3.1 IN列子

select * from tb1 where id in(select id from tb2)

解释:上面的查询语句使用了in语句,in()只执行一次,它查出tb2表中的所有id字段并缓存起来.之后,检查tb1表的id是否与tb2表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完tb1表的所有记录.

转换为编程语言如下:

List List=[];Array A=(select * from tb1);
Array B=(select id from tb2);
for(int i=0;i<A.length;i++) {   
for(int j=0;j<B.length;j++) {      
if(A[i].id==B[j].id) 
{        List.add(A[i]);         break;      }   }}return List;

如:tb1表有10000条记录,tb2表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差.

再如:tb1表有10000条记录,tb2表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升.

结论:in()适合tb2表比tb1表数据小的情况

3.2 EXISTS例子

select a.* from A a where exists(select 1 from tb2 
b where a.id=b.id)

以上查询使用了exists语句,exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.

转换为编程语言如下:

List List=[];Array A=(select * from tb1);
for(int i=0;i<A.length;i++) 
{   if(exists(A[i].id) {    //执行select 1 from tb2 b where b.id=a.id是否有记录返回       List.add(A[i]);   }
}
return List ;

当tb2表比tb1表数据多的时候,适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.

如:tb1表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断tb1表中的id是否与tb2表中的id相等.

如:tb1表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行tb1.length次,可见tb2表数据越多,越适合exists()发挥效果.

再如:tb1表有10000条记录,tb2表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.

结论:exists()适合tb2表比tb1表数据大的情况

总结:EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,但要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

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

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

相关文章

什么是m叉树_不懂数据库索引的底层原理?那是因为你心里没点b树

前几天下班回到家后正在处理一个白天没解决的bug&#xff0c;厕所突然传来对象的声音&#xff1a; 对象&#xff1a;xx&#xff0c;你有《时间简史》吗&#xff1f; 我&#xff1a;我去&#xff01;妹子&#xff0c;你这啥癖好啊&#xff0c;我有时间也不会去捡屎啊&#xff01…

可重入锁是什么和demo

可重入锁 reentrantlock是独占锁且可重入的 synchronized 也可以重入 可重入意思就是这个线程已经获取锁了&#xff0c;你再获取该锁还能获取 获取的还是原来的锁 不会出现问题 可以降低编程难度 代码如下: new Thread(new Runnable() {Overridepublic void run() {synchr…

linux 安装python 3.x,Linux 安装python3.x步骤

本文转发自博客园非真的文章&#xff0c;内容略有改动linux系统本身默认安装有2.x版本的python&#xff0c;版本x根据不同版本系统有所不同&#xff0c;通过python --V 或 python --version 查看系统自带的python版本。有一些系统命令时需要用到python2&#xff0c;不能卸载&am…

数据库:SQLServer中游标的用法笔记

一、游标的概念知识游标可以理解为SQL Server的一种数据访问机制&#xff0c;它允许用户访问数据的维度是数据行。用户可以对每一行数据进行单独处理&#xff0c;从而降低系统开销和潜在的阻隔情况&#xff0c;游标主要用于存储过程&#xff0c;触发器和 T_SQL复杂的脚本中&…

BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差... 题解也是看了好半天,有点难理解. 感觉…

智慧政务解决方案(28页)pdf_【金众电子】智慧政务解决方案

智慧政务解决方案立式党建广告机广告机简介&#xff1a;KC-立式政务广告机(室内/室外可选)液晶屏幕特别卖点&#xff1a;安装简易、亮度调节、实时更新、传输安全应用场所&#xff1a;各种需要文化传播的政务机构、政府机关、会议场所等。双立柱政务文化栏/宣传栏文化栏简介&am…

笨办法学linux dhcp,了解网关、DNS、子网掩码、MAC地址、DHCP

原标题&#xff1a;了解网关、DNS、子网掩码、MAC地址、DHCP什么是网关、DNS、子网掩码&#xff0c;它有什么作用&#xff0c;确实&#xff0c;我们平时在网络中总是在不断的提到网关&#xff0c;却很少真正的去了解它。一、什么是网关1、什么是网关网关是一种充当转换重任的计…

数据库:SQLServer Stuff 函数用法笔记

今天小编给大家分享一下自己整理一下SQLServer Stuff函数用法技巧和常用示例&#xff0c;有需要的朋友可以学习一下。一、Stuff函数的作用1.1官方解释STUFF 函数将字符串插入到另一个字符串中。 它从第一个字符串的开始位置删除指定长度的字符&#xff1b;然后将第二个字符串插…

自定义注解,aop实现注解锁

多线程环境下&#xff0c;会出现线程不安全的问题&#xff0c;所以要对某些方法加锁以保证线程安全 但是如果方法过多&#xff0c;每个方法前后都加这么一句&#xff0c;有点麻烦了&#xff0c;而且代码可读性也会差一些。可以使用aop切面编程&#xff0c;对某些加有特定注解&…

手机端刷recovery工具_MIUI/REDMIN手机玩机汇集

愿你刷机半生归来仍是MIUI1解锁篇解锁Bootloader准备工作&#xff1a;1.手机备份数据2.手机进入开发者模式①进入“设置 -> 我的设备 -> 全部参数"中连续点击MIUI版本&#xff0c;进入”开发者模式“②进入“设置 -> 开发者选项 -> 设备解锁状态”中绑定账号和…

数据结构基础:线性表学习笔记

1、线性表定义线性表是指n个元素的有限序列(n>0),通常用(a1,a2,a3...,an),来表示。2、线性表特点1、存在唯一的一个首元素2、存在唯一一个尾元素3、除第首元素外&#xff0c;每个元素只有一个直接前驱。4、除尾元素外&#xff0c;每个元素只有一个直接后继。3、线性表的存储…

iphone导出照片到电脑_iPhone里的照片如何快速导入电脑

前几日我一好友发微信问我&#xff1a;“向阳&#xff0c;我手机里有一万多张照片&#xff0c;怎么能快速的备份到电脑里&#xff1f;”我一看这问题&#xff0c;确实很多果友从用苹果手机开始&#xff0c;机器已经更新换代了好多代了&#xff0c;照片是越来越多&#xff0c;内…

数据结构基础:栈和队列学习笔记

1、栈1.1 栈的定义栈是只能通过访问它的一端来实现数据的存储和检索的一种特殊的线性数据结构。栈的修改要遵循先进后出的原则&#xff0c;这个是栈的核心。在栈中进行插入和删除操作的一端称为栈顶&#xff08;Top&#xff09;。另一端被称为栈底&#xff08;bottom&#xff0…

idea @Autowired 注入爆红(无法注入)

问题如下图所示,idea Autowired 注入爆红(无法注入) seettings ----> Editor Inspactions ----->spring ---->spring Core ----> Code ----> Autowring for Bean Class 去掉那个勾 效果如下

华为手机相册怎么镜像翻转_怎么利用手机相册制作电子视频

怎么通过手机照片制作视频&#xff1f;将照片做成视频并不是很难&#xff0c;可以直接在手机上进行操作&#xff0c;下面来看看是怎么操作的。方法/步骤在手机上打开清爽视频编辑器&#xff0c;有视频编辑、美拍美摄、电子相册、特效模板、动感视频、创意视频、动态字幕、视频变…

数据结构基础:树结构的学习笔记

1、树的定义树是n(n>0)个节点的有限集合。当n0时称为空树&#xff0c;当n>0 为非空树&#xff0c;任何非空树中&#xff0c;有且仅有一个根节点&#xff1b;其余节点可分为m(m>0)个互不相交的有限集合T1、T2 等&#xff0c;其中每一个集合都可以称为一棵树&#xff0c…

android组件用法说明,Android第三方控件PhotoView使用方法详解

Android第三方控件PhotoView使用方法详解发布时间&#xff1a;2020-10-21 15:06:09来源&#xff1a;脚本之家阅读&#xff1a;74作者&#xff1a;zhaihaohao1PhotoView的简介&#xff1a;这是一个图片查看库&#xff0c;实现图片浏览功能&#xff0c;支持pinch(捏合)手势或者点…

idea中新建分支并且切换到新建的分支上

开发新功能,idea上新建自己的分支,要在dev分支上新建 首先,idea右下角可以看到目前在dev分支上 点击dev,接着New Branch 输入分支名 在Local Branches中就显示了 然后可以看到已经切换到刚新建的分支上了 想要切换到刚新建的分支上开发时,可以点击分支,在弹框上点击Checkout

vnpy怎么创建策略并回测_【手把手教你】入门量化回测最强神器backtrader(一)

1 引言目前基于Python的量化回测框架有很多&#xff0c;开源框架有zipline、vnpy、pyalgotrader和backtrader等&#xff0c;而量化平台有Quantopian&#xff08;国外&#xff09;、聚宽、万矿、优矿、米筐、掘金等&#xff0c;这些量化框架或平台各有优劣。就个人而言&#xff…