VISEN GROUP
Technology & Engineering

COUNT(*) và COUNT(column): Vì sao cùng là COUNT nhưng kết quả có thể khác nhau?

September 20, 20262 min readUncategorized

Khi cần đếm dữ liệu trong SQL, nhiều bạn thường dùng COUNT() theo thói quen mà không để ý bên trong đang đếm dòng hay giá trị khác NULL.

Đây là một khác biệt nhỏ nhưng rất dễ xuất hiện trong câu hỏi phỏng vấn SQL.

1. COUNT(*) và COUNT(column) khác nhau thế nào?

Giả sử có bảng employees:

idnamedepartment
1AnIT
2BìnhIT
3CườngNULL
4DũngHR

COUNT(*)

SELECT COUNT(*)
FROM employees;

Kết quả:

COUNT(*)
4

COUNT(*) đếm tất cả các dòng trong kết quả truy vấn, kể cả những dòng có giá trị NULL.

COUNT(column)

SELECT COUNT(department)
FROM employees;

Kết quả:

COUNT(department)
3

Ở đây department của Cường là NULL, nên dòng này không được tính.

Có thể nhớ đơn giản:

COUNT(*) → đếm dòng
COUNT(column) → đếm giá trị khác NULL của column


2. Điểm dễ nhầm lẫn khi dùng với GROUP BY

Ví dụ muốn thống kê số nhân viên theo phòng ban:

SELECT department, COUNT(*)
FROM employees
GROUP BY department;

Kết quả:

departmentCOUNT(*)
IT2
HR1
NULL1

Nếu sử dụng:

SELECT department, COUNT(department)
FROM employees
GROUP BY department;

Kết quả sẽ là:

departmentCOUNT(department)
IT2
HR1
NULL0

Tại sao nhóm NULL có 1 dòng nhưng COUNT(department) lại bằng 0?

Bởi vì COUNT(department) không đếm số dòng của nhóm. Nó chỉ đếm những giá trị department khác NULL.

Đây là lý do trong các bài thống kê dữ liệu, COUNT(*) thường là lựa chọn dễ hiểu hơn khi mục tiêu thực sự là đếm số dòng.


3. Khi nào nên dùng COUNT(*) và COUNT(column)?

Có thể áp dụng quy tắc khá đơn giản:

Bạn muốn biếtNên dùng
Có bao nhiêu dòng?COUNT(*)
Có bao nhiêu giá trị không NULL?COUNT(column)
Đếm số nhân viên trong mỗi phòng banCOUNT(*)
Đếm số nhân viên đã có emailCOUNT(email)
Đếm số giá trị khác NULL của một cộtCOUNT(column)

Ví dụ:

SELECT COUNT(*)
FROM employees;

→ Có bao nhiêu nhân viên trong bảng?

Còn:

SELECT COUNT(email)
FROM employees;

→ Có bao nhiêu nhân viên đã có email?

Hai câu hỏi khác nhau nên kết quả hoàn toàn có thể khác nhau.


Tóm lại

COUNT(*)       → Đếm dòng
COUNT(column)  → Đếm giá trị khác NULL

Nếu mục tiêu của bạn là đếm số dòng, hãy nghĩ đến COUNT(*).

Nếu mục tiêu là đếm số giá trị thực sự tồn tại trong một cột, hãy dùng COUNT(column).

Leave a Reply

Your email address will not be published. Required fields are marked *