请大家帮忙解释一下嵌套查询中IN和Exists以及NOT EXISTS的用法?谢谢!
解决方案 »
- select查询return_root(o.proxy_number,0) root
- 参数log_archive_start与语句alter system archive log start的区别?
- ORACLE 与 SQL server2005 资源释放问题[就这么多分了]
- 人数统计脚本出错。请wildwave 或者其他高手帮忙看看
- 关于文件存储的问题
- 关天读Access数据的问题
- 求在ORACLE9i下查询树的叶子结点的SQL语句.在线等(......................................)
- 急,在线等的问题!怎么看ORACLE数据表的索引空间是否已满?
- 在oracle中能否得一个表所有这段,及字段的中文名称
- 求大神帮我看看这个存储过程?
- 求达到10万人的ORACLE数据库,ORACLE的性能如何优化,扣谢各位
- Oracle 的全文检索技术原理是怎样的?
Exists --检索到满足条件即退出NOT EXISTS --检索到不满足条件即退出
改成exist语句可以这样的
select * from tab1 where exists(select 1 from tab2 where tab1.col1=tab2.col2)
如果表tab2中的col2有索引的话就能提高效率.而第一条语句中用不到tab2中的索引
学生(学号,姓名,年龄,所在系)
课程(课程号,课程名,先行课)
选课(学号,课程号,成绩)
请帮忙解释一下下面的语句,谢谢!
1、求没有选修c2课程的学生
select 姓名 from 学生
where not exists (select * from 选课 where 学生.学号=学号 and 课程号='c2');
2、查询选修了全部课程的学生的姓名
select 姓名 from 学生
where not exists (select * from 课程 where not exists
(select * from 选课 where 学生.学号=学号 and 课程.课程号=课程号));
3、求至少选修了学号为“s2”的学生所选修的全部课程的学生学号和姓名
select 学号,姓名 from 学生
where not exists(select * from 选课 选课1 where 选课1.学号='s2' and not exists
(select * from 选课 选课2 where 学生.学号=选课2.学号 and 选课2.课程号=选课1.课程号)
不过exist的确比in效率高多了。
其实是因为In是内驱动,而exist是外驱动的。
如:
select ename
from emp e
where mgr in (select empno from emp where ename = 'KING');
是先执行select empno from emp where ename = 'KING'
等效于:
select e1.ename from emp e1,(select empno from emp where ename = 'KING') e2
where e1.mgr = e2.empno;
而exist不同
select ename from emp e
where exists (select 0 from emp where e.mgr = empno and ename = 'KING');
其执行类似于下面的pl/sql:
set serveroutput on;
declare
l_count integer;
begin
for e in (select mgr,ename from emp) loop
select count(*) into l_count from emp
where e.mgr = empno and ename = 'KING';
if l_count != 0 then
dbms_output.put_line(e.ename);
end if;
end loop;
end;
这样用exists话就可以使用索引。数据量大一点的时候就体现出效率。
但不能说exist就比in好。
如果select 0 from emp where e.mgr = empno and ename = 'KING'的数据量很少,还是in效率更高。