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

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与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
- 如果子查询包含行:
- in:
MyBatis框架中的条件查询!关键字exists用法的详细解析的更多相关文章
- 使用mybatis框架实现带条件查询-多条件(传入实体类)
在实际的项目开发中,使用mybatis框架查询的时候,不可能是只有一个条件的,大部分情况下是有多个条件的,那么多个条件应该怎样传入参数: 思考: 需求:根据用户姓名(模糊查询),和用户角色对用户表进 ...
- 使用mybatis框架实现带条件查询-单条件
之前我们写的查询sql都是没有带条件的,现在来实现一个新的需求,根据输入的字符串,模糊查询用户表中的信息 UserMapper.xml UserMapper.java 与jdbc的比较: 编写测试方法 ...
- 使用mybatis框架实现带条件查询-多条件(传入Map集合)
我们发现我们可以通过传入javaBean的方式实现我们的需求,但是就两个条件,思考:现在就给他传入一个实体类,对系统性能的开销是不是有点大了. 现在改用传入Map集合的方式: 奥!对了,在创建map集 ...
- SSM-MyBatis-13:Mybatis中多条件查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- django-drf框架中排序和查询组件
0910自我总结 django-drf框架中排序和查询组件 一查询相关 1.模糊查询 1.导入模块组件 from rest_framework.filters import SearchFilter ...
- mybatis框架中XxxxMaper.xml的文件
我们知道在mybatis框架中,config.xml中会关联到许多的XxxxMapper的xml文件,这些文件又对应着一个个的接口,来观察下这些xml文件 从以下这个文件为例子: <?xml v ...
- C# 将Access中时间段条件查询的数据添加到ListView中
C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Col ...
随机推荐
- 从马尔可夫模型(Markov Model)到隐马尔可夫模型(Hidden Markov Model)
1.参考资料: 博客园 - 刘建平随笔:https://www.cnblogs.com/pinard/p/6945257.html 哔站up主 - 白手起家的百万富翁:https://www.bili ...
- GO学习-(6) Go语言基础之运算符
Go语言基础之运算符 运算符用于在程序运行时执行数学或逻辑运算. 运算符 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算数运算符 运算符 描述 + 相加 - ...
- Python+Selenium学习笔记18 - 不开启浏览器测试
运行脚本时间比较长时可以不打开浏览器测试,这样在测试运行时,电脑还是可以用作其他操作的. 只需要在运行脚本上加上下面代码的678行即可 1 # coding = utf-8 2 3 from sele ...
- 云ERP真的已经玩不转了吗?
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 注:以下云ERP特指Saas ERP,非指ERP系统部署在云端. 不得不说,如今市场对传统ERP的接受度要远比云ERP高得多,95%的中大型 ...
- 固态LiDAR,半固态混合LiDAR,机械LiDAR
固态LiDAR,半固态混合LiDAR,机械LiDAR 1. APD/SPAD 2轴MEMS扫描镜+ SPAD图像传感器在混合固态LiDAR中的应用 APD的工作模式分为线性模式和盖革模式两种.当APD ...
- ADAS超声波雷达
ADAS超声波雷达 在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到"滴滴滴"的声音,这些声音就是根据超声波雷达的检测距离给司机的反馈信息. 倒车雷达系统,英文全称为REVERS ...
- 目标检测中特征融合技术(YOLO v4)(下)
目标检测中特征融合技术(YOLO v4)(下) ASFF:自适应特征融合方式 ASFF来自论文:<Learning Spatial Fusion for Single-Shot Object D ...
- 配置NFS共享, Linux与Linux的共享
• Network File System,网络文件系统 – 用途:为客户机提供共享使用的文件夹 – 协议:NFS(TCP/UDP 2049).RPC(TCP/UDP 111) 只读的NFS共享 服务 ...
- CSS基础知识及其基本语法
一.什么是CSS CSS 是层叠样式表( Cascading Style Sheets ) 的简称. 有时我们也会称之为CSS 样式表或级联样式表. CSS 也是一种标记语言 CSS 主要用于设置HT ...
- git 认证问题之一的解决 : http ssh 互换
场景 使用git 我们经常会遇到 认证失败的情况,有时候确实是搞错了用户名或者密码,还有的时候及时用户名密码用对了也还是认证失败. 此时, 就有可能是下面这个情况. 没有配置 ssh 秘钥, 而用了 ...