参考文档
首先where 的作用是筛选
IN:
指定一个字段的取值范围为一组值或者为子查询结果集(返回只有一个字段的集合)中
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERECategoryID IN (1, 4, 5)
IN 关键字之后的项目必须用逗号隔开,并且括在括号中。
NOT IN:
指定一个字段的取值范围不能在一组值或者为子查询结果集(返回只有一个字段的集合)中
以下查询查找没有出版过商业书籍的出版商的名称。
SELECTpub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHEREtype = 'business')
EXISTS:
注意使用EXISTS 需要内查询和外查询有关联
查询所有选修了1号课程的学生的姓名
select Sname
from Student
where exists
(
select *
from SC
where Sno = Student.Sno AND Cno='1'
);
NOT EXISTS:
Select * from TableA a where Not Exists (Select * from TableB b where a.id=b.id and a.name=b.name);
1、Not Exists 用在where之后,且后面紧跟子查询语句(带括号);
2、Not Exists(Exists) 并不关心子查询的结果具体是什么,只关心子查询有没有结果;
3、这条语句的意思,把TableA的记录逐条代入到子查询,如果子查询结果集为空,说明不存在,那么这条TableA的记录出现在最终结果集,否则被排除
使用 EXISTS和 NOT EXISTS引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。
通俗的理解:
将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果集非空,则exists子句返回true,这一行方可作为外查询的结果行,否则不能作为结果。
即 exists 先进行外查询 将外查询表中集的每一行带入内查询表(内查询表要与外查询表有关联 如t1.id=t2.id)进行一次查询 如果内查询表结果集不为空(表明存在)(只关注有无值所以可以使用select 1这种方式) 这exists子句返回True 外查询的这一行才能显示
即 not exists 先进行外查询 将外查询表中集的每一行带入内查询表(内查询表要与外查询表有关联 如t1.id=t2.id)进行一次查询 如果内查询表结果集为空
(表明不存在)
这not exists子句返回True 外查询的这一行才能显示
如果
内查询表要与外查询表有关联 如t1.id=t2.id 那么将外查询表中集的每一行的id带入内查询表
如果内查询与外查询无关联 则直接执行
如
Select * from TableA a where Not Exists (Select 1 from TableB);
这里最后的结果集永远为空