Mysql 计数(*)和计数(列名称),什么';区别在哪里?

Mysql 计数(*)和计数(列名称),什么';区别在哪里?,mysql,Mysql,count(*)和count(column\u name),mysql有什么区别。在count(*),count(column name),count(1)之间没有性能差异 现在,如果您有COUNT(ColumnName),那么数据库必须检查该列是否有NULL值,并且NULL从聚合中删除。因此COuNT(*)或COuNT(1)比COuNT(ColumnName)更好,除非您想要COuNT(DISTINCT ColumnName) COUNT(*)统计结果集中的所有行(如果使用group BY,则

count(*)
count(column\u name)
,mysql有什么区别。

count(*)
count(column name)
count(1)
之间没有性能差异

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

  • COUNT(*)
    统计结果集中的所有行(如果使用group BY,则为group)
  • COUNT(column\u name)
    仅统计
    column\u name
    不为空的行。在某些情况下,即使没有空值,这也可能较慢,因为必须检查该值(除非该列不可为空)
  • COUNT(1)
    COUNT(*)
    相同,因为1永远不能为空
要查看结果的差异,您可以尝试以下小实验:

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 a、b、c 3 2 3
根据列定义(即,如果您的列允许NULL),您可能会得到不同的结果(在某些情况下,正如Mark已经告诉的那样,计数(列)可能会慢一些)。

在大多数情况下几乎没有差异,通常首选
count(*)
count(1)
。但是,有一种重要情况必须使用
COUNT(columnname)
:外部联接

如果正在执行从父表到子表的外部联接,并且希望在子表中没有相关项的行中获得零计数,则必须使用
COUNT(子表中的列)
。当没有匹配项时,该列将为
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

就性能而言,没有区别,但是当您指定列名时,您只会得到该字段不为null的行数。而且,count(columnName)在我看来“感觉”更好。@Jay:性能上有差异。请参阅:COUNT(*)不计算结果集中的所有行(如果使用group BY,则为group),仅不计算所有列名称不为NULL的行