对NOT EXISTS运行原理的不解??

simaqingtian 2014-07-01 12:16:12
查询选了课程C4的学生信息,结果是正确的如下图
但对怎么得到的这个结果不太理解

比如SC表的第一行,学生S1 选 C1 课程 这个元组用来进行判断的话,那就是不符合子查询条件 S.S#=SC.S# AND C#='C4' 的,也就是这个元组是NOT EXISTS要返回的值吧,那怎么没返回呢?

...全文
275 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
NOT EXISTS是不符合条件的才返回,另外你只给了一个表的数据,看不到S表的内容
AcHerat 2014-07-01
  • 打赏
  • 举报
回复
是未选修C4课程的学生吧! NOT EXISTS 是一个 是真是假 的逻辑判断,对它后边括号中如果有符合的记录能查询到,那么就是 真,这整个条件就满足,如果没有记录,那就是 假,这个条件不满足。
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
CSDN_Tang 2014-07-01
  • 打赏
  • 举报
回复
哪些人是员工(not exists)
select ename from emp_hiloo o 
where not exists
               (select 1 from emp_hiloo i
                where o.empno = i.mgr)
哪些部门没有员工?(否定问题)
select dname from dept_hiloo o
where not exists 
                 (select 1 from emp_hiloo i
                  where o.deptno = i.deptno)
对于not exsits来说,子查询的返回结果必须是no rows selected,才符合not exsits的条件(主表里的记录放入结果集).
如果子查询在执行过程中找到了一条符合条件的记录,子查询立即返回,not exists已经不可能成立了.(主表里的记录被过滤掉)
原来资料里找的希望对你有帮助
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
版主的世界俺不懂
引用 23 楼 DBA_Huangzj 的回复:
我的意思是负负得正,NOT EXISTS的话,如果要得到和EXISTS的相同结果,理论上在内层也要把=变成<>,不过结果却不是,可能我和你想的东西有点方向不同而已。
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
我的意思是负负得正,NOT EXISTS的话,如果要得到和EXISTS的相同结果,理论上在内层也要把=变成<>,不过结果却不是,可能我和你想的东西有点方向不同而已。
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
引用 21 楼 DBA_Huangzj 的回复:
CREATE TABLE t1(id int)
CREATE TABLE t2(id INT )

INSERT INTO t1 
VALUES(1),(2),(3)


INSERT INTO t2
VALUES(1),(2)


SELECT * FROM t1 a
WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)


SELECT * FROM t1 a
WHERE NOT  EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id)

/*
id
-----------
1
2

(2 row(s) affected)

id
-----------

*/
[quote=引用 20 楼 simaqingtian 的回复:] [quote=引用 19 楼 DBA_Huangzj 的回复:] 还要看条件。你这个例子可以,不代表全部例子都可以,有些内层where条件可能导致问题,我以前就试过,不过一时半刻找不出来
不懂,反正我这样理解都解释的通了,结贴啦啦啦[/quote][/quote] 没问题啊大人,你这个刚好说明了互为补集

SELECT * FROM t1 a
WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)
SELECT * FROM t1 a
WHERE NOT EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)

SELECT * FROM t1 a
WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id)
SELECT * FROM t1 a
WHERE NOT EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id) 
四个查询结果 id ----------- 1 2 (2 行受影响) id ----------- 3 (1 行受影响) id ----------- 1 2 3 (3 行受影响) id ----------- (0 行受影响)
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
CREATE TABLE t1(id int)
CREATE TABLE t2(id INT )

INSERT INTO t1 
VALUES(1),(2),(3)


INSERT INTO t2
VALUES(1),(2)


SELECT * FROM t1 a
WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)


SELECT * FROM t1 a
WHERE NOT  EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id)

/*
id
-----------
1
2

(2 row(s) affected)

id
-----------

*/
引用 20 楼 simaqingtian 的回复:
[quote=引用 19 楼 DBA_Huangzj 的回复:] 还要看条件。你这个例子可以,不代表全部例子都可以,有些内层where条件可能导致问题,我以前就试过,不过一时半刻找不出来
不懂,反正我这样理解都解释的通了,结贴啦啦啦[/quote]
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
还要看条件。你这个例子可以,不代表全部例子都可以,有些内层where条件可能导致问题,我以前就试过,不过一时半刻找不出来
不懂,反正我这样理解都解释的通了,结贴啦啦啦
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
还要看条件。你这个例子可以,不代表全部例子都可以,有些内层where条件可能导致问题,我以前就试过,不过一时半刻找不出来
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
NOT EXISTS和EXISTS不能简单取反。还要看条件
为啥不能?我看就是啊
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
哈哈哈哈 我明白了 谢谢大家 就是被误导了 NOT EXISTS 理解为 “不存在” 就坑爹了 应该是 求 EXISTS返回值的补集 执行过程不是 判断不满足的条件就 返回 而是 先返回满足的条件 再求其补集
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
NOT EXISTS和EXISTS不能简单取反。还要看条件
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
not exists里面是and c# = 'C4',而sc表中满足这个条件的是S1/S3/S4,又应为not exists有一个=谓词,所以S1/S3/S4这三个值在S表中的话就不返回,所以范围S2/S5/S6
老大 你这下说到点子上啦 我想我是钻牛角尖了 其实 NOT EXISTS 就是 返回 EXISTS 没返回的值 或者说 他不是一个操作而是 NOT ( EXISTS 条件 ) 是对 EXISTS 的返回值求补集 这么理解 对吧
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
exists/not exists里面的 S.S#=SC.S# 在你这个例子中等于join,而后面的and 等于筛选条件
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
如果换成EXISTS,那么会返回S1/S3/S4
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
啊啊啊啊啊啊啊啊啊啊 这个s表有啥关系啊。 查询结果是对的,也没啥问题,我只是想问问这个语句工作的原理啊
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
not exists里面是and c# = 'C4',而sc表中满足这个条件的是S1/S3/S4,又应为not exists有一个=谓词,所以S1/S3/S4这三个值在S表中的话就不返回,所以范围S2/S5/S6
simaqingtian 2014-07-01
  • 打赏
  • 举报
回复
引用 7 楼 walkeeper 的回复:
[quote=引用 5 楼 simaqingtian 的回复:] [quote=引用 3 楼 DBA_Huangzj 的回复:] NOT EXISTS是不符合条件的才返回,另外你只给了一个表的数据,看不到S表的内容
s表没关系吧,就是s1到s6六名学生的信息 我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?[/quote] 你括号里的条件也就是选C4吧,NOT EXISTS返回没选C4的呗…… 最好把S表也放出来,可以帮你实际测一下= =[/quote] 现在我没在用电脑呀,s表没什么问题啊,就是s1到s6几个学生信息 ,学号 姓名 年龄 性别 没有空值
發糞塗牆 2014-07-01
  • 打赏
  • 举报
回复
你把SC也贴出来吧
加载更多回复(5)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧