Hàm COUNT() là một trong những hàm tổng hợp phổ biến và hữu ích nhất trong SQL. Nhiệm vụ chính của nó là đếm số dòng trong kết quả truy vấn. Nếu COUNT() là siêu anh hùng trong thế giới SQL, thì siêu năng lực của nó là trả lời nhanh các câu hỏi như:
- Có bao nhiêu nhân viên đang làm việc trong công ty?
- Có bao nhiêu sinh viên đang học ở mỗi khoa?
- Có bao nhiêu sản phẩm đã bán trong tháng vừa rồi?
Cú pháp của COUNT() khá đơn giản:
COUNT(cột)
trong đó cột là tên cột mà bạn muốn đếm số dòng có giá trị. Nhưng còn có các cách dùng khác nữa, mình sẽ giải thích tiếp trong bài này.
Giờ mình bắt đầu với cách dùng cơ bản nhất của COUNT() nhé.
Trường hợp 1: Đếm tất cả các dòng với COUNT(*)
Khi bạn muốn đếm mọi dòng trong bảng, bất kể có dữ liệu hay không, hãy dùng COUNT(*). Dấu * nghĩa là “tất cả các cột”.
Ví dụ: Có bảng students với dữ liệu như sau:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Chạy truy vấn sau:
SELECT COUNT(*)
FROM students;
Kết quả:
| count |
|---|
| 4 |
Hàm COUNT(*) không quan tâm đến giá trị NULL trong các cột riêng lẻ, vì nó chỉ đơn giản đếm số dòng trong bảng thôi.
Trường hợp 2: Đếm dòng có giá trị trong một cột với COUNT(column)
Nhưng nếu bạn chỉ muốn đếm những dòng mà cột cụ thể không phải là NULL thì sao? Lúc này dùng COUNT(column).
Ví dụ: Đếm số sinh viên có tên được ghi.
SELECT COUNT(name)
FROM students;
Kết quả:
| count |
|---|
| 3 |
Thấy sự khác biệt chưa? Bảng có 4 dòng, nhưng một dòng cột name là NULL. Hàm COUNT(column) sẽ bỏ qua các dòng mà giá trị cột là NULL.
So sánh COUNT(*) và COUNT(column)
Vậy chính xác thì hai cách dùng này khác nhau thế nào: COUNT(*) và COUNT(column)?
COUNT(*)đếm tất cả các dòng trong bảng, kể cả dòng cóNULLở bất kỳ cột nào.COUNT(column)chỉ đếm những dòng mà giá trị ở cột chỉ định khác NULL.
Bảng ví dụ:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Các truy vấn:
-- Đếm tất cả các dòng.
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (tất cả dòng)
-- Đếm chỉ các dòng có tên khác NULL.
SELECT COUNT(name) FROM students; -- 3 -- Đếm dòng có tên
-- Đếm chỉ các dòng có tuổi khác NULL.
SELECT COUNT(age) FROM students; -- 3 -- Đếm dòng có tuổi
Trường hợp 3: Đếm giá trị duy nhất với COUNT(DISTINCT column)
Đôi khi bạn cần đếm số giá trị duy nhất trong một cột. Ví dụ, muốn biết có bao nhiêu tuổi khác nhau của sinh viên. Lúc này dùng COUNT(DISTINCT column).
Ví dụ:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
Kết quả:
| count |
|---|
| 3 |
Lưu ý là DISTINCT không chỉ bỏ qua giá trị trùng mà còn bỏ qua NULL luôn nhé.
Nếu bạn thử dùng DISTINCT với COUNT(*) sẽ bị lỗi: DISTINCT chỉ dùng được với cột cụ thể thôi.
Ví dụ dùng COUNT() trong thực tế
Ví dụ 1. Đếm số sinh viên
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
Kết quả:
| total_students |
|---|
| 4 |
Ví dụ 2. Đếm sinh viên có tuổi
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
Kết quả:
| students_with_age |
|---|
| 3 |
Ví dụ 3. Đếm số tuổi duy nhất
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
Kết quả:
| unique_ages |
|---|
| 2 |
Các lỗi phổ biến khi dùng COUNT()
Nghĩ rằng COUNT(column) sẽ đếm tất cả dòng kể cả khi có NULL.
Không phải đâu nhé: COUNT(column) sẽ bỏ qua dòng có NULL ở cột đó.
Dùng COUNT(*) để đếm giá trị duy nhất.
Thay vào đó hãy dùng COUNT(DISTINCT column).
Quên lọc dữ liệu khi đếm cụ thể.
Ví dụ:
SELECT COUNT(*) FROM students WHERE age > 20;
Lúc này bạn chỉ nhận được sinh viên lớn hơn 20 tuổi thôi, vì WHERE đã lọc dòng trước khi đếm rồi.
Những chi tiết nhỏ này dễ gây lỗi logic trong truy vấn lắm. Nhớ chú ý nha!
GO TO FULL VERSION