Trong SQL Server, COUNT()
hàm trả về số lượng mục được tìm thấy trong một nhóm. Bạn có thể sử dụng nó để tìm ra có bao nhiêu hàng trong một bảng hoặc tập hợp kết quả.
Cú pháp
Cú pháp như sau:
- Cú pháp hàm tổng hợp COUNT ({[[ALL | DISTINCT] biểu thức] | *}) - Cú pháp hàm phân tích COUNT ([TẤT CẢ] {biểu thức | *}) OVER ([])
ALL
áp dụng hàm tổng hợp cho tất cả các giá trị. Đây là giá trị mặc định.
DISTINCT
chỉ định rằng hàm trả về số lượng giá trị không rỗng duy nhất.
expression
là một biểu thức thuộc bất kỳ loại nào, ngoại trừ hình ảnh , ntext hoặc văn bản . Hàm tổng hợp và truy vấn con không được hỗ trợ trong biểu thức.
*
chỉ định rằng tất cả các hàng phải được đếm và trả về, bao gồm các hàng trùng lặp và các hàng chứa giá trị rỗng. COUNT(*)
không có tham số và không hỗ trợ việc sử dụng DISTINCT
. Nó cũng không yêu cầu biểu thức (vì nó không sử dụng thông tin về bất kỳ cột cụ thể nào).
OVER ( [ <partition_by_clause> ]
chia tập hợp kết quả được tạo ra bởi FROM
mệnh đề thành các phân vùng mà hàm được áp dụng. Nếu không được chỉ định, hàm sẽ coi tất cả các hàng của tập hợp kết quả truy vấn là một nhóm duy nhất.
Ví dụ 1 - Cách sử dụng cơ bản
Dưới đây là một ví dụ cơ bản cho thấy chức năng này hoạt động như thế nào:
CHỌN ĐẾM (*) NHƯ 'Số hàng'FROM Nghệ sĩ;
Kết quả:
+ ------------- + | Số hàng || ------------- || 16 | + ------------- +
Trong trường hợp này, có 16 hàng trong Nghệ sĩ bảng.
Để chắc chắn, chúng đây:
CHỌN * TỪ Nghệ sĩ;
Kết quả:
+ ------------ + ------------------------ + -------- ------ + ------------- + | ArtistId | ArtistName | ActiveFrom | CountryId || ------------ + ------------------------ + --------- ----- + ------------- || 1 | Iron Maiden | 1975-12-25 | NULL || 2 | AC / DC | Năm 1973-01-11 | NULL || 3 | Allan Holdsworth | 1969-01-01 | NULL || 4 | Bạn thân Rich | Ngày 1919-01-01 | NULL || 5 | Devin Townsend | Năm 1993-01-01 | NULL || 6 | Jim Reeves | Năm 1948-01-01 | NULL || 7 | Tom Jones | Năm 1963-01-01 | NULL || 8 | Maroon 5 | Năm 1994-01-01 | NULL || 9 | Kịch bản | 2001-01-01 | NULL || 10 | Lít | Năm 1988-06-26 | NULL || 11 | Ngày sabát đen | Năm 1968-01-01 | NULL || 12 | Michael Học cách đá | Năm 1988-03-15 | NULL || 13 | Carabao | Năm 1981-01-01 | NULL || 14 | Karnivool | 1997-01-01 | NULL || 15 | Chim Tokyo | 2004-01-01 | NULL || 16 | Bodyjar | Năm 1990-01-01 | NULL | + ------------ + ------------------------ + --------- ----- + ------------- +
Như mong đợi, 16 hàng được trả về.
Lưu ý rằng CountryId cột không chứa gì ngoài các giá trị rỗng. Điều này sẽ hữu ích cho ví dụ tiếp theo.
Ví dụ 2 - Chỉ định một cột
Ví dụ trước đã sử dụng dấu hoa thị (*
) để chỉ định tất cả các hàng. Điều này dẫn đến việc tất cả các hàng đều được tính, bất kể có trùng lặp hay có chứa giá trị rỗng.
Bạn cũng có thể chỉ định một cột cụ thể. Khi bạn làm điều này, các giá trị rỗng sẽ không được tính. Nghĩa là, bất kỳ hàng nào chứa giá trị rỗng cho cột đó đều không được tính.
Đây là một ví dụ sử dụng CountryId như đã đề cập trong ví dụ trước:
CHỌN ĐẾM (CountryId) NHƯ 'Số lượng hàng' Nghệ sĩ FROM;
Kết quả:
+ ------------- + | Số hàng || ------------- || 0 | + ------------- +
Như chúng ta đã thấy trong ví dụ trước, tất cả các hàng cho cột này là NULL
. Do đó, số hàng kết quả bằng không.
Hãy thêm một số giá trị vào cột đó:
CẬP NHẬT ArtistsSET CountryId =2WHERE ArtistName IN ('AC / DC', 'Karnivool', 'Birds of Tokyo', 'Bodyjar');
Bây giờ chúng ta hãy đếm lại các hàng cho cột đó:
CHỌN ĐẾM (CountryId) NHƯ 'Số lượng hàng' Nghệ sĩ FROM;
Kết quả:
+ ------------- + | Số hàng || ------------- || 4 | + ------------- +
Ví dụ 3 - Với DISTINCT
Ví dụ này sử dụng DISTINCT
mệnh đề chỉ trả về các hàng riêng biệt (tức là không trùng lặp).
Trong ví dụ trước, tôi đã cập nhật bảng sao cho cùng một
CountryId
đã được áp dụng cho bốn nghệ sĩ (tôi đã sử dụng SET CountryId = 2
cho cả bốn nghệ sĩ). Điều này dẫn đến bốn hàng có cùng
CountryId
.
Đây là điều sẽ xảy ra nếu tôi đếm có bao nhiêu CountryId riêng biệt s trong bảng đó:
SELECT COUNT (DISTINCT CountryId) 'Các nghệ sĩ FROM quốc gia riêng biệt';
Kết quả:
+ ----------------------- + | CountryIds riêng biệt || ----------------------- || 1 | + ----------------------- +
Điều này được mong đợi, bởi vì, mặc dù có bốn hàng với CountryId , nó vẫn chỉ là một CountryId riêng biệt .
Để chắc chắn, hãy chạy nó cùng với phiên bản “không khác biệt” của nó:
CHỌN COUNT (CountryId) 'Không riêng biệt', COUNT (DISTINCT CountryId) 'Riêng biệt' Nghệ sĩ FROM;
Kết quả:
+ ---------------- + ------------ + | Không phân biệt | Riêng biệt || ---------------- + ------------ || 4 | 1 | + ---------------- + ------------ +
Vì vậy, phiên bản không khác biệt hiển thị số lần
CountryId
xuất hiện trong bảng, trong khi DISTINCT
phiên bản tính nhiều lần xuất hiện là 1.
Hãy thêm một CountryId khác vào bảng:
CẬP NHẬT ArtistsSET CountryId =1WHERE ArtistName ='Carabao';
Và bây giờ hãy chạy lại truy vấn:
CHỌN COUNT (CountryId) 'Không riêng biệt', COUNT (DISTINCT CountryId) 'Riêng biệt' Nghệ sĩ FROM;
Kết quả:
+ ---------------- + ------------ + | Không phân biệt | Riêng biệt || ---------------- + ------------ || 5 | 2 | + ---------------- + ------------ +
Ví dụ 4 - Sử dụng mệnh đề WHERE
Dưới đây là một ví dụ nhanh về việc sử dụng WHERE
mệnh đề.
SELECT COUNT (*) AS 'Row Count'FROM ArtistsWHERE ActiveFrom> =' 2000-01-01 ';
Kết quả:
+ ------------- + | Số hàng || ------------- || 2 | + ------------- +
Ví dụ 5 - Với GROUP BY
Dưới đây là ví dụ về việc nhóm các nghệ sĩ trong một cột, sau đó đếm tất cả các album cho từng nghệ sĩ trong cột kia.
Ví dụ:
SELECT ArtistName, COUNT (al.AlbumId) 'Number of Albums'FROM Nghệ sĩ arINNER THAM GIA Album alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY' Number of Albums 'DESC;
Kết quả:
+ ------------------------ + -------------------- + | ArtistName | Số lượng Album || ------------------------ + -------------------- || Iron Maiden | 5 || Michael Học cách đá | 3 || Kịch bản | 3 || Tom Jones | 3 || Devin Townsend | 3 || Allan Holdsworth | 2 || Bạn thân Rich | 1 || AC / DC | 1 || Jim Reeves | 1 | + ------------------------ + -------------------- +
Ví dụ 6 - Với mệnh đề HAVING
Chúng tôi có thể điều chỉnh ví dụ trước để chỉ bao gồm những nghệ sĩ có nhiều hơn một số lượng album nhất định. Chúng tôi có thể thực hiện việc này bằng cách sử dụng HAVING
mệnh đề.
SELECT ArtistName, COUNT (al.AlbumId) 'Number of Albums'FROM Artists arINNER THAM GIA Album alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameHAVING COUNT (al.AlbumId)> 2ORDER BY' Number of Album 'DESC;Kết quả:
+ ------------------------ + -------------------- + | ArtistName | Số lượng Album || ------------------------ + -------------------- || Iron Maiden | 5 || Michael Học cách đá | 3 || Kịch bản | 3 || Tom Jones | 3 || Devin Townsend | 3 | + ------------------------ + -------------------- +Ví dụ 7 - Phân vùng với Mệnh đề OVER
Bạn có thể sử dụng
OVER
mệnh đề cóPARTITION BY
để chia kết quả thành các phân vùng.Trong ví dụ này, tôi sử dụng
OVER (PARTITION BY ArtistName)
để liệt kê từng album mà nghệ sĩ đã sản xuất, cũng như tổng số album của nghệ sĩ đó.CHỌN ArtistName, AlbumName, COUNT (AlbumId) OVER (PARTITION BY ArtistName) 'Số lượng Album từ Nghệ sĩ này'FROM Nghệ sĩ arINNER THAM GIA Album alON al.ArtistId =ar.ArtistIdORDER THEO' Số lượng Album từ Nghệ sĩ này 'DESC;Kết quả:
+ ------------------------ + --------------------- ----- + ------------------------------------- + | ArtistName | AlbumName | Số lượng album của nghệ sĩ này || ------------------------ + ----------------- --------- + ------------------------------------- || Iron Maiden | Powerslave | 5 || Iron Maiden | Một nơi nào đó trong thời gian | 5 || Iron Maiden | Piece of Mind | 5 || Iron Maiden | Kẻ giết người | 5 || Iron Maiden | Không cầu nguyện cho người chết | 5 || AC / DC | Nguồn điện | 3 || AC / DC | Trở lại màu đen | 3 || AC / DC | Rock hoặc Bust | 3 || Michael Học cách đá | Đêm xanh | 3 || Michael Học cách đá | Vĩnh cửu | 3 || Michael Học cách đá | Scandinavia | 3 || Devin Townsend | Ziltoid the Omniscient | 3 || Devin Townsend | Thương vong của Cool | 3 || Devin Townsend | Epicloud | 3 || Tom Jones | Vali Lâu Mất | 3 || Tom Jones | Khen ngợi và Đổ lỗi | 3 || Tom Jones | Cùng Came Jones | 3 || Allan Holdsworth | Sai Cả Đêm | 2 || Allan Holdsworth | Mười sáu người đàn ông của Tain | 2 || Bạn thân Rich | Big Swing Face | 1 || Jim Reeves | Hát Xuống Ngõ | 1 || Kịch bản | Không Có Âm Thanh Không Có Im Lặng | 1 | + ------------------------ + ---------------------- ---- + ------------------------------------- +Lưu ý rằng điều này khiến số lượng nghệ sĩ và album được lặp lại trên nhiều hàng, nhưng điều này xảy ra khi chúng tôi cũng muốn liệt kê từng album trên hàng riêng của nó.
Ví dụ 8 - Với STRING_AGG ()
Nếu bạn không muốn mỗi nghệ sĩ và số lượng album bị lặp lại trên nhiều hàng như trong ví dụ trước, bạn luôn có thể sử dụng
STRING_AGG()
chức năng xuất các album dưới dạng danh sách. Trong trường hợp này, bạn không cầnOVER
mệnh đề.Ví dụ:
SELECT ArtistName, STRING_AGG (AlbumName, ',') 'Albums', COUNT (AlbumId) 'Count'FROM Artists arINNER THAM GIA Album alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY' Count 'DESC;Kết quả:
+ ------------------------ + --------------------- -------------------------------------------------- --------- + --------- + | ArtistName | Album | Tính || ------------------------ + ---------------------- -------------------------------------------------- -------- + --------- || Iron Maiden | Powerslave, Đâu đó trong thời gian, Mảnh ghép tâm trí, Kẻ giết người, Không cầu nguyện cho người chết | 5 || AC / DC | Powererage, Back in Black, Rock or Bust | 3 || Michael Học cách đá | Blue Night, Eternity, Scandinavia | 3 || Devin Townsend | Ziltoid the Omniscient, Tai nạn của Cool, Epicloud | 3 || Tom Jones | Chiếc vali bị mất từ lâu, Khen ngợi và Đổ lỗi, Cùng đến với Jones | 3 || Allan Holdsworth | All Night Sai, Mười sáu người đàn ông của Tain | 2 || Bạn thân Rich | Big Swing Face | 1 || Jim Reeves | Hát Xuống Ngõ | 1 || Kịch bản | Không Có Âm Thanh Không Có Im Lặng | 1 | + ------------------------ + ---------------------- -------------------------------------------------- -------- + --------- +RẤT NHIỀU Hàng?
COUNT()
hàm trả về kết quả của nó dưới dạng int loại dữ liệu. Nếu bạn có quá nhiều hàng mà kết quả lớn hơn giá trị của int có thể xử lý, hãy thửCOUNT_BIG()
thay vào đó.
COUNT_BIG()
hoạt động giống nhưCOUNT()
, ngoại trừ việc kết quả của nó được trả về dưới dạng bigint giá trị kiểu dữ liệu.Bạn cũng có thể cân nhắc sử dụng
APPROX_COUNT_DISTINCT()
trong vài trường hợp.
APPROX_COUNT_DISTINCT()
trả về một giá trị gần đúng, thay vì một giá trị chính xác. Tuy nhiên, nó được thiết kế để đáp ứng nhanh hơn nhiều so vớiCOUNT()
vàCOUNT_BIG()
, vì vậy nó có thể hữu ích trong những thời điểm mà khả năng phản hồi quan trọng hơn độ chính xác.Nó được thiết kế để trả về các giá trị duy nhất, không rỗng, vì vậy nó sẽ chỉ phù hợp cho những thời điểm mà bạn thường sử dụng
DISTINCT
mệnh đề vớiCOUNT_BIG()
.Cũng lưu ý rằng, tại thời điểm viết
APPROX_COUNT_DISTINCT()
đang ở trạng thái xem trước công khai.