Oracle-where exists()、not exists() 、in()、not in()用法以及效率差异

0、exists() 用法:

select * from T1 where exists(select 1 from T2 where T1.a=T2.a)

其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,

相当于“select 1 from T1,T2  where T1.a=T2.a”

但是,如果单独执行括号中的这句话是会报语法错误的,这也是使用exists需要注意的地方。

“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,where 条件成立。

PS:not exists()  正好相反

select name from employee where not exists (select name from student)

1、in() 的用法:

select * from T1 where T1.a in (select T2.a from T2)

这里的“in”后面括号里的语句搜索出来的字段的内容一定要与where后指定的字段相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用的写法就可以这样:

select * from T1 where T1.ticketid in (select T2.id from T2)

2、 “exists”和“in”的效率问题

0)select name from employee where name not in (select name from student)

select name from employee where not exists (select name from student)

第一句SQL语句的执行效率不如第二句。

通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。

Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。

这也就是使用EXISTS比使用IN通常查询速度快的原因。

1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a)

T1数据量小而T2数据量非常大时,T1<<T2 时,  exists()的查询效率高。

2) select * from T1 where T1.a in (select T2.a from T2)

T1数据量非常大而T2数据量小时,T1>>T2 时,in() 的查询效率高。

参考:https://www.cnblogs.com/zhengshuheng/p/4749121.html

原文地址:https://www.cnblogs.com/Formulate0303/p/12606787.html

时间: 2024-11-04 04:17:48

Oracle-where exists()、not exists() 、in()、not in()用法以及效率差异的相关文章

Oracle下的IF EXISTS()

妈蛋..作为一个使用了SQL SERVER有4 5年的程序猿,开始用Oracle真他妈不习惯.写法真他妈不一样.比如像写个像IF EXISTS(SELECT * FROM sys.tables WHERE name = 'xxxx') BEGIN DROP TABLE XXXX END这样的语句,发现在ORACLE下完全两码事.妹的..于是百度啊.最后发现 1)Oracle下没有IF EXISTS(),Oracle下要实现IF EXISTS()要这么写 declare num number; b

Oracle中没有 if exists(...)

对于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;首先这种写法让人感觉很奇怪,明明只

Oracle中没有 if exists(...)的解决方法

http://blog.csdn.net/hollboy/article/details/7550171对于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_o

oralce中exists not exists in not in对于NULL的处理

1.   先讨论 in 与 not in中存在NULL的情况, sql语句如下: 1 select 1 result1 from dual where 1 not in (2, 3); 2 3 4 select 1 result2 from dual where 1 not in (2, 3, null); 5 6 7 select 1 result3 from dual where 1 in (2, 3, null, 1); 8 9 10 select 1 result4 from dual

sql中exists,not exists的用法

转 sql中exists,not exists的用法 exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:  select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成"select 2 from grade where ...",那么返回

sql中in/not in 和exists/not exists的用法区别

1:首先来说in/not in的用法 in/not in是确定单个属性的值是否和给定的值或子查询的值相匹配: select * from Student s where s.id in(1,2,3); <pre name="code" class="sql"> select * from Student s where s.name in( select distinct name from Project) 2:现在来说exists/not exist

Oracle中start with...connect by子句的用法

connect by 是结构化查询中用到的,其基本语法是:select - from tablename start with 条件1connect by 条件2where 条件3;例:select * from tablestart with org_id = 'HBHqfWGWPy'connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id,parent_id那么通过表示每一条记录的parent是谁

Oracle中INSTR、SUBSTR和NVL的用法

Oracle中INSTR.SUBSTR和NVL的用法 INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 默认查找顺序为从左到右.当起始位置为负数的时候,从右边开始查找.若起始位置为0,返回值为0. SELECT INSTR('CORPORATE FLOOR', 'OR', 0, 1) FROM DUAL; 返回值为0 SELECT INSTR('CORPORATE FLOOR', 'OR', 2, 1)

oracle开发系列(三)exists&amp;not exists用法(10g)

注:以下内容适合 初学oracle开发或者java等开发者,高手略过 一 exists&in 以下三个语句  功能都是从 iodso.qos_hisentry_sheet_jtext_td 里面找到  sheet_no在  iodso.qos_hisentry_sheet_td表 arch_time 1天时间里面的单子. iodso.qos_hisentry_sheet_jtext_td 有个普通的联合索引                   iodso.qos_hisentry_sheet_t