2013-08-17 353 views
24

我最近在一次採訪中被問到了這個問題。 我在mySQL中試過了,得到了相同的結果(最終結果)。 All給出了該特定表中的行數。 任何人都可以解釋他們之間的主要區別。mySQL/SQL中count(0),count(1)..和count(*)有什麼區別?

+1

在列中有一個「null」值。然後在列上做點數。看看計數有何不同。選擇'0'或'1'只是爲每一行選擇一個常量,不會涉及'null'。的 – Glenn

+0

可能重複[在SQL中,什麼是計數(列)和計數(\ *)有何區別?(http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn - 計數) – newtover

回答

30

真的沒什麼,除非你指定表或字段或括號而非固定值內的表達式*

讓我給你一個詳細的解答。 Count會給你給定字段的非空記錄號。假設你有一個命名爲A

select 1 from A 
select 0 from A 
select * from A 

都將返回相同數量的記錄表,即在表A的行數仍然是輸出是不同的。如果表中有3條記錄。以X和Y作爲字段名稱

select 1 from A will give you 

1 
1 
1 

select 0 from A will give you 
0 
0 
0 

select * from A will give you (assume two columns X and Y is in the table) 
X  Y 
--  -- 
value1 value1 
value2 (null) 
value3 (null) 

因此,所有三個查詢都返回相同的數字。除非你使用

select count(Y) from A 

由於只有一個非空值,您將獲得1作爲輸出

+1

那麼爲什麼傳遞給計數函數的整數值呢? – Dhruv

+0

@DhruvSingh在回答中給了你更多細節 – Bren

+0

@Bren在性能方面有什麼不同嗎? –

20

COUNT(*)將計算行數,而COUNT(expression)將計算在表達和COUNT(column)非空值會計算列中的所有非空值。

由於0和1都是非空值,所以COUNT(0)=COUNT(1)和它們兩者將相當於行數COUNT(*)。這是一個不同的概念,但結果是一樣的。

+0

謝謝fthiella。 @brhneser對於像我這樣的初學者有一個非常詳細的答案。 – Dhruv

+1

是的,你說得對,但我認爲'count(*)'會比'count(1)'花費更長的時間,不是嗎?如果是,那麼使用'count(1)'會更好的表現方式。 :) – Yubaraj

+3

@Yubaraj數(1)用於獲得更好的性能比count(*),至少在某些DBMS,但現在的優化器能夠使COUNT(*),相當於數(1) – fthiella

10

現在 - 他們都應該執行相同。

儘管如此,COUNT(1)(或您選擇的任何常數)有時會推薦COUNT(*),因爲較差的查詢優化代碼會使數據庫在運行計數之前檢索所有字段數據。 COUNT(1)因此速度更快,但現在無關緊要。

相關問題