(转)sql中 in 、not in 、exists、not exists 用法和差别

exists (sql 返回结果集为真)  not exists (sql 不返回结果集为真)  如下:  表A  ID NAME  1    A1  2    A2  3  A3 
表B  ID AID NAME  1    1 B1  2    2 B2  3    2 B3 
表A和表B是1对多的关系 A.ID => B.AID 
SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)  执行结果为  1 A1  2 A2  原因可以按照如下分析  SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)  --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据  SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)  --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据  SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)  --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据  NOT EXISTS 就是反过来  SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)  执行结果为  3 A3  ===========================================================================  EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因  SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B) 
NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别  SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B) 
下面是普通的用法: 
SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别:    IN:确定给定的值是否与子查询或列表中的值相匹配。    IN 关键字使您得以选择与列表中的任意一个值匹配的行。    当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID =4 OR CategoryID = 5    然而,如果使用 IN,少键入一些字符也可以得到同样的结果:    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)    IN 关键字之后的项目必须用逗号隔开,并且括在括号中。    下列查询在 titleauthor 表中查找在任一种书中得到的版税少于 50% 的所有作者的 au_id,然后从 authors 表中选择 au_id 与    titleauthor 查询结果匹配的所有作者的姓名:    SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHEREroyaltyper <50)    结果显示有一些作者属于少于 50% 的一类。    NOT IN:通过 NOT IN 关键字引入的子查询也返回一列零值或更多值。    以下查询查找没有出版过商业书籍的出版商的名称。    SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type ='business')    使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。        两个集合的交集包含同时属于两个原集合的所有元素。    差集包含只属于两个集合中的第一个集合的元素。    EXISTS:指定一个子查询,检测行的存在。    本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:    SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id =publishers.pub_id AND type =    'business')    SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles