【问题标题】:count(*) and count(column_name), what's the diff?count(*) 和 count(column_name),有什么区别?
【发布时间】:2011-02-22 01:04:04
【问题描述】:

count(*)count(column_name),mysql有什么区别。

【问题讨论】:

标签: mysql


【解决方案1】:
  • COUNT(*) 计算结果集中的所有行(如果使用 GROUP BY,则为组)。
  • COUNT(column_name) 只计算column_name 不为空的那些行。在某些情况下,即使没有 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

【讨论】:

  • COUNT(*) 不计算结果集中的所有行(如果使用 GROUP BY,则为组)只计算所有 column_name 不为空的行
【解决方案2】:

取决于列定义 - 即如果您的列允许 NULL - 您可能会得到不同的结果(并且在某些情况下使用 count(column) 可能会更慢,正如 Mark 已经说过的那样)。

【讨论】:

    【解决方案3】:

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

    现在,如果您有COUNT (ColumnName),那么数据库必须检查该列是否具有NULL 值,并且NULLs 会从聚合中删除。所以COuNT (*)COUNT (1)COUNT (ColumnName) 更可取,除非你想要COUNT (DISTINCT ColumnName)

    【讨论】:

      【解决方案4】:

      在大多数情况下差别不大,一般首选COUNT(*)COUNT(1)。但是,有一种重要情况您必须使用COUNT(columnname):外连接。

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

      SELECT c.name, COALESCE(COUNT(o.id), 0) AS order_count
      FROM customers AS c
      LEFT JOIN orders AS o ON o.customer_id = c.id
      

      【讨论】:

        猜你喜欢
        • 2020-03-02
        • 2020-11-10
        • 2014-06-09
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        相关资源
        最近更新 更多