比如 a,b 关联列为 a.id = b.id,现在要取 a 中的数据,其中id在b中也存在:select * from a where exists(select 1 from b where b.id = a.id)或者:现在要取 a 中的数据,其中id在b中 不存在:select * from a where not exists(select 1 from b where a.id = b.id)原文:https://www.cnblogs.com/lixiuming521125/p/14927961.html
转需:EXISTS 指定一个子查询,检测 行 的存在。语法: EXISTS subquery参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。NOT EXISTS 的作用与 EXISTS 正好相反EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结...
下面的testa表没有数据,dept表有数据。直接select,有数据就会有结果集。 plsql的exists用于判断子查询是否有结果集返回,“exists (子查询)”子查询只要结果集有数据,则exists判断为true,否则为false,不管结果集数据是什么,是1啊是2啊或者很多列,只要结果集不为0条数据,就是true。select*from EMP twhereexists (select1from DEPT d where d.deptno = t.deptno);
select* exists前面可以加 not,就是not exists 。ex...
--条件比较
/*
=,!=,<>,<,>,<=,>=,
any,some,all
is null,is not null
between x and y
in(list),not in(list)
exists(sub-query)
like _ ,%,escape ‘\‘ _\% escape ‘\’
*/--any some 只要满足其中的任何一个即可
SELECT E.ENAME ,E.JOB,E.SAL FROM EMP E WHERE E.SAL > ANY(1000,2000,3000)
SELECT E.ENAME ,E.JOB,E.SAL FROM EMP E WHERE E.SAL > SOME(1000,2000,3000)--all 满足所有的
SELECT E.ENAME ,E....
我把以上两个表的数据清除掉,重新插入数据:
truncate table ljn_test1;
truncate table ljn_test2;
insert into ljn_test1 values(1);
insert into ljn_test1 values(2);
insert into ljn_test1 values(3);
insert into ljn_test2 values(2);
insert into ljn_test2 values(null);
commit;
然后再次执行两个SQL:
select * from ljn_test1 where not exists (select 1 from ljn_test2 where ljn_test1.col = ljn_test2.col);
...
oracle 优化or 更换in、exists、union几个字眼。测试没有问题!
根据实际情况选择相应的语句是。假设指数,or全表扫描,in 和not in 应慎用。否则会导致全表扫描。 select *
from T_Pro_Product
where bar_code = nnnmmm
or name = nnnmmm
or no = nnnmmm;select *from T_Pro_Productwhere nnnmmm in (bar_code, name, no)--忧化select *from T_Pro_Product t1where exists(select 1from T_Pro_Product tt1where t1....
num number;
begin select count(1) into num from all_tables where TABLE_NAME = ‘TEST2‘; if num=1 then execute immediate ‘drop table TEST2‘; end if;
end; 需要用个变量去存all_tables输出的结果,然后再判断2)SQL SERVER下的IF .... BEGIN ... END到了Oracle下变成了IF .... THEN ... END IF;而且每一句都要加个; 这个好像还是必须的
3)两个语句块之间要用/来分开这样才可以执行Oracle下的IF EXISTS()标...
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。 not exists:做NL,对子查询先查,有个虚表,有确定值,所以就算子查询有NULL最终也有值返回 not in:做hash,对子查询表建立内存数组,用外表匹配,那子查询要是有NULL那外表没的匹配最终无值返回。 一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小...
http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html
有两个简单例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。oracle中的exists 和not exists 用法详解标签...
和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
请注意 1)句中的有颜色字体的部分 ,理解其含义;
其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相...
博文来源( in与exists语句的效率问题):http://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html
(一)
exists (sql 返回结果集为真) 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.AID 1 SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)2 执行结果为3 1 A14 2 A25 原因...
1、IN和EXISTS
IN语句:SELECT *
FROM hr.employees t1
WHERE t1.employee_id IN (SELECT t2.employee_idFROM hr.job_history t2 );EXISTS语句:SELECT *
FROM hr.employees t1
WHERE EXISTS (SELECT 1FROM hr.job_history t2WHERE t2.employee_id = t1.employee_id ); 可以看到两者的结果是一样的,这意味着两个查询都能够满足我们业务的需求。但是问题来了,那个以查询更快呢?
...
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。exists 用法:请注意 1)句中的有颜色字体的部分 ,理解其含义;其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于“select 1 from T1,T...
对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种
第一种是最常用的,判断count(*)的值是否为零,如下declare v_cnt number;begin select count(*) into v_cnt from T_VIP where col=1; if v_cnt = 0 then dbms_output.put_line(‘无记录‘); end if;end;首先这种写法让人感觉很奇怪,明明只需要知道表里有没有记录,却去统计了全表的记录数。这种方式对于小表而言可...
有两个简单例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
请注意 1)句中的有颜色字体的部分 ,理解其含义;
其中 “select 1 from T2 where T1...