SQL里的EXISTS与in、not exists与not in 效率比较和使用
在 MSSQL
中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案。
问题:
我创建了一个表来存放客户信息,我知道可以用
insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢?
答案:
可以通过使用 EXISTS
条件句防止插入重复记录。
示例一:插入多条记录
假设有一个主键为 client_id 的
clients 表,可以使用下面的语句:
Code:
INSERT
INTO clients
(client_id, client_name, client_type)
SELECT supplier_id,
supplier_name, 'advertising'
FROM suppliers
WHERE not exists
(select * from clients
where clients.client_id
=
suppliers.supplier_id);
示例一:插入单条记录
Code:
INSERT
INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM',
'advertising'
FROM dual
WHERE not exists
(select * from clients
where clients.client_id = 10345);
使用
dual
做表名可以让你在 select
语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not
exists
修改方法如下:
in的SQL语句
SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112)
as pubtime
FROM tab_oa_pub WHERE is_check=1 and
category_id in (select
id from tab_oa_pub_cate where no='1')
order by begintime desc
修改为exists的SQL语句
SELECT id, category_id, htmlfile, title,
convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE
is_check=1 and
exists (select id from tab_oa_pub_cate where
tab_oa_pub.category_id=convert(int,no) and no='1')
order by begintime
desc
分析一下exists真的就比in的效率高吗?
我们先讨论IN和EXISTS。
select * from t1 where x in ( select y from t2
)
事实上可以理解为:
select *
from t1, ( select distinct y from
t2 ) t2
where t1.x = t2.y;
——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge
join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。
select * from t1 where exists ( select
null from t2 where y = x )
可以理解为:
for x in ( select * from t1
)
loop
if ( exists ( select null from t2 where y = x.x
)
then
OUTPUT THE RECORD!
end if
end
loop
——这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。
综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是相对的
分享到:
相关推荐
关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in...
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not
里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句.txt欢迎下载!
NULL 博文链接:https://576017120.iteye.com/blog/1624774
总结:exists 和not exists语句强调是否返回结果集,不要求知道返回什么,与in的区别就是,in只能返回一个字段值,exists允许返回多个字段 提醒:文章中提供了exists和not exists的常用示例,已经经过本人测试,...
sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。 指定一个子查询,检测行的存在。 如果子查询包含行,则返回 TRUE IN效率要差(返回子查询)
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句2.txt,欢迎下载!
not exists的子查询,对于子查询不返回行和子查询返回行的查询结果是有区别的 这些细小的差别千万不要被我们所忽视,一旦项目庞大了,想跟踪到具体的错误所花费的时间也是可观的。尽量把这些不必要的错误扼杀在摇篮...
基本数据插入 except和intersect和exists和not exists和union和union all sql server
NOT IN、JOIN、IS NULL、NOT EXISTS效率对比 语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B on A.a = B.a where B.a is null 语句三:select ...
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。 SQL中IN和EXISTS用法的区别 NOT IN sql in与exists区别
not exists则相反 它所在的查询属于相关子查询,即子查询的查询条件依赖于外层父查询的某个属性值,处理过程一般为: 取外层查询的第一个元组,根据它与内层查询相关的属性值处理内层查询,若where子句返回true,则...
一次SQL Tuning引出来的not in , not exists 语句的N种写法2
MySQL优化之in,exists,not in,not exists的区别in与existsin查询过程结论:exists查询过程:结论:not in与not existsnot in查询过程:结论:not exists查询过程:结论: 首先我们使用两个用户表作为实例 insert ...
exists,not exists的使用方法示例,需要的朋友可以参考下。
in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...