JuniorKỹ thuậtSQL
COUNT(*), COUNT(column) và COUNT(DISTINCT column) khác nhau như thế nào?
Thử trả lời trước
Đáp án mẫu
Sự khác biệt nằm ở cách mỗi dạng xử lý NULL và giá trị trùng.
COUNT(*)đếm số dòng, bất kể giá trị là gì.COUNT(column)đếm các dòng mà cột không NULL.COUNT(DISTINCT column)đếm số giá trị phân biệt và không NULL.
-- table t(x): 10, 10, NULL
SELECT COUNT(*) AS all_rows, -- 3
COUNT(x) AS non_null, -- 2
COUNT(DISTINCT x) AS distinct_x -- 1
FROM t;
COUNT(1) và COUNT(*) cho cùng kết quả, và optimizer hiện đại chạy chúng như nhau, nên hãy chọn COUNT(*) cho rõ ràng.
COUNT(DISTINCT ...) tốn kém hơn vì phải khử trùng bằng sort hoặc hash. Trên bảng lớn nó có thể là phần chậm của query, và đôi khi người ta dùng các hàm đếm xấp xỉ cho dashboard.
Sau một LEFT JOIN, hãy đếm một cột của bảng được join, vì COUNT(*) sẽ đếm dòng toàn NULL thành 1.
Hãy chọn dạng phù hợp bằng cách quyết định NULL và giá trị trùng có được tính hay không.
Ý chính
- COUNT(*) đếm mọi dòng
- COUNT(column) bỏ qua NULL
- COUNT(DISTINCT column) đếm giá trị duy nhất không NULL
- Đếm DISTINCT tốn thêm sort hoặc hash
Câu hỏi nối tiếp thường gặp
- COUNT(1) có nhanh hơn COUNT(*) không?
Lỗi thường gặp
- Tin rằng COUNT(1) nhanh hơn COUNT(*)
- Mong COUNT(column) tính cả các dòng NULL