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 -----------*/ 不懂,反正我这样理解都解释的通了,结贴啦啦啦
不懂,反正我这样理解都解释的通了,结贴啦啦啦没问题啊大人,你这个刚好说明了互为补集 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 行受影响)
哪些人是员工(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已经不可能成立了.(主表里的记录被过滤掉) 原来资料里找的希望对你有帮助
NOT EXISTS 是一个 是真是假 的逻辑判断,对它后边括号中如果有符合的记录能查询到,那么就是 真,这整个条件就满足,如果没有记录,那就是 假,这个条件不满足。
s表没关系吧,就是s1到s6六名学生的信息我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?
FROM s
WHERE s# NOT IN ( SELECT s#
FROM sc
WHERE c# = 'C4' )
s表没关系吧,就是s1到s6六名学生的信息我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?
你括号里的条件也就是选C4吧,NOT EXISTS返回没选C4的呗…… 最好把S表也放出来,可以帮你实际测一下= =
这个我知道啊, 我不是不明白 NOT EXISTS 的含义,而是他执行的原理
s表没关系吧,就是s1到s6六名学生的信息我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?
你括号里的条件也就是选C4吧,NOT EXISTS返回没选C4的呗…… 最好把S表也放出来,可以帮你实际测一下= =现在我没在用电脑呀,s表没什么问题啊,就是s1到s6几个学生信息 ,学号 姓名 年龄 性别 没有空值
老大 你这下说到点子上啦
我想我是钻牛角尖了
其实 NOT EXISTS 就是 返回 EXISTS 没返回的值
或者说 他不是一个操作而是 NOT ( EXISTS 条件 ) 是对 EXISTS 的返回值求补集 这么理解 对吧
就是被误导了 NOT EXISTS 理解为 “不存在” 就坑爹了
应该是 求 EXISTS返回值的补集 执行过程不是 判断不满足的条件就 返回
而是 先返回满足的条件 再求其补集
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
-----------*/
不懂,反正我这样理解都解释的通了,结贴啦啦啦
不懂,反正我这样理解都解释的通了,结贴啦啦啦没问题啊大人,你这个刚好说明了互为补集
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 行受影响)
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已经不可能成立了.(主表里的记录被过滤掉)
原来资料里找的希望对你有帮助