2010-03-31 106 views
28

如果我運行一個查詢,如:COUNT(*)總是返回結果嗎?

SELECT COUNT(*) as num FROM table WHERE x = 'y' 

將它總是返回一個結果,即使在查詢不匹配任何記錄?或者我需要驗證並確保返回一行作爲結果?

+9

難以測試嗎? – 2010-03-31 10:33:53

+0

@col yea :)',' – 2010-03-31 10:34:36

+1

@col沒有嘗試,只是想在這裏,我想他希望觀衆「點擊Upvote」他的問題。 – raj 2010-03-31 10:37:13

回答

42

是的,因爲它是一個總量和返回零。 除非您添加GROUP BY,在沒有組的情況下沒有結果...

MAX/SUM等將返回NULL,除非您添加GROUP BY,否則無行。 只算返回任何結果

編輯,有點晚了一些:SUM將返回NULL像MAX

編輯,2013年5月:這適用於所有主要的RDBMS。我猜根據ANSI標準

+0

它說我可以在11分鐘內接受,wtf ... – 2010-03-31 10:35:57

+0

SUM()函數怎麼樣,它們會返回0還是NULL? – 2010-03-31 10:36:50

+2

@Click Upvote:對不起,我沒有回答。 SUM給出像MAX一樣的NULL值。只有COUNT返回0 – gbn 2011-01-18 06:04:09

2

是它會返回一個數字總是

5

聚合函數COUNT()總是返回值

+3

...除非您添加GROUP BY? – gbn 2010-03-31 10:37:12

+1

...澄清:「計數'函數的返回值總是一個非空整數,毫無例外。通過提及「group by」,您引用了包含的查詢,並將「返回值」的主題從「count function」更改爲「query的結果集」。非分組計數查詢會生成包含計數返回值的單個記錄的結果集。或者,分組計數查詢會生成一個結果集,其中每個記錄都包含一個計數值。在這種情況下,如果沒有要運行的計數組,則count永遠不會運行,並且「查詢返回值」是一個空集。 – Triynko 2011-12-08 20:41:48

2

是的,它會在這種情況下返回0。

2

總會有結果的一排這樣的:

| COUNT(*) | 
------------ 
| 0  | 

如果沒有匹配。

順便說一句,我寧願只計算主鍵而不是*

+2

'COUNT(*)'與一般的COUNT(列)不同。計數列將檢查不同的值,而不是所有的記錄。當然,當你計算你的主鍵時,你將得到所有的記錄,因爲主鍵必須是唯一的,但這不會比COUNT(*)'快,並且可能會更慢(除非MySQL自動優化回COUNT(* )')。 – 2010-03-31 17:27:03

+3

@Ty W - 「計數列檢查不同的值」。不,這是不正確的,除非你指定'distinct'關鍵字。它計算的值不是'NULL' – 2011-01-18 13:40:08

2

如果沒有記錄匹配計數將返回0 (所以是的,總是指望返回結果,除非你有一些語法錯誤)

7

是的,返回值的「count」函數本身始終是一個非空整數,沒有例外。

說了這麼多,你可能會更感興趣的是你查詢,這實際上是一個結果集的返回值。如果是這樣的話,那麼你只需要考慮你的查詢是否包含「group by」子句。與集合函數

非分組查詢

select count(*), sum(*), max(*), min(*) from table 

產生與含有骨料(多個)功能的返回值(一個或多個)單個記錄的結果集。在這種情況下,您的結果集總是隻有一條記錄,列中包含您包含的任何聚合函數的返回值。在這個單獨的記錄中,count的返回值將始終爲非空整數,而其他聚合函數(如min,max和sum)的返回值可能爲null。在上面的例子中,你返回的記錄可能是「零,空,空,空」,但永遠不會是「null,null,null,null」,因爲count永遠不會返回null。所以如果你只調用「count」,那麼返回的那條記錄中的那一列將總是包含count的非空返回值;因此您可以放心,計數查詢的標量返回值將始終爲非空整數。

在另一方面,與集合函數的分組查詢

select count(*), sum(*), max(*), min(*) from table group by column 

產生具有零個或多個記錄的結果集,其中每個記錄包含聚合函數的返回值( s)爲每個組確定。在這種情況下,如果沒有標識的組,則不會運行集合函數的組,函數將永遠不會運行,並且「查詢返回值」將是一個完全沒有記錄的空集。

測試出來的,沒有記錄的表看到的結果:

create table #t (c int); 
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t; --returns one record {0, null, null, null} 
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t group by c; --returns no records 
drop table #t; 

所以,不管你調用計數,最小值,最大值或總和,重要的是不僅可以瞭解的返回值的單個集合函數,還包括查詢本身的「返回值」以及結果集包含的內容。

+0

謝謝!只是想讓你知道在MySQL上我不能執行SUM(*)。 – CMCDragonkai 2015-12-24 03:38:42