簡體   English   中英

count(*)和count(column_name),差異是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM