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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 今天给大家分享一下SQLServer中in和 exists 用法,希望能对大家有所帮助。

image_450b3ad9.png

今天给大家分享一下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

image_e61b9692.png

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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2天前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
5 0
|
3天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
4天前
|
关系型数据库 数据库
Postgres数据库获取绝对值的函数
【5月更文挑战第4天】Postgres数据库获取绝对值的函数
20 6
|
4天前
|
SQL 数据库
sql server 增删改查(基本用法)
sql server 增删改查(基本用法)
|
9天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
15天前
|
SQL 调度 数据库
【Database】Sqlserver如何定时备份数据库和定时清除
【Database】Sqlserver如何定时备份数据库和定时清除
23 2
|
22天前
|
SQL Oracle 关系型数据库
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
|
22小时前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
|
22小时前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
|
2天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
12 0