SQL中的Exist操作
exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为true或false。
语法: exists subquery
参数: subquery是一个受限的select语句(不允许有compute子句和into关键字),该语句返回一个结果集。
结果类型: boolean类型——如果子查询包含行,则返回true,否则返回false,即言:exists根据subquery的结果集是否为空来返回一个布尔值——如果不为空则返回true,否则返回false。
以例子说明其使用方法:
table1table2
id class_nameid name class_id
01一年级 01 张三01
02二年级 02 李四02
03三年级 04 王五04
1、在子查询中使用NULL仍然返回结果集:select * from table1 where exists(select null),该条sql语句等同于:select * from table1,其查询结果为:
id class_name
01一年级
02二年级
03三年级
2、select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = t1.id),该条sql语句等同于:select t1.id,t1.class_name from table1 t1 where t1.id in (select t2.class_id from table2 t2 where t2.class_id = t1.id),其查询的结果为:
id class_name
01一年级
02二年级
其查询过程为:
select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = '01')
---> select * from table2 t2 where t2.class_id = '01'有数据存在,所以exists返回true;
select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = '02')
---> select * from table2 t2 where t2.class_id = '02'有数据存在,所以exists返回true;
select t1.id,t1.class_name from table1 t1 where exists (select * from table2 t2 where t2.class_id = '03')
---> select * from table2 t2 where t2.class_id = '03'没有数据存在,所以exists返回false;
这种执行过程可以通俗的理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则exists子句返回true,这一行可作为外查询的结果行,否则不能作为结果。
分析器会先看语句的第一个词,当它发现第一个词是select关键字的时候,它会跳到from关键字,然后通过from关键字找到表名并把表装入内存,接着是找where关键字,如果找不到则返回到select找字段解析,如果找到where,则分析其中的条件,完成后再回到select分析字段,最后形成一张虚表。
where关键字后面的是条件表达式,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。如果为正则执行select语句,否则不执行select语句。
分析器先找到关键字select,然后跳到from关键字,将该关键字后面的表导入内存,并通过指针找到第一条记录,接着找到where关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。exists是条件表达式的一部分,它也有一个返回值(true或false)。
在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用EXISTS条件句防止插入重复记录。
insert into table1 (id,class_name) values ('03','四年级') where not exists (select * from table1 where table1 = '03')
exists与in的区别:
1、in引导的子句只能返回一个字段,exists子句可以有多个字段;
2、通常情况下采用exists要比in效率高,因为in不走索引,但要但要具体情况具体分析:in适合于外表大而内表小的情况;exists适合于外表小而内表大的情况。
转载于:https://www.cnblogs.com/jpit/p/8317176.html
SQL中的Exist操作相关推荐
- SQL中的join操作总结(非常好)
1.1.1 摘要 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接.外联接和交叉联接等.如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的 ...
- 如何将不同情况下的List带到SQL中进行判断操作
简单来说就是将List传到SQL语句中进行查询操作 其实,这里将List传到SQL语句中进行查询,方法有很多,我这里只是记录我习惯用的一种方法,原因之初是因为我要判断的情况太多了,不方便全在SQL中进 ...
- sql crud_SQL Server中的CRUD操作
sql crud CRUD operations are foundation operations every database developer and administrator needs ...
- 对比SQL,学习Pandas操作:group_concat如何实现?
本文主要讲解的是如何利用pandas来实现SQL中的group_concat操作. group_concat SQL或者MySQL中的group_concat到底实现的什么功能呢?看例子来说明. 下面 ...
- oracle 更新sysdate,如何使用sysdate更新日期列,包括动态sql中的时间戳
Lalit Kumar .. 9 我已经尝试使用to_date(to_char(sysate)),但缺少时间戳 这样做是没有意义的. 为什么PL/SQL执行这么简单的任务.在纯SQL中执行此操作.UP ...
- 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作
https://www.zybuluo.com/aitanjupt/note/209941 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作 〇.摘要 一.基础环境 二.数据存 ...
- 使用SQL数据库在Python中进行CRUD操作
目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 将Python软件包安装为"Pypyodbc" 创建一个连 ...
- 使用SQL数据库在Python中执行CRUD操作
目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 安装Python包 "Pypyodbc" 创建连接文件 创 ...
- Sql中存储过程的定义、修改和删除操作
Sql中存储过程的定义.修改和删除操作 1.存储过程的分类 系统存储过程 本地存储过程(用户自定义) 临时存储过程(局部[#].全局[##]临时存储过程) 2.创建存储过程 ? 1 2 3 4 5 6 ...
最新文章
- Too many open files问题解决
- mybatis sql标签_这谁顶得住?Mybatis 十八连环问
- Linux双网卡绑定
- 修改主从服务器,搭建BIND主从服务器
- Http,TCP/IP,UDP
- ITSM (IT Service Management,IT服务管理 )
- 麻雀优化算法 SSA python实现
- 2022年度软考考试时间表已公布
- Python运用循环实现模拟登录
- Unity 计算角度和方向
- nps p2p穿透中遇到的NAT类型过低的问题解决
- ambari hdfs 启动报错_Ambari 1.6 自动安装hadoop 2.2.0 在Ambari启动namenode时报错
- Python:使用PyAV提取视频关键帧
- 你有花生我有酒,一本学道看一天(一)
- 一文读懂无线充电技术(附方案选型及原理分析)
- php 七牛时间戳防盗链,时间戳防盗链
- 互联网晚报 | 4月21日 星期四 | A股三大指数集体跌超2%;以岭药业已成功注册多个连花商标;天津市房协召集多家房企开会...
- 阿里云中间件推出全新开发者服务
- 单片机小白之旅—51仿真器
- IO+集合简易快递管理与图书管理