[英]count(*) and count(column_name), what's the diff?
count(*)
和count(column_name)
,mysql的區別是什么。
COUNT(*)
計算結果集中的所有行(如果使用GROUP BY,則計算組)。 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
根據列定義 - 如果您的列允許NULL - 您可能會得到不同的結果(在Mark已經告知的某些情況下,它可能會慢於count(列))。
COUNT (*)
, COUNT (ColumnName)
, COUNT (1)
之間沒有性能差異。
現在,如果您有COUNT (ColumnName)
那么數據庫必須檢查列是否具有NULL
值,並且從聚合中消除NULL
。 所以COuNT (*)
或COUNT (1)
最好COUNT (ColumnName)
,除非你想COUNT (DISTINCT ColumnName)
在大多數情況下,差異很小,通常首選COUNT(*)
或COUNT(1)
。 但是,有一個重要的情況是必須使用COUNT(columnname)
:outer join。
如果您正在從父表執行外連接到子表,並且您希望在子表中沒有相關項的行中獲得零計數,則必須使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.