count(*)和count(column_name),差异是什么?

时间:2010-05-20 18:56:10

标签: mysql

count(*)count(column_name),mysql有什么不同。

4 个答案:

答案 0 :(得分:25)

  • COUNT(*)计算结果集中的所有行(如果使用GROUP BY,则为组)。
  • COUNT(column_name)仅计算column_name为非NULL的行。在某些情况下,即使没有NULL值,这可能会更慢,因为必须检查该值(除非该列不可为空)。
  • COUNT(1)COUNT(*)相同,因为1永远不能为NULL。

要查看结果的差异,您可以尝试这个小实验:

CREATE TABLE table1 (x INT NULL);
INSERT INTO table1 (x) VALUES (1), (2), (NULL);
SELECT
    COUNT(*) AS a,
    COUNT(x) AS b,
    COUNT(1) AS c
FROM table1;

结果:

a   b   c
3   2   3

答案 1 :(得分:1)

取决于列定义-i.e如果列允许为NULL - 您可能会得到不同的结果(在Mark已经告知的某些情况下,它可能会慢于count(列)。

答案 2 :(得分:0)

COUNT (*)COUNT (ColumnName)COUNT (1)之间没有性能差异。

现在,如果您有COUNT (ColumnName),那么数据库必须检查列是否具有NULL值,并且从聚合中删除NULL。因此COuNT (*)COUNT (1)优于COUNT (ColumnName),除非您需要COUNT (DISTINCT ColumnName)

答案 3 :(得分:0)

在大多数情况下,差异很小,通常首选actionCartSaveCOUNT(*)。但是,有一个重要的情况是必须使用COUNT(1):外部联接。

如果您正在执行从父表到子表的外部联接,并且希望在子表中没有相关项的行中获得零计数,则必须使用COUNT(columnname)。当没有匹配项时,该列将为COUNT(column in child table),您将获得所需的零数(实际上,您将获得NULL,但您可以使用{转换为NULL {1}}或0)。如果您使用IFNULL(),则会计算父表中的行数,因此您将获得COALESCE()的计数。

COUNT(*)
相关问题