CodeGym /Các khóa học /SQL SELF /Đếm số dòng với COUNT() và các biến thể của nó

Đếm số dòng với COUNT() và các biến thể của nó

SQL SELF
Mức độ, Bài học
Có sẵn

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!

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Đếm tất cả các dòng trong bảng
Đếm tất cả các dòng trong bảng
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Đếm số dòng có giá không bằng 0
Đếm số dòng có giá không bằng 0
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION