sql 语句 IN , NOT IN , EXISTS ,NOT EXISTS 理解

sql 语句  IN , NOT IN , EXISTS ,NOT EXISTS  理解

参考文档

首先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号课程的学生的姓名
   
  1. select Sname
  2. from  Student
  3. where exists
  4. (
  5.       select *
  6.       from SC
  7.       where Sno = Student.Sno AND Cno='1'
  8. );

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);
这里最后的结果集永远为空


转载于:https://my.oschina.net/u/2552669/blog/1550761

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值