当前位置:   article > 正文

oracle中exists和not exists用法(包含经典例题:查看学了所有课程的同学的信息的通俗易懂解释)_oracle not exists

oracle not exists

1.基本概念:

  1. select * from A where not exists(select * from B where A.id = B.id);
  2. 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.查看学了所有课程的同学的信息。

解析: 学了所有课程的同学的信息,即这些同学没有一门课程没有学,换成数学语言,没有选一门课的否定。

  1. --方便大家理解,拆分开来
  2. --课程号里面的课程没有在成绩表中的课程号匹配到的,则输出。
  3. --那么这里面输出的就是课程号里面为没有一人选的课程号。
  4. select * from kcb where not exists
  5. (select * from cjb
  6. where kcb.kch=cjb.kch);
  7. --最终sql语句
  8. --输出的为学生表中不存在没有一人选的课程号,
  9. --即输出的为没有一人选的课程号的否定
  10. --即输出的为所有人都选的课程号
  11. select * from xsb where not exists
  12. (select * from kcb where not exists
  13. (select * from cjb
  14. where cjb.kch = kcb.kch
  15. 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/479950
推荐阅读
相关标签
  

闽ICP备14008679号