exists用法

  • exists:

    • 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句
    • 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句
  • not exists: 与exists相反
    • 如果括号内子查询语句结果为空,说明表示where条件成立,就会执行主SQL语句
    • 如果括号内子查询语句结果不为空,说明表示where条件不成立,就不会执行主SQL语句
      • exists与in的区别:

        • in只能返回一个字段值
        • exists强调是否返回结果集,不要求知道返回什么,exists允许返回多个字段
      • exists的效率一般优于in:
        • 使用exists,Oracle首先会检查主查询,然后运行子查询直到找到第一个匹配项
        • 使用in子查询时,首先会执行子查询,并将获得的结果列表放在一个加了索引的临时表中
      • exists的效率优于distinct:
        • 当提交一对多表信息查询时,就可以避免在select中使用distinct
        • 因为RDBMS核心模块将在子查询的条件一旦满足后,立即返回结果,所以自带去重.以下两组SQL语句等价:
        SELECT distinct dept_no, dept_name from dept D, EMP E WHERE D.dept_no = E.dept_no;
        SELECT dept_no, dept_name from dept D WHERE EXISTS (SELECT 1 from emp E WHERE E.dept_no = D.dept_no);
      • exists适合外表的结果集小的情况
      • in适合内外表都很大的情况

使用示例

  • exists:
SELECT ID,NAME FROM A WHERE
EXISTS(SELECT * FROM B WHERE A.ID = B.AID)
  • SQL语句分解:
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
--->SELECT * FROM B WHERE B.AID=1有值返回TRUE所以有数据 SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回TRUE所以有数据 SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=3无值返回TRUE所以没有数据
  • 上面SQL语句等价于:
SELECT id, name from A WHERE id in (select aid from B)

总结

  • SQL中in, not in, exists, not exists的区别:

    • in:

      • 确定给定的值是否与子查询或者列表中的值匹配
      • in关键字选择与列表中任意一个值匹配的行
      • in关键字之后的项目必须用逗号隔开,并且括在括号中
    • not in:
      • 通过not in关键字引入的子查询也返回一列零值或更多值
    • exists:
      • 指定一个子查询,检测行的存在
      • 相当于两个集合的交集
      • exists后面可以是整句的查询语句 ,in后面只能是单列查询语句
    • not exists:
      • 相当于两个集合的差集
    • exists和not exists返回的结果类型是Boolean:
      • 如果子查询包含行:

        • exists返回TRUE
        • not exists返回FALSE

MyBatis框架中的条件查询!关键字exists用法的详细解析的更多相关文章

  1. 使用mybatis框架实现带条件查询-多条件(传入实体类)

    在实际的项目开发中,使用mybatis框架查询的时候,不可能是只有一个条件的,大部分情况下是有多个条件的,那么多个条件应该怎样传入参数: 思考:  需求:根据用户姓名(模糊查询),和用户角色对用户表进 ...

  2. 使用mybatis框架实现带条件查询-单条件

    之前我们写的查询sql都是没有带条件的,现在来实现一个新的需求,根据输入的字符串,模糊查询用户表中的信息 UserMapper.xml UserMapper.java 与jdbc的比较: 编写测试方法 ...

  3. 使用mybatis框架实现带条件查询-多条件(传入Map集合)

    我们发现我们可以通过传入javaBean的方式实现我们的需求,但是就两个条件,思考:现在就给他传入一个实体类,对系统性能的开销是不是有点大了. 现在改用传入Map集合的方式: 奥!对了,在创建map集 ...

  4. SSM-MyBatis-13:Mybatis中多条件查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...

  5. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  6. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  7. django-drf框架中排序和查询组件

    0910自我总结 django-drf框架中排序和查询组件 一查询相关 1.模糊查询 1.导入模块组件 from rest_framework.filters import SearchFilter ...

  8. mybatis框架中XxxxMaper.xml的文件

    我们知道在mybatis框架中,config.xml中会关联到许多的XxxxMapper的xml文件,这些文件又对应着一个个的接口,来观察下这些xml文件 从以下这个文件为例子: <?xml v ...

  9. C# 将Access中时间段条件查询的数据添加到ListView中

    C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Col ...

随机推荐

  1. DLL重定向处理

    说明 目前正在做的项目批次功能涉及第三方插件,而第三方插件需依赖4.* 版本的Newtonsoft.Json.dll,由于现有功能已经使用6.*版本的Newtonsoft.Json.dll,故采用了d ...

  2. Pycharm搜索导航之文件名、符号名搜索

    1.准备一个工程 向你的工程中添加一个Python文件,并输入一些源码,例如: 2.转到对应文件.类.符号 Pycharm提供的一个很强力的功能就是能够根据名称跳转到任何文件.类.符号所在定义位置. ...

  3. 鸿蒙 Android iOS 应用开发对比02

    个人理解,不抬杠 转载请注明原著:博客园老钟 https://www.cnblogs.com/littlecarry/ IOS 把界面抽象成 "控制" Controller:And ...

  4. .Net RabbitMQ实战指南——RabbitMQ相关概念介绍

    什么是消息中间件 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Queue Middl ...

  5. 实战|教你用Python玩转Mysql

    爬虫采集下来的数据除了存储在文本文件.excel之外,还可以存储在数据集,如:Mysql,redis,mongodb等,今天辰哥就来教大家如何使用Python连接Mysql,并结合爬虫为大家讲解. 前 ...

  6. Python3.6 的字典为什么会快

    作者:青南链接:https://zhuanlan.zhihu.com/p/73426505来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在Python 3.5(含)以 ...

  7. final 修饰符

    修饰属性,方法,类 1.修饰属性 属性只能被赋值一次 基本类型:值不能改变 引用类型:引用不可以被修改 2.修饰方法 表示方法不可以被重写,但可以被子类访问 3.修饰类 表示类不可以被继承 //fin ...

  8. 对抗性鲁棒性与模型压缩:ICCV2019论文解析

    对抗性鲁棒性与模型压缩:ICCV2019论文解析 Adversarial Robustness vs. Model Compression, or Both? 论文链接: http://openacc ...

  9. Ascend Pytorch算子功能验证

    Ascend Pytorch算子功能验证 编写测试用例 以add算子为例,测试脚本文件命名为:add_testcase.py.以下示例仅为一个简单的用例实现,具体算子的实现,需要根据算子定义进行完整的 ...

  10. MindSpore基准性能

    MindSpore基准性能 本文介绍MindSpore的基准性能.MindSpore网络定义可参考Model Zoo. 训练性能 ResNet 以上数据基于华为云AI开发平台ModelArts测试获得 ...