赞
踩
- 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的执行顺序是先执行外查询再执行内查询。这和我们学的子查询概念冲突。
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号学生。
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 * ,来提高效率。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。