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用法(包含经典例题:查看学了所有课程的同学的信息的通俗易懂解释)相关推荐

  1. oracle分组聚合查询,Oracle中分组查询group by用法规则解析

    本篇文章小编给大家分享一下Oracle中分组查询group by用法规则解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Oracle中group by ...

  2. Oracle中INSTR和SUBSTR的用法

    2019独角兽企业重金招聘Python工程师标准>>> Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, ...

  3. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法

    在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方 ...

  4. oracle8i substr,Oracle中INSTR和SUBSTR的用法

    Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到 ...

  5. Oracle中rownum的说明及用法总结

    Oracle中rownum的说明及用法总结 一.rownum的说明 rownum是Oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rown ...

  6. (转)oracle中的CURRVAL和NEXTVAL用法

    转自:http://blog.csdn.net/qianyiyiding/article/details/51592689 1.什么是sequence?其作用是什么? 在Oracle数据库中,什么是序 ...

  7. oracle中SQL语句ge的用法,Oracle中SQL语句的几种用法

    在诊断数据库系统性能的过程中,总会涉及到跟踪效率低下的SQL语句,Oracle数据库10g包含一种新的实用程序trcsess,它可以让您基于会话ID或模块名称之类的条件,有选择地从大量跟踪文件中抽取出 ...

  8. oracle if后面为null,Oracle中NVL2 和NULLIF的用法

    NULL指的是空值,或者非法值. NVL (expr1, expr2)->expr1为NULL,返回expr2:不为NULL,返回expr1.注意两者的类型要一致 NVL2 (expr1, ex ...

  9. oracle中 rownum和rowid的用法

    1.ROWNUM的使用--TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...

最新文章

  1. 层次聚类python实现_Python机器学习——Agglomerative层次聚类
  2. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
  3. 为何优秀的程序员不断离开?| 畅言
  4. Google退出中国,谁的压力最大?
  5. UVA 540 Team Queue
  6. 一小时精通SVN版本控制 之五 团队协作开发
  7. vscode插件离线下载vsix文件
  8. 【人月神话】01 人月神话
  9. 建议Mac M1关闭虚拟内存(交换内存 swap memory)
  10. Flash:形变动画的制作
  11. bzoj3029 守卫者的挑战
  12. 2023除夕倒计时~HTML代码
  13. 六字诀教你辨肾脏是否健康
  14. 案例:京东登录页面css创建
  15. 一天半的黄山之行总结
  16. 前端学习笔记--注册表单
  17. 菜鸟程序员成长史 --记 Github 1000+ contributions
  18. 晶振01——晶振分类和无源晶振的设计
  19. DB2 查看表占用空间大小
  20. 人工智能在医疗保健中的应用与创新

热门文章

  1. Java 集合 add 方法重复添加问题
  2. 长短信PDU编码说明
  3. nodejs_promise用法
  4. 小程序获取手机号及手机号解密
  5. Python小程序:你看?这千年难遇的雪景——简直“美到犯规”【满屏雪花飞舞】
  6. PPT如何更换全部背景?
  7. 求1000的阶乘c语言编程,[原创] 1000的阶乘的程序代码,好题大家分享
  8. 钱兔无量!年终锦鲤大礼包欢迎你来拿!
  9. 艾尔之光服务器维护,《艾尔之光》8月11日更新内容 新增水母氛围礼包
  10. 批处理中for的用法