oracle中exists和not exists用法(包含经典例题:查看学了所有课程的同学的信息的通俗易懂解释)
1.基本概念:
select * from A where not exists(select * from B where A.id = B.id);
select * from A where exists(select * from B where A.id = B.id);
exists和not exists概念、用法相反,这里举exists为例讲解:
1、首先执行外查询select * from A,然后从外查询的数据取出一条数据传给内查询。
2、内查询执行select * from B,外查询传入的数据和内查询获得的数据根据where后面的条件做匹对,如果存在数据满足A.id=B.id则返回true,如果一条都不满足则返回false。
3、内查询返回true,则外查询的这行数据保留,反之内查询返回false,则外查询的这行数据不显示。外查询的所有数据逐行查询匹对。
注意:exists或not exists的执行顺序是先执行外查询再执行内查询。这和我们学的子查询概念冲突。
2.案例分析:
1.查看学了所有课程的同学的信息。
解析: 学了所有课程的同学的信息,即这些同学没有一门课程没有学,换成数学语言,没有选一门课的否定。
--方便大家理解,拆分开来
--课程号里面的课程没有在成绩表中的课程号匹配到的,则输出。
--那么这里面输出的就是课程号里面为没有一人选的课程号。
select * from kcb where not exists
(select * from cjb
where kcb.kch=cjb.kch);--最终sql语句
--输出的为学生表中不存在没有一人选的课程号,
--即输出的为没有一人选的课程号的否定
--即输出的为所有人都选的课程号
select * from xsb where not exists
(select * from kcb where not exists
(select * from cjb
where cjb.kch = kcb.kch
and cjb.xm = xsb.xm));
思考题:查询和"110102"号的同学学习的课程完全相同的其他同学的信息
解析:查看学了 "110102"号的同学学习的课程(替换所有课程) 的同学的信息 ,去除110102号学生。
3.exists和in比较:
使用exists:
select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
使用exists写法时,其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于“select 1 from T1,T2 where T1.a=T2.a”,
“select * from T1 where exists(xxx)” 中“exists(xxx)”的用处是进行true、false的判断,看xxx所代表的语句要查的记录是否存在,存在则取这条数据,不存在则不取。
也由于exists中xxx部分只作为判断使用,所以会写成select 1 而不是 select * ,来提高效率。
使用in:
select * from T1 where T1.a in (select T2.a from T2) ;
区别:
exists子句不在乎返回什么,而是在乎有没有结果返回,其子句返回的结果本身无意义。只要exists引导的子句有结果集返回,那么exists的条件就成立。
而exists与in最大的区别在于in引导的子句只能返回一个字段,比如:
SELECT * FROM AM_USER WHERE USERNAME IN (SELECT 1,2,3 from AM_ROLE WHERE NAME = 'admin')
in子句返回了三个字段,这是不正确的,但exists允许。而in只允许有一个字段返回,在1,2,3中随意去除两个即可。
效率比较:
T1数据量小,而T2数据量非常大时,使用exists 的查询效率高。
T1数据量非常大,而T2数据量小时,使用in 的查询效率高。
参考:
1.真正理解exists 和not exists_别喷了我不会的博客-CSDN博客_not exists
2.Oracle-exists用法简单搞懂_ShyTan的博客-CSDN博客_oracle exists
3.sql中exists用法_安夜的cookie的博客-CSDN博客_sqlexists
4.Oracle Exists用法_大鹏_James的博客-CSDN博客_oracle exists
oracle中exists和not exists用法(包含经典例题:查看学了所有课程的同学的信息的通俗易懂解释)相关推荐
- oracle分组聚合查询,Oracle中分组查询group by用法规则解析
本篇文章小编给大家分享一下Oracle中分组查询group by用法规则解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Oracle中group by ...
- Oracle中INSTR和SUBSTR的用法
2019独角兽企业重金招聘Python工程师标准>>> Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, ...
- day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法
在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方 ...
- oracle8i substr,Oracle中INSTR和SUBSTR的用法
Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到 ...
- Oracle中rownum的说明及用法总结
Oracle中rownum的说明及用法总结 一.rownum的说明 rownum是Oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rown ...
- (转)oracle中的CURRVAL和NEXTVAL用法
转自:http://blog.csdn.net/qianyiyiding/article/details/51592689 1.什么是sequence?其作用是什么? 在Oracle数据库中,什么是序 ...
- oracle中SQL语句ge的用法,Oracle中SQL语句的几种用法
在诊断数据库系统性能的过程中,总会涉及到跟踪效率低下的SQL语句,Oracle数据库10g包含一种新的实用程序trcsess,它可以让您基于会话ID或模块名称之类的条件,有选择地从大量跟踪文件中抽取出 ...
- oracle if后面为null,Oracle中NVL2 和NULLIF的用法
NULL指的是空值,或者非法值. NVL (expr1, expr2)->expr1为NULL,返回expr2:不为NULL,返回expr1.注意两者的类型要一致 NVL2 (expr1, ex ...
- oracle中 rownum和rowid的用法
1.ROWNUM的使用--TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...
最新文章
- 层次聚类python实现_Python机器学习——Agglomerative层次聚类
- 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
- 为何优秀的程序员不断离开?| 畅言
- Google退出中国,谁的压力最大?
- UVA 540 Team Queue
- 一小时精通SVN版本控制 之五 团队协作开发
- vscode插件离线下载vsix文件
- 【人月神话】01 人月神话
- 建议Mac M1关闭虚拟内存(交换内存 swap memory)
- Flash:形变动画的制作
- bzoj3029 守卫者的挑战
- 2023除夕倒计时~HTML代码
- 六字诀教你辨肾脏是否健康
- 案例:京东登录页面css创建
- 一天半的黄山之行总结
- 前端学习笔记--注册表单
- 菜鸟程序员成长史 --记 Github 1000+ contributions
- 晶振01——晶振分类和无源晶振的设计
- DB2 查看表占用空间大小
- 人工智能在医疗保健中的应用与创新