sql中exists,not exists与in,not in用法
select * from ActGift_J g where g.GiftID in ( select d.GiftID from ActUserDrawRecord_J d )
等效于
select * from ActGift_J g where exists ( select 1 from ActUserDrawRecord_J d where g.GiftID=d.GiftID )
EXISTS原理:
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行可作为外查询的结果行,否则不能作为结果。
区别:
exists : 强调的是是否返回结果集,不要求知道返回什么,如 select 1...
exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,而exists没有限制,
如:
select * from ActGift_J g where exists ( select 1 from ActUserDrawRecord_J d where g.GiftID=d.GiftID and g.ActID=d.ActID )
如果外表还有其他条件,则需要写到 exists后面
SELECT ProvinceId ,* FROM DB_Division.PersonStation a WHERE NOT EXISTS ( SELECT 1 FROM DB_Division.FunSplitStr('12|15|22|34|43|44|46|52|53|54|63|83|35|36' , '|') b WHERE a.ProvinceId = b.col ) AND AccountType = 3 AND IsActivate = 1;
在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。
INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)
EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
EXISTS对应linq的关键字为Any(),如:
select * from ActGift_J g where exists ( select 1 from ActUserDrawRecord_J d where g.GiftID=d.GiftID )
等效于
var a = from g in db.ActGift_J where db.ActUserDrawRecord_J.Any(m => m.GiftID == g.GiftID) select g;
而IN对应Contains()。

浙公网安备 33010602011771号