黑马程序员技术交流社区

标题: Mysql中exists和not exists的用法 [打印本页]

作者: wendyYao    时间: 2017-9-28 17:18
标题: Mysql中exists和not exists的用法
本帖最后由 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)
执行结果为

1.jpeg (74.94 KB, 下载次数: 27)

1.jpeg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2