oracle中exists和not exists用法(包含经典例题:查看学了所有课程的同学的信息的通俗易懂解释)
中“exists(xxx)”的用处是进行true、false的判断,看xxx所代表的语句要查的记录是否存在,存在则取这条数据,不存在则不取。解析:查看学了 "110102"号的同学学习的课程(替换所有课程) 的同学的信息 ,去除110102号学生。解析: 学了所有课程的同学的信息,即这些同学没有一门课程没有学,换成数学语言,没有选一门课的否定。内查询返回true,则外查询的这行数据保留,反之内查询
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
更多推荐


所有评论(0)