SQL中exists关键字的用法
exists用于检查一个子查询是否至少会返回一行数据(即检测行的存在),返回值为true或false。
语法: exists subquery
参数: subquery是一个受限的select语句(不允许有compute子句和into关键字),该语句返回一个结果集。
结果类型: boolean类型——如果子查询包含行,则返回true,否则返回false,即言:exists根据subquery的结果集是否为空来返回一个布尔值——如果不为空则返回true,否则返回false。
以例子说明其使用方法:
table1 table2
id class_name id 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适合于外表小而内表大的情况。
SQL中exists关键字的用法相关推荐
- SQL中object_id函数的用法
SQL中object_id函数的用法 收藏 int object_id('objectname'); 此方法返回数据库对象标识号. 其中,参数objectname 表示要使用的对象,其数据类型为nc ...
- sql中日期函数的用法
sql中日期函数的用法 <script src="http://blog.csdn.net/count.aspx?ID=1920773&Type=Rank" ty ...
- SQL中EXISTS理解使用
SQL中EXISTS的理解使用 关联子查询 EXISTS理解使用 关联子查询 在讲述EXISTS用法之前,先讲述一下关联子查询: 关联子查询:是指在内查询中需要借助于外查询,而外查询离不开内查询的执行 ...
- SQL中的escape的用法
GPS平台.网站建设.软件开发.系统运维,找森大网络科技! https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/inde ...
- escape mysql_MySQL中ESCAPE关键字的用法详解
MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. MySQL中,转义字符以"" ...
- C#.NET验证码智能识别学习笔记---02-C#.Net中Using关键字的用法
C#.NET验证码智能识别学习笔记---02-C#.Net中Using关键字的用法 技术qq交流群:JavaDream:251572072 教程下载,在线交流:it.yunsit.cn ------ ...
- SQL中 ROW_NUMBER 函数的用法
SQL中 ROW_NUMBER 函数的用法 ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号.在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是 ...
- SQL中modify和alter用法区别
SQL中modify和alter用法区别 1. 所属能力大小不同: modify:只能用于修改字段的属性 例如:把age字段变为非空(针对persons表中的age这一个字段进行修改) ALTER T ...
- SQL中各关键字以及DBeaver工具的使用
SQL中各关键字以及DBeaver工具的使用 1. SQL执行顺序 2. 聚合函数 2.1 常用的聚合函数 2.2 group by ... having ... 2.3 Error 3. DBeav ...
最新文章
- Lambda 表达式有何用处?如何使用?
- Android 关机弹出菜单
- Matlab读取点云数据显示
- 【HNOI模拟By YMD】move
- System.Text.Json 中的字符编码
- 国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定
- .Net 中接口应用的知识点(排序)
- Quartz + Oracle 分布式Job实现
- android编辑框显示,为EditText输入框加上提示信息
- bzoj1831 逆序对 (dp+树状数组)
- js 在线压缩混淆工具
- c语言课程设计日程表,日程表:schedule用法大全
- C++边学边用,使用类完成复数运算,可自动识别表达式(详细注释)
- pc端调用电脑摄像头及麦克风完成录像或录音并实现回放和上传服务器
- 水务丨软件机器人实现自动计算,实现营业收费管理系统“智能升级”
- J版 OpenStack动态加载菜单图片详解
- python 培训南京
- matlab创建反正弦asin,JavaScript中反正弦函数Math.asin()的使用简介
- SARscape数据处理SAR数据笔记——DINSAR微小形变提取
- Quartz概念详解