2010-05-20 73 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 
相關問題