|
EMPNO ENAME Select * from t1 where id=1 or id=2 orid=3 or id=NULL; 7521 WARD 8888 Dave 我们向emp 表里插入一些值:
IN在逻辑上实际上就是对给定的成员聚集或者子查问结果集进行逐条的断定. 7499 ALLEN -------------------- 先看看exists 的履行进程: 使用exists 不受null 的影响。 当初看一下咱们之前使用not in 查不到结果,但用not exits 却能够查到: ------------------------------------------------- ----------------- |
7900 JAMES 共事说查询碰到一个奇异的事,2个表进行not in 操作没有返回结果,畸形情形下应当是有返回的。 SQL> selectempno,ename from emp where job not in (select job from emp1);
实际执行的命令等价于: SQL> selectempno,皇冠平台开户,ename from emp where job in(select job from emp1); |
a != NULL |
a IS NULL forxin(select*fromt1) UNKNOWN EMPNO ENAME 这样当我们的X.job 为NULL 时,满意条件,输出了Dave 的记载。 这里我们只插入了empno和ename,其余为空。 下面进行2张表的的操作: | ||||||
|
EMPNO ENAME
TRUE TRUE Connected. select*fromt1whereexists(select*fromt2wheret2.col1=t1.col1) 7876 ADAMS 2.2 IN 和 NOT IN 判定说明SQL> insertinto emp(empno,ename) values(8888,'Dave'); a = NULL 7788 SCOTT Dave的记录 存在与emp 表,不存在emp1表。 7499 ALLEN FALSE 7654 MARTIN 7844 TURNER 7521 WARD |
DBA 超级群2:151508914 DBA9群:102954821 聊天 群:40132017(满) |
7902 FORD a IS NOT NULL | |||||||
|
7782 CLARK exists(select*fromt2wheret2.col1=x.col1)返回是一个布尔值,not exists只是对exists子句返回对布尔值取非,这与in跟not in是有实质差别的(not in是对in表白式取非,转换成另一种等价抒发式) shows examples of various evaluations involving nulls inconditions. If the conditions evaluating toUNKNOWNwere used in aWHEREclauseof aSELECTstatement, then no rows would be returned for that query. SQL>select empno,ename from emp A where notexists ( SELECT * FROM emp1 Bwhere B.job = A.job); a != NULL --加群需要在备注说明Oracle表空间和数据文件的关系,否则谢绝申请 EMPNO ENAME NOT IN 的逻辑关联可以懂得为:NOT (X=Y OR N=M) 等价于 X,皇冠足球网址!=Y AND N,皇冠足球投注!=M。那么: Select * from t1 where id=1or id=2 or id=3 8888 Dave | |||||||||
|
UNKNOWN Table 3-20 ConditionsContaining Nulls 7934 MILLER 10 14 rowsselected. |
SQL> descemp | ||||||||
|
DEPTNONUMBER(2) no rowsselected 7654 MARTIN a IS NULL 8888 Dave 10 Condition |
14 rowsselected. Table created. -------------------- 换成exists 进行测试: | ||||||||
|
Select * fromt1 where id !=1 and id!=2 and id ,皇冠网!=3 and id !=NULL -------------------- DBA6 群:158654907(满)DBA7 群:69087192(满) DBA8 群:172855474 7900 JAMES |
7782 CLARK 7566 JONES 相称于: 7839 KING 10 |
Value of A -------------------- 7566 JONES 从上面的逻辑,也可以看出EXISTS语句实际上是通过轮回外部查询的结果集,来过滤出合乎子查询尺度的结果集。于是外部查询的结果集数目对该语句执行性能影响最大,故如果外部查询的结果集数量宏大,用EXISTS语句的机能也不必定就会好良多。 |
7698 BLAKE 7902 FORD |
7698 BLAKE ------------------------------------------------------------------------------------------------------- 二.问题剖析 | |||||
|
HIREDATE DATE 如:select * from t1 where id in(1,2,3,NULL); Commitcomplete. 联机文档上的说明如下: -------------------- SQL>select empno,ename from emp A where exists( SELECT * FROM emp1 B where B.job = A.job); EMPNO ENAME DBA 超级群:63306533(满);DBA4 群:83829929(满) DBA5群: 142216823(满) 7369 SMITH -------------------- A condition that evaluates toUNKNOWNacts almost likeFALSE.For example, aSELECTstatement with a condition in theWHEREclausethat evaluates toUNKNOWNreturns no rows. However, a condition evaluatingtoUNKNOWNdiffers fromFALSEin that further operations onanUNKNOWNcondition evaluation will evaluate toUNKNOWN. Thus,NOTFALSEevaluatestoTRUE, butNOTUNKNOWNevaluates toUNKNOWN. SALNUMBER(7,2) 将emp 表复制一份: forxin(select*fromempA ) --这里没有返回结果集,正常情况下应该反回我们之前insert 的dave。 NULL 根据上面的表,Id=NULL 为UNKNOWN。 那么无奈查询出列值为Null的记录。即等价于: 一.问题重现Blog: http://blog.csdn.net/tianlesoftware NameNull? Type FALSE NULL MGRNUMBER(4) EMPNO NOT NULLNUMBER(4) SQL> selectempno,ename from emp where empno not in (select empno from emp1); |
JOBVARCHAR2(9) | ||||||||
2.3 EXISTS 解释UNKNOWN Evaluation Weibo:http://weibo.com/tianlesoftware 换成非null 字段就能正常显示了。 7839 KING 7934 MILLER a IS NOT NULL | |||||||||
|
1 row created. 依据上面的NULL 表,id!=NULL 的成果为UNKNOWN。 那么该值为假,所以不论前面的前提虚实与否,全部逻辑断定为假,所以不返回任何记载。 2.1 Null 阐明
NULL SQL> connscott/tiger; NULL IN功效上相当于 =ANY 的操作,而NOT IN 功能上相称于 !=ALL 的操作。 UNKNOWN a = NULL | |||||||||
| (责任编辑:admin) |
