假设t1表有多个字段,t2表有2个字段,并且这2个字段t1表中也有,那么请问一下2个sql有什么区别呢,因为查出来的数据完全不一样,差别很大select * from t1 a where not exists
(select 1 from t2 b where b.field1 = a.field1 and b.field2 = a.field2)和
select * from t1 a where not exists (select * from t2);
有什么区别啊
(select 1 from t2 b where b.field1 = a.field1 and b.field2 = a.field2)和
select * from t1 a where not exists (select * from t2);
有什么区别啊
where b.field1 = a.field1 and b.field2 = a.field2
差别就在条件上。。
完全不一样的2个语句怎么可能 没有差别呢
而且每一行数据都存在在t1表中
我的意思就是从t1表中去掉t2表中的所有数据
有什么不对啊
和第一条sql应该是一样的啊
(select 1 from t2 b where b.field1 = a.field1 and b.field2 = a.field2)和
(2)select * from t1 a where not exists (select * from t2);解释:
第一条语句选出的是在t1表中但是不在t2表中的所有数据;
第二条语句选出的是t1表中的所有数据。因为只要t2 表不为空,条件not exists (select * from t2)就永远为真,因此就会选出t1表中的所有数据。
t1表为
terminal_id boss_set service_id
1 a b
2 aa bb
3 aaa bbb
4 aaaa bbbbt2表为
terminal_id boss_set
1 a
2 aa
3 aaa
我用
select * from t1 a where not exists (select * from t2 b where a.terminal_id = b.terminal_id2 and a.boss_set = b.boss_set2);
查出来的是
4 aaaa bbbb用select * from t1 a where not exists (select * from t2 b);查出来的是空,没有值我就是不懂原因何在,我的t1表包含t2表中的数据,我第二条sql的意思难道不是去除t1表中的t2表的数据吗
很明显,t2表的有三条记录,所以exists恒为真,而not exists恒为假,所以查不出记录第二个语句要写成not in就是你的意思了
SELECT * FROM t1 a WHERE (terminal_id, boss_set) NOT IN (SELECT terminal_id, boss_set FROM t2 b);
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 1 from t2 b where b.terminal_id = a.terminal_id and b.boss_set = a.boss_set)
返回值是
4 aaaa bbbb这个sql语句exists中的字句也恒为真啊,那它怎么返回值跟之前那条不一样呢,为什么关联了外表之后就是对外表进行了筛选,而不是判断exists字句中的值恒为真或者恒为假呢,返回值也不是空了
这个解释是错的.exists 一般只能用于关联查询,就是说在第一种情况下,是可以这样做的.
第二个,不支持这样的语法,如果要用到第二种这样的情况,只能用NOT IN
(select 1 from t2 b where b.terminal_id = a.terminal_id and b.boss_set = a.boss_set)楼主了解关联子查询执行的顺序吗
上面这个语句的执行是这样的t1表为
terminal_id boss_set service_id
1 a b
2 aa bb
3 aaa bbb
4 aaaa bbbbt2表为
terminal_id boss_set
1 a
2 aa
3 aaa 从t1表中选出记录1 a b,拿去到t2表中查找满足条件where b.terminal_id = a.terminal_id and b.boss_set = a.boss_set的记录,结果当然是存在,因此括号里的子查询返回1,而因为是not exists,外层的where就返回为false,因此不会选出t1表中的记录1 a b。
而对于4 aaaa bbbb这条记录,同样的道理,楼主自己想一想吧。