2013-08-17 44 views
24

Gần đây tôi đã được hỏi câu hỏi này trong một cuộc phỏng vấn. Tôi đã thử điều này trong mySQL, và có kết quả tương tự (kết quả cuối cùng). Tất cả đã cho số hàng trong bảng cụ thể đó. Bất cứ ai có thể giải thích sự khác biệt lớn giữa chúng.Sự khác biệt giữa số (0), số (1) .. và đếm (*) trong mySQL/SQL là gì?

+1

Có giá trị 'null' trong cột. Sau đó thực hiện đếm trên cột. Xem cách tính số lượng khác nhau. Chọn '0' hoặc '1' chỉ là chọn hằng số cho mỗi hàng, không có' null' nào được tham gia. – Glenn

+0

có thể trùng lặp của [Trong SQL, sự khác nhau giữa số (cột) và số (\ *) là gì?] (Http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn -and-count) – newtover

Trả lời

30

Không có gì thực sự, trừ khi bạn chỉ định một trường trong một bảng hoặc một biểu thức trong parantheses thay vì giá trị không đổi hoặc *

Hãy để tôi cung cấp cho bạn một câu trả lời chi tiết. Đếm sẽ cung cấp cho bạn số bản ghi không trống của trường đã cho. Giả sử bạn có một bảng có tên A

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

tất cả sẽ trả về cùng số lượng bản ghi, đó là số hàng trong bảng A. Tuy nhiên, đầu ra khác nhau. Nếu có 3 bản ghi trong bảng. Với X và Y là tên trường

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) 

Vì vậy, cả ba truy vấn đều trả về cùng một số. Trừ khi bạn sử dụng

select count(Y) from A 

vì chỉ có một giá trị null không bạn sẽ nhận được 1 như sản lượng

+1

Vậy tại sao chính xác là các giá trị tích phân được chuyển đến hàm đếm? – Dhruv

+0

@DhruvSingh cung cấp cho bạn chi tiết hơn trong câu trả lời của tôi – Bren

+0

@Bren có sự khác biệt nào về hiệu suất không? –

20

COUNT(*) sẽ đếm số lượng hàng, trong khi COUNT(expression) sẽ được tính giá trị khác null trong biểu và COUNT(column) sẽ đếm tất cả các giá trị không null trong cột.

Vì cả 0 và 1 đều là giá trị không null, COUNT(0)=COUNT(1) và cả hai đều tương đương với số hàng COUNT(*). Đó là một khái niệm khác, nhưng kết quả sẽ giống nhau.

+0

Cảm ơn fthiella. @brhneser có một câu trả lời cho nhiều người mới bắt đầu như tôi. – Dhruv

+1

Có bạn đúng nhưng tôi nghĩ 'count (*)' sẽ mất nhiều thời gian hơn 'count (1)', phải không? Nếu có thì sử dụng 'count (1)' sẽ tốt hơn cho cách thực hiện. :) – Yubaraj

+3

@Yubaraj đếm (1) được sử dụng để có hiệu suất tốt hơn số (*), ít nhất là trên một số dbms, nhưng ngày nay trình tối ưu hóa có thể tính (*) tương đương với số (1) – fthiella

10

Hiện tại - tất cả chúng nên hoạt động giống nhau. Tuy nhiên, trong những ngày trôi qua, COUNT (1) (hoặc bất kỳ hằng số nào bạn chọn) đôi khi được đề xuất trên COUNT (*) vì mã tối ưu hóa truy vấn kém sẽ làm cho cơ sở dữ liệu truy xuất tất cả dữ liệu trường trước khi chạy số đếm . COUNT (1) do đó nhanh hơn, nhưng bây giờ nó không quan trọng.

Các vấn đề liên quan