1. 两个表大小行数相当
IN与EXISTS区别不大。
2. Xiao表(小),Da表(大)
EXISTS
SELECT * FROM Xiao
WHERE EXISTS(
SELECT 1 FROM Da
WHERE Da.X_ID=Xiao.ID
)
- 查询小表数据,使用相关子查询,使用外层查询Xiao表的一行数据去匹配子查询Da表的数据。where子句返回“true”,则本条记录放入结果表中。然后再取下一行记录,重复上述过程直到外层表遍历完毕。
- Exists语句不关心子查询返回的具体内容,因此用“exists(select 1 from)”来判断子查询是否返回记录。
IN
SELECT * FROM Da
WHERE X_ID IN (
SELECT ID FROM Xiao
)
- 通过大表的字段的索引进行查询。
3. NOT EXISTS
SELECT * FROM Da
WHERE NOT EXISTS (
SELECT 1 FROM Da
WHERE Da.X_ID=Xiao.ID
)
- 无论哪个表大,用 NOT EXISTS 都比 NOT IN 要快。