为了账号安全,请及时绑定邮箱和手机立即绑定

计数(*)对计数(1)对计数(PK):哪个更好?

计数(*)对计数(1)对计数(PK):哪个更好?

回首忆惘然 2019-07-22 15:34:12
计数(*)对计数(1)对计数(PK):哪个更好?我经常发现这三个变体:SELECT COUNT(*) FROM Foo;SELECT COUNT(1) FROM Foo;SELECT COUNT(PrimaryKey) FROM Foo;据我所见,他们都在做同样的事情,我发现自己使用了我的代码库中的三个。然而,我不喜欢用不同的方式做同样的事情。我该坚持哪一个?他们中有谁比那两个人好吗?
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

其中两个总是给出相同的答案:

  • COUNT(*)

    计数行数
  • COUNT(1)

    还计算行数。

假设pk是主键,并且值中不允许使用空值。

  • COUNT(pk)

    还计算行数。

但是,如果pk不被限制为NOTNULL,则会产生一个不同的答案:

  • COUNT(possibly_null)计算列中具有非空值的行数。possibly_null.

  • COUNT(DISTINCT pk)还计算行数(因为主键不允许重复)。

  • COUNT(DISTINCT possibly_null_or_dup)计算列中不同的非空值数。possibly_null_or_dup.

  • COUNT(DISTINCT possibly_duplicated)计算列中不同(必然为非空)值的数目。possibly_duplicated当它有NOT NULL上面的条款。

通常,我会写COUNT(*);它是最初推荐的SQL表示法。类似地,对于EXISTS条款,我通常写WHERE EXISTS(SELECT * FROM ...)因为这是最初的推荐符号。替代方案不应该有任何好处;优化器应该看穿更模糊的符号。


查看完整回答
反对 回复 2019-07-22
?
桃花长相依

TA贡献1860条经验 获得超8个赞

在某些情况下,这将取决于所使用的数据库类型以及表的类型。

例如,使用MySQL,count(*)在MyISAM表下速度较快,而在InnoDB下速度较慢。在InnoDB下,您应该使用count(1)count(pk).


查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 386 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信