EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。

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

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

使用:

user表:

user_1011表:

语句:

select * from user u1 where exists(select * from user_1011 u2 where u1.name = u2.name);

结果:

注意,子查询中与主查询中的是否有关联会影响到结果!

在某些情况下,EXISTS关键字可以用=ANY和IN来代替功能。

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)

总结:

EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。
WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。
分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。
INSERT INTO TableIn (ANAME,ASEX) 
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)

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

数据库 EXISTS的用法相关推荐

  1. 数据库中exists的用法

    exists的用法 查询出的结果相当于boolean 类型 true 或 false . SELECT m.id, m.name, m.sex, m.age FROM t_employee m WHE ...

  2. 数据库学习之EXISTS的用法

    在项目中总要多多少少接触一些sql语句,对于这个大概就是比较弱项了,既然是弱项了,那遇到就来个总结学习吧. 今天要总结的是exists的用法,对于这个感觉熟悉又陌生:熟悉是因为经常看到一些人用到,陌生 ...

  3. mysql数据库replace写入_MySQL数据库replace into 用法(insert into 的增强版)

    MySQL数据库replace into 用法我以前介绍过相关的教程,但有加强版各位朋友可能不知道吧,今天我们来看一篇关于MySQL数据库replace into增强版的介绍与用法例子. Error ...

  4. MySQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  5. SQL语句中EXISTS的用法

    记录:258 在业务开展中,会遇到类似需求. 需求1:UPDATE表TEST_TB01中的记录:满足条件:这些记录不在TEST_TB02中. 需求2:UPDATE表TEST_TB01中的记录:满足条件 ...

  6. mysql raiserror_RAISERROR在SQL Server数据库中的用法

    raiserror  是由单词 raise error 组成 raise  增加; 提高; 提升 raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql ser ...

  7. 查询前几条记录SQL在不同数据库中的用法

    13,(1)查询前几条记录SQL在不同数据库中的用法; 1. ORACLE SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. INFORMIX SELECT FIR ...

  8. exists sql用法_SQL关于IN和EXISTS的用法和区别,读完之后,大部分程序员收藏了....

    1.exist,not exist一般都是与子查询一起使用. In可以与子查询一起使用,也可以直接in (a,b.....). 2.exist会针对子查询的表使用索引. not exist会对主子查询 ...

  9. sqlite mysql php_PHP实现的简单操作SQLite数据库类与用法示例

    本文实例讲述了PHP实现的简单操作SQLite数据库类与用法.分享给大家供大家参考,具体如下: SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已 ...

最新文章

  1. 你真的了解Grid布局吗?
  2. .NET 获取客户端的操作系统版本、浏览器版本和IP地址
  3. openresty模板html页面,openresty 中使用lua 的页面模板类库template来渲染页面
  4. Ubuntu 12.04 图形界面问题解决 开机死机
  5. wpf控件设计时支持(3)
  6. Model 3车主对FSD套件不满意 德国法院下令特斯拉回购汽车
  7. NUAAccst计算机网络第四章网络层复习
  8. 脑筋急转弯合集,主治心情不好!开心一笑
  9. linux下加载so文件
  10. PS 如何导出ico图标
  11. everedit 保存机器学习路径注意事项
  12. 2021最新Android常用开源库总结,建议收藏
  13. 详解APK静态分析引擎`quark-engine`的5大功能
  14. (3)登录界面——登录
  15. 我喜欢出发(汪国真)
  16. 计算机的表白隐藏功能,微信隐藏符号功能大全 情人节可以发这些表白
  17. ubuntu18.04 安装 roboware-studio
  18. Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络
  19. POJ 2375 Cow Ski Area 增加最小边使图强连通
  20. “我是集美貌与才华于一身的PAPI酱”,她为什么可以融到1200万

热门文章

  1. EditText显示QQ聊天表情
  2. 怎么把计算机桌面的文件固定到任务栏,win10如何将桌面我的电脑固定到任务栏 - 卡饭网...
  3. Vue 3.0文档编写指南
  4. 2014多益网络笔试题
  5. 织梦dedecms TAG标签调用汇总
  6. Amazon SES介绍 - 如何通过SES发送邮件
  7. 【爬虫】【Python】自动下载网络视频代码
  8. 【FICO】关于重复制造成本核算模式
  9. Find Any File for Mac,本地文件搜索工具
  10. libhv---编译与安装