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 ...
随机推荐
- STM32关于多线程运行的疑问
我有一个疑问,如果 STM32在操作系统环境下 能够一个线程串口中断接收数据 另一个线程 继续进行其他的操作
- Log4j实战,依赖分析
背景 在项目中经常被log4j的各种依赖冲突搞的焦头烂额,久病成良医啊,在这里记录一下我对log4j的理解与分析 log4j 与 log4j2 log4j2是log4j的升级版,二者互不兼容,据说lo ...
- Go基础结构与类型05---程序运算
package main import ( "fmt" "math" ) func main() { /*加减乘除,求余*/ fmt.Println(" ...
- win系统下如何安装xgboost,开发环境是anaconda,以及这中间需要注意的问题
最近学到了xgboost,但是anaconda并没有这个环境只好自己安装了... 注: (1)并没有测试anaconda在2.x的版本下是如何安装的, 基本上应该是大同小类的,我的anaconda版本 ...
- SQL Server 动态创建表结构
需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...
- CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等
CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等 CVPR 2020中选论文放榜后,最新开源项目合集也来了. 本届CPVR共接收6656篇论文,中选1470篇,&q ...
- CVPR2020论文点评: AdderNet(加法网络)
CVPR2020论文点评: AdderNet(加法网络) 论文原文链接:https://arxiv.org/pdf/1912.13200.pdf 源码链接:https://github.com/hua ...
- GeforceRTX系列参数对比
GeforceRTX系列参数对比
- Mobileye 自动驾驶策略(二)
Mobileye 自动驾驶策略(二) 与多方都成功进行了合作,其中比较大型的合作包括法雷奥.百度和中国 ITS. 法雷奥是最近的的 Tier 1 合作伙伴,法雷奥和 Mobileye 签署协议,表示未 ...
- 教你在Kubernetes中快速部署ES集群
摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...