哪位达人能介绍一下exists和not exists用法(sql)最好能举个例子我看网上说not exists select * from table where a=1 or b=2;只要a=1成立,就不会查询b=2了那如果or 换成 and呢?还有人说not exists是个双重否定.请牛人指教.
解决方案 »
- 求助,ORACLE语句的问题
- win7 下oracle 11g登录错误
- 用delphi的ado连接oracle却找不到我写的存储过程?
- Oracle中,date 型数据的比较问题
- oracle 10g的表数据输入有可视化的界面吗?
- 谁知道PL/SQL中如何判断一个变量是否是"YYYY/MM"形式?
- ORA-06550: 第 2 行, 第 7 列: PLS-00201: 必须声明标识符 'INSERT_DATA' ORA-06550: 第 2 行, 第 7
- 将一个表中某字段多出的值写到另一个表中,脚本怎么写才正确?(提供了SQL Server的思路,Oralce的如何写)
- 如何获取ORACLE的树中的 章节 的信息
- oracle 能否导入的时候不覆盖原来的数据,插入数据?
- oracle 如何灵活的处理不包含的关系
- 关于oracle游标的问题。
exists 存在 和not exists 不存在
先把sql写成in ,not in ,然后加个where条件就变成 exists和not exists
你说的那个在高级语言中都有的,教什么忘了,优化的结果
not exists (sql 不返回结果集为真)
你的例子就可以
not exists 判断后面的select语句不返回结果集
你例子中,因为是Or,如果a=1返回,那么已经不满足,or后面当然也没有必要执行了
如果and,当然要前后都判断,才能知道是否能够返回结果集
not exists (sql 不返回结果集为真)
如下:
表A
ID NAME
1 A1
2 A2
3 A3表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3表A和表B是1对多的关系 A.ID => B.AIDSELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
1 A1
2 A2
原因可以按照如下分析
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
3 A3
===========================================================================
EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)
很多方面的书
大家可以去看看
http://www.51cnnet.net
select name from student where sex = 'm' and exists(select 1 from grade where ...) ,只要
exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
select name from student where sex = 'm' and in (select 1,2,3 from grade where ...)
,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。而not exists 和not in 分别是exists 和 in 的 对立面,就不用在说了吧?!
不知道你看懂了没有 ?希望对你有用。