SQL——EXISTS用法
如下:
表A
ID NAME
1 A1
2 A2
3 A3
表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表A和表B是1对多的关系 A.ID => B.AID
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
1 A1 2 A2
原因可以按照如下分析
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 ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
3 A3
重点:1.此处内表SELECT什么无所谓,不会影响外表的查询结果(select 1);2.内表和外表必须有联系(此处的联系即是指A/外表的ID和B/内表的AID——A表的ID是B表的外码)。
补充:如果查询语句使用了NOT IN,那么内外表都进行全表扫描,没有用到索引;
而NOT EXISTS的子查询依然能用到表上的索引。