2010-05-20 59 views
13

count(*)count(column_name),什么是在MySQL中差别。count(*)和count(column_name),diff是什么?

+0

表现明智,没有区别,但是,当您指定列名称时,您只会获得该字段不为空的行数。另外,count(columnName)在我看来只是“感觉”更好。 – Jay 2010-05-20 19:00:33

+3

@Jay:有一个性能差异。请参阅:http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ – 2010-05-20 19:54:44

回答

25
  • COUNT(*)计数结果集中的所有行(或组,如果使用GROUP BY)是最好COUNT (ColumnName)
  • COUNT(column_name)只计算那些行,其中column_name是NOT 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 
+0

COUNT(*)不计算结果集中的所有行(或者如果使用GROUP BY,则为组)不计算那些行所有的column_name都不是NULL – zloctb 2014-04-24 11:35:48

0

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

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

1

根据列定义 - 即如果你的列允许空 - 你可能会得到不同的结果(在Mark已经告诉的情况下,在某些情况下,它可能会减少计数(列))。

0

在大多数情况下,几乎没有区别,COUNT(*)COUNT(1)一般是优选的。但是,有一个重要的情况,您需要必须使用COUNT(columnname):外部连接。

如果您正在执行从父表到子表的外连接,并且您希望在子表中没有相关项的行中得到零计数,则必须使用COUNT(column in child table)。当没有比赛,该列就会NULL,你会得到所需的零计数(实际上,你会得到NULL,但你可以将其转换成0IFNULL()COALESCE())。如果您使用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 
相关问题