2011-12-06 29 views
7

Tôi có một cơ sở dữ liệu, database1, với hai bảng (Table 1, Table2) trong đó.CHỌN COUNT (*);

Có 3 hàng ở Table1 và 2 hàng ở Table2. Bây giờ nếu tôi thực hiện truy vấn SQL sau đây SELECT COUNT(*); trên database1, thì đầu ra là "1".

Có ai có ý tưởng này không, điều này "1" có nghĩa là gì?

Định nghĩa của hai bảng như sau.

CREATE TABLE Table1 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 

CREATE TABLE Table2 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 
+0

Truy vấn chính xác là gì? – Reactormonk

+0

Tôi nghĩ không có gì hơn 'SELECT COUNT (*)', không có tên bảng. Luôn luôn là 1 – Matten

+0

Hi Tass, truy vấn là, khi tôi thực hiện truy vấn sql "Chọn Đếm (*)", thì đầu ra là 1. Điều này có nghĩa là gì 1. Xin lưu ý, không có tên bảng được chỉ định trong truy vấn. – IsmailBaig

Trả lời

0

không tên bảng nó luôn luôn quay trở lại 1 cho dù đó bất kỳ cơ sở dữ liệu ....

2

Đó là vì bạn đã thực hiện select count(*) mà không chỉ định một bảng.

Hàm đếm trả về số hàng trong bộ dữ liệu được chỉ định. Nếu bạn không chỉ định một bảng để chọn, một lựa chọn duy nhất sẽ chỉ trả về một hàng duy nhất - do đó count(*) sẽ trả về 1. (Trong một số phiên bản của SQL, chẳng hạn như Oracle, bạn để chỉ định bảng hoặc tương tự Oracle bao gồm một bảng giả (được gọi là DUAL) có thể được chọn từ khi không có bảng cụ thể nào được yêu cầu.)

1

bạn sẽ không thực hiện một phép chọn (*) mà không chỉ định bảng để truy vấn. Máy chủ cơ sở dữ liệu của bạn có thể cho bạn một số "1" dựa trên bảng hệ thống mặc định mà nó đang truy vấn.

Hãy thử sử dụng

select count(*) from Table1 

Nếu không có một tên bảng nó làm cho không có ý nghĩa.

0

Vì thẻ này được gắn thẻ máy chủ SQL, trạng thái MSDN.

COUNT luôn trả về giá trị loại dữ liệu int.

Ngoài ra,

COUNT (*) trả về số lượng các mục trong một nhóm. Điều này bao gồm NULL giá trị và trùng lặp.

Do đó, vì bạn không cung cấp bảng để làm một số COUNT từ, mặc định (giả định) là nó trả về 1.

+0

Có lý do nào tại sao nó phải trả về một thay vì không? –

+1

@LukeGirvin có, lựa chọn trần hoạt động như thể chạy với một bảng có một hàng. Hãy nhìn vào câu trả lời của tôi. –

6

Thông thường tất cả Selects có dạng SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]

Bởi vì điều này cho phép tính toán vô hướng đơn giản chúng ta có thể làm điều gì đó như SELECT 1 + 1 FROM SomeTable và nó sẽ trả về một recordset với giá trị 2 cho mỗi hàng trong bảng SomeTable.

Bây giờ, nếu chúng tôi không quan tâm đến bất kỳ bảng nào, nhưng chỉ muốn thực hiện phép tính vô hướng của chúng tôi, chúng tôi có thể muốn làm điều gì đó như SELECT 1 + 1. Điều này không được phép theo tiêu chuẩn, nhưng nó rất hữu ích và hầu hết các cơ sở dữ liệu cho phép nó (Oracle không trừ khi nó được thay đổi gần đây, ít nhất là nó được sử dụng để không).

Do đó, các lệnh SELECT trần như vậy được xử lý như thể chúng có mệnh đề từ được chỉ định một bảng có một hàng và không có cột (dĩ nhiên là không thể, nhưng nó thực hiện thủ thuật). Do đó, SELECT 1 + 1 trở thành SELECT 1 + 1 FROM ImaginaryTableWithOneRow trả về một hàng duy nhất có một cột với giá trị 2.

Chủ yếu là chúng ta không nghĩ về điều này, chúng ta chỉ quen với thực tế là các lệnh SELECT cho kết quả và thậm chí không nghĩ đến thực tế rằng phải có một số hàng được chọn để trả về một hàng.

Bằng cách SELECT COUNT(*) bạn đã tương đương với SELECT COUNT(*) FROM ImaginaryTableWithOneRow trong đó tất nhiên trả về 1.

6

Cùng dòng tương tự sau đây cũng trả về một kết quả.

SELECT 'test' 
WHERE EXISTS (SELECT *) 

Giải thích cho hành vi đó (từ this Connect item) cũng áp dụng cho câu hỏi của bạn.

Trong ANSI SQL, một tuyên bố SELECT mà không FROM khoản không được phép - bạn cần phải xác định một nguồn bảng. Vì vậy, câu lệnh "SELECT 'test' WHERE EXISTS(SELECT *)" phải cung cấp lỗi cú pháp. Đây là hành vi chính xác .

Đối với việc triển khai SQL Server, điều khoản FROM là tùy chọn và nó luôn hoạt động theo cách này. Vì vậy, bạn có thể làm "SELECT 1" hoặc "SELECT @v" và cứ thế mà không yêu cầu bảng. Trong các hệ thống cơ sở dữ liệu khác, có một bảng giả gọi là "DUAL" với một hàng được sử dụng để làm như vậy SELECT câu như "SELECT 1 FROM dual;" hoặc "SELECT @v FROM dual;". Bây giờ, đến mệnh đề EXISTS - danh sách dự án không quan trọng về cú pháp hoặc kết quả của truy vấn và SELECT * hợp lệ trong truy vấn phụ. Hãy kết hợp điều này với thực tế mà chúng tôi cho phép SELECT mà không cần FROM, bạn sẽ nhận được hành vi mà bạn xem. Chúng tôi có thể sửa chữa nó nhưng không có nhiều giá trị trong việc thực hiện nó và nó có thể phá vỡ mã ứng dụng hiện tại.

0

COUNT chức năng trả về số hàng là kết quả. Nếu bạn không chỉ định bất kỳ bảng nào, nó trả về 1 theo mặc định. tức là, COUNT(*), COUNT(1), COUNT(2), ... sẽ luôn trả lại 1.

-1
Select * 

không có mệnh đề từ là "Chọn TẤT CẢ từ vũ trụ" vì bạn đã lọc không có gì. Trong trường hợp của bạn, bạn đang hỏi "Có bao nhiêu vũ trụ?" Đây chính là cách tôi sẽ dạy nó. Tôi sẽ viết lên bảng vào ngày đầu tiên, Chọn * và hỏi ý nghĩa của nó. Trả lời: Hãy cho tôi thế giới. Và từ đó tôi sẽ dạy cách lọc vũ trụ xuống một cái gì đó có ý nghĩa.

Tôi phải thừa nhận, tôi chưa bao giờ nghĩ đến Select Count (*), điều này sẽ khiến nó thú vị hơn nhưng vẫn mang lại câu trả lời thực sự. Chúng ta chỉ có một thế giới.
Nếu không có tư vấn Steven Hawking, SQL sẽ phải đối mặt với chỉ 1.

Kết quả của truy vấn là chính xác.