Oracle 的 not in 和 not exists

本文深入探讨SQL中的三种关键技巧:正则表达式匹配、NOT IN与IN的区别及优化,以及NOT EXISTS的用法。详细解释了如何使用REGEXP_SUBSTR进行字符串匹配,NOT IN与IN在处理NULL值时的不同表现,以及NOT EXISTS在查询效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  regexp_substr 字符串匹配

select regexp_substr('陈凯-chenk','[^-]+',1,1), instr('yuechaotianyuechao','ao') position from dual;

起始位置,从第几个字符开始正则表达式匹配(默认为1),

匹配第一个‘-’   

得到的结果是:陈凯

2. not  in  或者 in 

为什么not in的效率会低?

因为要判断内表查询字段是否有空值,如果有空值,则使用的时 FILTER ;如果明确指出关联字段时不空的,则使用hash连接,速度会极大的提升

not in 的子查询语句结果中不能有null值,否则就查询不出结果

in (1,2,null) 其中null是会被忽略掉的;

判断字段是否是null,只能使用 is null  或者  is not  null  来判断

表A:  表B:

select * from A a where a.id not in (select id from B b  ) 

    如果 table2 中col1有null值,则查询结果就是空

修改1:select * from A a where a.id not in (select id from B b where b.id is not null )   正确

修改2:select * from a where not exists (select * from b where b.id = a.id)   正确

 

明确通知Oracle,not in 的字段查询时,是不会有空值参与的。这样表连接就使用HASH JOIN连接表了。

或者两张表的关联字段设置不允许为null,即可。

select * from a   where col is not null and col not in (select col from b where col is not null);

3。not  exists

1、对于not exists查询,内表存在空值对查询结果没有影响;对于not in查询,内表存在空值将导致最终的查询结果为空。

2、对于not exists查询,外表存在空值,存在空值的那条记录最终会输出;对于not in查询,外表存在空值,存在空值的那条记录最终将被过滤,其他数据不受影响。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值