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()。

posted @ 2017-06-08 09:59  花生打代码会头痛  阅读(324)  评论(0)    收藏  举报