主要观点:
- 看到类似“select u. from users u where 0 = (select count() from addresses a where a.user_id = u.id)”的查询会让人感到困扰,需了解其问题及避免方法。
- 该查询本意是返回没有地址的用户,但存在计数问题,若用户有百万地址,会进行无用计数。
- 正确做法是使用EXISTS表达式,如“select u.* from users u where NOT EXISTS (select from addresses a where a.user_id = u.id)”,它会在找到一行满足条件时立即停止测试,无需计数。
关键信息: - 原查询通过计数判断用户是否有地址,效率低且可能无用。
- EXISTS 表达式可避免无用计数,提高查询效率。
重要细节: - 即使在某些情况下人们认为原查询“没关系”,但从最佳实践角度不应这样做,以免养成坏习惯导致重要情况下出错。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。