“Select count (1) from table_name” trên bất kỳ bảng cơ sở dữ liệu nào có nghĩa là gì?


92

Khi chúng tôi thực thi select count(*) from table_namenó sẽ trả về số hàng.

Làm gì count(1)? Điều gì 1biểu thị ở đây? Điều này có giống với count(*)(vì nó cho cùng một kết quả khi thực thi)?


1
Câu hỏi thú vị. Tôi cũng quan tâm đến việc liệu câu trả lời có phụ thuộc vào việc triển khai hay không (ví dụ: liệu kết quả của truy vấn có giống trong SQL Server hay không trong Oracle).
Jon Schneider

Câu trả lời:


106

Tham số của hàm COUNT là một biểu thức được đánh giá cho mỗi hàng. Hàm COUNT trả về số hàng mà biểu thức cho giá trị khác rỗng. (* là một biểu thức đặc biệt không được đánh giá, nó chỉ trả về số hàng.)

Có hai công cụ sửa đổi bổ sung cho biểu thức: ALL và DISTINCT. Những điều này xác định xem các bản sao có bị loại bỏ hay không. Vì TẤT CẢ là mặc định nên ví dụ của bạn giống với số (TẤT CẢ 1), có nghĩa là các bản sao được giữ lại.

Vì biểu thức "1" cho giá trị khác rỗng cho mọi hàng và vì bạn không xóa các bản sao nên COUNT (1) phải luôn trả về cùng một số với COUNT (*).


Hãy nhớ select DISTINCT coloumn1 from table1! = Select count (DISTINCT coloumn1) from table1;
Kanagavelu Sugumar 13/02/13

Ngoài ra đếm (1) ở đây 1 không phải là coloumn no, nó là một biểu thức. ví dụ) chọn 1 từ bảng1; sẽ in 1 lần không có hàng nào trong bảng có.
Kanagavelu Sugumar

chọn số lượng (DISTINCT / ALL columnName) từ table1; sẽ không trả về tất cả / giá trị NOT NULL riêng biệt của cột (columnName).
Kanagavelu Sugumar

chọn DISTINCT cột1 từ bảng1; sẽ bao gồm một giá trị NULL trong cột (column1). chọn bộ đếm (DISTINCT coloumn1) từ bảng1; sẽ không bao gồm dù chỉ một hàng NULL.
Kanagavelu Sugumar

1
@datps - Trên thực tế, có vô số biểu thức không giới hạn cho cùng một kết quả. COUNT ('Hello, world!') Cũng sẽ hoạt động. (Tôi chưa thử.) Vậy câu hỏi đặt ra là, tại sao phải tạo một biểu thức đặc biệt (*) khi đã có vô số cách làm tương tự? Tôi không thể nói thay cho những người tạo ra SQL (những người có nhiều tội lỗi để chuộc lỗi :)), nhưng có lẽ vì vậy mọi người sẽ không phải tùy tiện chọn một biểu thức không rỗng. Điều đó sẽ làm xáo trộn ý định của tác giả truy vấn. "Tại sao họ lại viết 1 thay vì 2? Điều này chắc hẳn có nghĩa gì đó!"
Jeffrey L Whitledge

26

Đây là một liên kết sẽ giúp trả lời câu hỏi của bạn. Nói ngắn gọn:

count (*) là cách viết chính xác và số đếm (1) được TỐI ƯU HÓA ĐỂ ĐƯỢC đếm (*) bên trong - kể từ

a) đếm các hàng trong đó 1 không null kém hiệu quả hơn
b) đếm các hàng


17

Sự khác biệt giữa số đếm (*) và số đếm (1) trong tiên tri?

count (*) có nghĩa là nó sẽ đếm tất cả các bản ghi tức là từng và mọi ô NHƯNG

count (1) có nghĩa là nó sẽ thêm một cột giả có giá trị 1 và trả về số lượng tất cả các bản ghi


9

Điều này tương tự như sự khác biệt giữa

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Nếu bạn làm

SELECT 1 FROM table_name

nó sẽ cung cấp cho bạn số 1 cho mỗi hàng trong bảng. Vì vậy, có count(*)count(1)sẽ cung cấp kết quả giống như ý muốn count(8)hoặccount(column_name)


3
count (column_name) không hoàn toàn giống nhau - nó không đếm các hàng có null trong cột đó. Xem tại đây để biết chi tiết: stackoverflow.com/questions/169784
Blorgbeard ra mắt vào

Hmm, thực ra đó là dành cho SQL Server. Tôi cho là Oracle có thể hoạt động khác.
Blorgbeard ra mắt

Đếm không bao giờ được sử dụng giá trị NULL theo SQL tiêu chuẩn, ORacle và SQL Server phải có cùng hành vi về vấn đề này.
Thorsten

"tương tự như sự khác biệt giữa SELECT * FROM table_name và SELECT 1 FROM table_name." - không hẳn vậy. SELECT * và SELECT 1 khác nhau. SELECT (*) và SELECT (1) cho cùng một kết quả.
David Aldridge 8/10/08

7

Không có sự khác biệt.

COUNT(1)về cơ bản chỉ đếm một giá trị không đổi 1 cột cho mỗi hàng. Như những người dùng khác ở đây đã nói, nó giống như COUNT(0)hoặc COUNT(42). Mọi NULLgiá trị không phải là đủ.

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

Trình tối ưu hóa Oracle dường như đã sử dụng để có lỗi trong đó, điều này khiến số lượng bị ảnh hưởng bởi cột bạn chọn và liệu nó có nằm trong chỉ mục hay không, vì vậy quy ước COUNT (1) ra đời.


5
SELECT COUNT(1) from <table name>

nên làm điều tương tự như

SELECT COUNT(*)  from <table name>

Có thể đã có hoặc vẫn còn một số lý do tại sao nó hoạt động tốt hơn SELECT COUNT(*)trên một số cơ sở dữ liệu, nhưng tôi sẽ coi đó là một lỗi trong DB.

SELECT COUNT(col_name) from <table name>

tuy nhiên có một ý nghĩa khác, vì nó chỉ đếm các hàng có giá trị khác rỗng cho cột đã cho.


3

trong oracle, tôi tin rằng chúng có cùng ý nghĩa


Cột 1 có tham chiếu đến cột một không?
dacracot 8/10/08

1
không, 1 đề cập đến hằng số 1. Khi bạn nói, ORDER BY 1, nó đề cập đến cột một.
Thilo

đó là điều tôi đã thắc mắc một thời gian trước, nhưng bạn có thể chỉ định bất kỳ số nào lớn hơn số cột, kết quả vẫn giống nhau. Vì vậy, nó chắc chắn không phải là số cột.
Nrj

@dacracot: nó có thể nhưng tôi không tin như vậy. Từ những gì tôi hiểu oracle chỉ cần tái ghi đếm (1) là count (*) ở chế độ nền
Jarod Elliott

2

Bạn có thể kiểm tra như thế này:

create table test1(
 id number,
 name varchar2(20)
);

insert into test1 values (1,'abc');
insert into test1 values (1,'abc');

select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;

0

Tùy thuộc vào người bạn hỏi, một số người báo cáo rằng việc thực thi select count(1) from random_table;chạy nhanh hơn select count(*) from random_table. Những người khác khẳng định chúng hoàn toàn giống nhau.

Liên kết này tuyên bố rằng sự khác biệt về tốc độ giữa cả hai là do QUÉT BẢNG ĐẦY ĐỦ so với QUÉT ĐẦY ĐỦ NHANH.


Bạn đang hiểu sai liên kết. LS đang đưa ra quan điểm rằng COUNT (COLUMN) có thể giống và nhanh hơn COUNT (*), nhưng chỉ khi không có cột NOT NULL nào được lập chỉ mục nhưng COLUMN được lập chỉ mục và thực sự không có giá trị rỗng. Thêm một câu hỏi mẹo.
David Aldridge 8/10/08

1
Tôi đang cố gắng sử dụng liên kết để ghi lại tuyên bố rằng trong một số trường hợp, COUNT (1) có thể nhanh hơn COUNT (*). Một số câu trả lời trước đó đã đưa ra tuyên bố rằng không có sự khác biệt nào giữa hai câu trả lời và tôi đang cung cấp một ví dụ phản bác khả thi.
Johann Zacharee 8/10/08
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.