Khi chúng tôi thực thi select count(*) from table_name
nó sẽ trả về số hàng.
Làm gì count(1)
? Điều gì 1
biể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)?
Khi chúng tôi thực thi select count(*) from table_name
nó sẽ trả về số hàng.
Làm gì count(1)
? Điều gì 1
biể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)?
Câu trả lời:
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 (*).
Đâ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
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
Đ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(*)
và count(1)
sẽ cung cấp kết quả giống như ý muốn count(8)
hoặccount(column_name)
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 NULL
giá 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.
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.
trong oracle, tôi tin rằng chúng có cùng ý nghĩa
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;
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.