本帖最后由 wendyYao 于 2017-9-28 17:19 编辑
exists:强调的是是否返回结果集,exists引导的子句有结果集返回,只有有结果集返回,那么exists这个条件算成立了。 not exists:和exists相似,但是exists是当sql返回结果集的时候为真,而not exists 是sql不返回结果集的时候为真; 下面详细描述一下exists的过程: 首先创建两个表,分别是t1和t2,如下: create table t1( id int; name varchar(20) )charset=utf8; create table t2( id int; aid int, name varchar(20) )charset=utf8;
插入数据: insert into t1 values(1,'A1'),(2,'A2'),(3,'A3'),(5,'A4'); insert into t1 values(1,1,'A1'),(2,,2'A2'),(3,3,'A3'),(6,6,'A6'); 查看两张表: 表A和表B是1对多的关系 A.ID => B.AID
SELECT ID,NAME FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.ID=t2.AID)
执行结果为
原因可以按照如下分析
SELECT ID,NAME FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.AID=1)
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据
SELECT ID,NAME FROM t1 WHERE EXISTS (SELECT * FROM t1 WHERE t2.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据
SELECT ID,NAME FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.AID=3)
--->SELECT * FROM t2 WHERE t2.AID=3有值返回真所以有数据
SELECT ID,NAME FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.AID=5)
--->SELECT * FROM t2 WHERE t2.AID=5没有值返回假所以没有数据
NOT EXISTS 就是反过来 SELECT ID,NAME FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t1.ID=t2.AID) 执行结果为
|