in和exist的主要区别体现在对sql执行计划的影响上。
传统上认为,如果子查询的条件更具选择性(selective),就用in;而如果父查询(外层查询)的条件更具选择性(selective),就用exist。
具体的内容可以参考以下oracle原厂的手册,不好意思,oracle的原厂手册都是英文版的。
对于你举的那个例子,用in和用or是一样的,因为它们的执行计划肯定是一样的。
另外需要特别注意的是,in和exist的区别只在10203及以前的版本中存在;而10204及以后的版本中,in和exist的效果是完全一样的,手册中也删除了有关二者区别的说明。
以下是对手册的引用:
In certain circumstances, it is better to use IN rather than EXISTS In general, if the selective predicate is in the subquery, then use IN If the selective predicate is in the parent query, then use EXISTS
Sometimes, Oracle can rewrite a subquery when used with an IN clause to take advantage of selectivity specified in the subquery This is most beneficial when the most selective filter appears in the subquery and there are indexes on the join columns Conversely, using EXISTS is beneficial when the most selective filter is in the parent query This allows the selective predicates in the parent query to be applied before filtering the rows against the EXISTS criteria
补充:
看sql语句看执行计划就可以了,没必要比较某次的时间长短,因为语句执行时间长短跟很多其他因素有关,比如数据是否在buffer cache中(第二次执行一般会比第一次快不少)、数据库负载不同等。对于常量,in的效果完全等同于or,这是毫无疑问的。
数据库前匹配快in。
like最差,特别是以%(有的数据库是)开头的匹配,是无法进行索引的,只有顺序扫描。
首先是=,表示值必须是一个特定的值。然后是in,表示值是几个特定的值中的一个。最后是like,通过匹配来查找值。其实还有一个is,只为null使用。
SQL对like *** 作中的特殊字符处理方法:
SQL Server查询过程中,单引号 ' 是特殊字符,所以在查询的时候要转换成双单引号 '' 。
在like *** 作还有以下特殊字符:下划线_,百分号%,方括号[],尖号^。 其用途如下:下划线:用于代替一个任意字符(相当于正则表达式中的 ) 百分号:用于代替任意数目的任意字符(相当于正则表达式中的 )。
方括号:用于转义(事实上只有左方括号用于转义,右方括号使用最近优先原则匹配最近的左方括号)。
尖号:用于排除一些字符进行匹配(这个与正则表达式中的一样)。
你这个是把usercode的值作为变量给了语句里的?
这时候就有个问题
你的userCode是string类型的数组吧。。。
那么传进去的应该是'10086','10087'
如果不是这个问题你就在执行SQL语句之前先输出一下语句 日志里看看是哪里格式不对了
create or replace procedure test(in in_where varchar(100)) --创建一个存储过程test,并可以传入字符串作为参数
declare v_sql varchar(512);
set v_sql = ' delete from table1 where field1 in (' concat in_where concat ') ' ; -- 这里是把传进来的where语句拼起来
execute immediate v_sql; --这里是把语句进行执行---------类似以上这样的存储过程,使用以下的放在进行执行即可:call test( ' ''001'',''002'' ') ; --内容中的一个‘ 需要使用 ’‘ 进行转义
以上就是关于oracle数据库中in和exists的详细执行过程全部的内容,包括:oracle数据库中in和exists的详细执行过程、数据库like前匹配快还是in、数据库预编译语句in(查询条件),如果查询条件只有一个,可以运行,如果多个条件,则不能运行,为什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)