网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.在非归档模式下如何更改数据文件.
.sendmail如何允许某个地址邮件转.
.Oracle10g + Solaris9 for x86 +.
.Oracle8网站应用简介(NT+IIS+AS.
.核心模块.
.案例学习Oracle错误:ORA-00904.
.ORACLE在HP-UX下的系列问题处理(.
.Linux多重引导器.
.监控当前并行查询运行状况脚本.
.欧盟同意甲骨文58.5亿美元收购Si.
.资源管理: 图形+数据.
.ExactPapers Oracle 1Z0-501 200.
.Qmail如何做域名伪装.
.关于分布式oracle中database lin.
.XML 与 XML DB 和 ODP.NET 结合使.
.简单介绍Oracle数据库去除别名的.
.Oracle数据操作和控制语言详解 (.
.ORACLE备份&恢复案例--ORACLE BA.
.ORACLE学习笔记--性能优化一.
.oracle基本概念和术语.

理解NULL是如何影响IN和EXITS语句的

发表日期:2008-2-9



  从表面上看,IN和EXITS的SQL语句是可互换和等效的。然而,它们在处理UULL数据时会有很大的差别,并导致不同的结果。问题的根源是在一个Oracle数据库中,一个NULL值意味着未知变量,所以操作NULL值的比较函数的结果也是一个未知变量,而且任何返回NULL的值通常也被忽略。 例如,以下查询都不会返回一行的值:
  
  select 'true' from dual where 1 = null;
  
  select 'true' from dual where 1 != null;
  
  只有IS NULL才能返回true,并返回一行:
  
  select 'true' from dual where 1 is null;
  
  select 'true' from dual where null is null;
  
  当你选择使用IN,你将会告诉SQL选择一个值并与其它每一值相比较。假如NULL值存在,将不会返回一行,即使两个都为NULL。
  
  select 'true' from dual where null in (null);
  
  select 'true' from dual where (null,null) in ((null,null));
  
  select 'true' from dual where (1,null) in ((1,null));
  
  一个IN语句在功能上相当于 = ANY语句:
  
  select 'true' from dual where null = ANY (null);
  
  select 'true' from dual where (null,null) = ANY ((null,null));
  
  select 'true' from dual where (1,null) = ANY ((1,null));
  
  当你使用一个EXISTS等效形式的语句,SQL将会计算所有行,并忽略子查询中的值。
  
  select 'true' from dual where exists (select null from dual);
  
  select 'true' from dual where exists (select 0 from dual where null is null);
  
  IN 和EXISTS在逻辑上是相同的。IN语句比较由子查询返回的值,并在输出查询中过滤某些行。EXISTS语句比较行的值,并在子查询中过滤某些行。对于NULL值的情况,行的结果是相同的。
  
  select ename from emp where empno in (select mgr from emp);
  
  select ename from emp e where exists (select 0 from emp where mgr = e.empno);
  
  然而当逻辑被逆向使用,即NOT IN 及NOT EXISTS时,问题就会产生:
  
  select ename from emp where empno not in (select mgr from emp);
  
  select ename from emp e where not exists (select 0 from emp where mgr =
  
  e.empno );
  
  NOT IN 语句实质上等同于使用=比较每一值,假如测试为FALSE或者NULL,结果为比较失败。例如:
  
  select 'true' from dual where 1 not in (null,2);
  
  select 'true' from dual where 1 != null and 1 != 2;
  
  select 'true' from dual where (1,2) not in ((2,3),(2,null));
  
  select 'true' from dual where (1,null) not in ((1,2),(2,3));
  
  这些查询不会返回任何一行。第二个查询语句更为明显,即 1 != null ,所以整个WHERE都为false。然而这些查询语句可变为:
  
  select 'true' from dual where 1 not in (2,3);
  
  select 'true' from dual where 1 != 2 and 1 != 3;
  
  你也可以使用NOT IN查询,只要你保证返回的值不会出现NULL值:
  
  select ename from emp where empno not in (select mgr from emp where mgr is not
  
  null );
  
  select ename from emp where empno not in (select nvl(mgr,0) from emp);
  
  通过理解IN, EXISTS, NOT IN,以及NOT EXISTS之间的差别,当NULL出现在任一子查询中时,你可以避免一些常见的问题。
上一篇:学在oracle数据库中插入特殊符号 人气:649
下一篇:Oracle SQLCODE/SQLERRM 的应用 人气:1148
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐