SQL 最佳实践 – 不要将 count(*) 与 0 进行比较 – 从 depesz 中选择 *;

主要观点:

  • 看到类似“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 表达式可避免无用计数,提高查询效率。
    重要细节:
  • 即使在某些情况下人们认为原查询“没关系”,但从最佳实践角度不应这样做,以免养成坏习惯导致重要情况下出错。
阅读 7
0 条评论