exists (sql 返回結(jié)果集為真)
not exists (sql 不返回結(jié)果集為真)
如下:
表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對(duì)多的關(guān)系 A.ID => B.AID
SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
執(zhí)行結(jié)果為
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有值返回真所以有數(shù)據(jù)
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
---> SELECT * FROM B WHERE B.AID=2有值返回真所以有數(shù)據(jù)
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
---> SELECT * FROM B WHERE B.AID=3無(wú)值返回真所以沒(méi)有數(shù)據(jù)
NOT EXISTS 就是反過(guò)來(lái)
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
執(zhí)行結(jié)果為
3 A3
===========================================================================
EXISTS = IN,意思相同不過(guò)語(yǔ)法上有點(diǎn)點(diǎn)區(qū)別,好像使用IN效率要差點(diǎn),應(yīng)該是不會(huì)執(zhí)行索引的原因
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)
NOT EXISTS = NOT IN ,意思相同不過(guò)語(yǔ)法上有點(diǎn)點(diǎn)區(qū)別
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)