- 1 1. Giới thiệu
- 2 2. Các cơ bản của việc đếm dữ liệu trong MySQL (COUNT)
- 3 3. Lấy dữ liệu mà không có bản sao (DISTINCT)
- 4 4. Cách sử dụng COUNT(DISTINCT column_name)
- 5 5. Sử dụng COUNT(DISTINCT) với nhiều cột
- 6 6. Tối ưu hiệu năng cho COUNT(DISTINCT)
- 7 7. Các lỗi thường gặp và giải pháp cho COUNT(DISTINCT)
- 8 8. Câu Hỏi Thường Gặp (FAQ)
- 9 9. Kết Luận
1. Giới thiệu
Khi quản lý cơ sở dữ liệu, bạn có thể gặp phải các tình huống như, “Có bao nhiêu quốc gia khác nhau đã được đăng ký?” hoặc “Có bao nhiêu địa chỉ email duy nhất?”
Trong những trường hợp như vậy, bạn có thể sử dụng MySQL’s COUNT(DISTINCT column_name) để lấy số lượng bản ghi trong khi loại bỏ các bản sao.
Bài viết này giải thích chi tiết các chủ đề sau:
- Các cơ bản của
COUNT()vàDISTINCT - Cách sử dụng đúng
COUNT(DISTINCT column_name) - Cách đếm các giá trị duy nhất qua nhiều cột
- Cách cải thiện hiệu suất của
COUNT(DISTINCT)
Ngay cả người mới bắt đầu cũng có thể dễ dàng hiểu hướng dẫn này, vì chúng tôi giải thích mọi thứ với các ví dụ thực tế và truy vấn SQL. Hãy chắc chắn đọc đến cuối.
2. Các cơ bản của việc đếm dữ liệu trong MySQL (COUNT)
Khi phân tích dữ liệu trong cơ sở dữ liệu, hàm cơ bản nhất là COUNT().
Hãy trước tiên hiểu cách COUNT() hoạt động.
2.1 Sự khác biệt giữa COUNT(*) và COUNT(column_name)
Hàm COUNT() trong MySQL có thể được sử dụng theo hai cách sau:
| COUNT Function | Description |
|---|---|
COUNT(*) | Counts all records in the table (including NULL values) |
COUNT(column_name) | Counts non-NULL values in a specific column |
2.2 Các ví dụ cơ bản về COUNT()
Ở đây, chúng tôi sẽ sử dụng bảng users sau làm ví dụ:
| id | name | country | |
|---|---|---|---|
| 1 | Taro | taro@example.com | Japan |
| 2 | Hanako | hanako@example.com | Japan |
| 3 | John | NULL | United States |
| 4 | Tanaka | tanaka@example.com | Japan |
① Lấy tổng số bản ghi trong bảng
SELECT COUNT(*) FROM users;
→ Kết quả: 4 (Tổng số bản ghi)
② Lấy số lượng giá trị không phải NULL trong một cột cụ thể
SELECT COUNT(email) FROM users;
→ Kết quả: 3 (Số lượng giá trị email không phải NULL)
💡 Điểm chính:
COUNT(*)lấy tổng số bản ghi bao gồm các giá trị NULL .COUNT(email)loại trừ các giá trị NULL khi đếm.

3. Lấy dữ liệu mà không có bản sao (DISTINCT)
Khi tổng hợp dữ liệu, có nhiều trường hợp bạn muốn lấy chỉ các giá trị duy nhất.
Trong những tình huống như vậy, DISTINCT rất hữu ích.
3.1 Các cơ bản của DISTINCT
DISTINCT được sử dụng để loại bỏ dữ liệu trùng lặp từ cột được chỉ định và trả về kết quả duy nhất.
Cú pháp cơ bản
SELECT DISTINCT column_name FROM table_name;
3.2 Ví dụ về việc sử dụng DISTINCT
Bằng cách thực thi truy vấn SQL sau, bạn có thể lấy danh sách tên quốc gia duy nhất được đăng ký bởi người dùng.
SELECT DISTINCT country FROM users;
→ Kết quả:
| country |
|---|
| Japan |
| United States |
3.3 Sự khác biệt giữa DISTINCT và GROUP BY
| Feature | DISTINCT | GROUP BY |
|---|---|---|
| Purpose | Retrieve unique values | Perform aggregation by group |
| Usage | SELECT DISTINCT column_name | SELECT column_name, COUNT(*) GROUP BY column_name |
| Example | Retrieve unique countries | Count users per country |
💡 Điểm chính:
DISTINCTđơn giản loại bỏ dữ liệu trùng lặp .GROUP BYnhóm dữ liệu và được sử dụng cùng với các hàm tổng hợp .
4. Cách sử dụng COUNT(DISTINCT column_name)
Bằng cách sử dụng COUNT(DISTINCT column_name), bạn có thể lấy số lượng giá trị duy nhất.
4.1 Các cơ bản của COUNT(DISTINCT)
Cú pháp cơ bản
SELECT COUNT(DISTINCT column_name) FROM table_name;
4.2 Ví dụ về COUNT(DISTINCT)
SELECT COUNT(DISTINCT country) FROM users;
→ Kết quả: 2 (Hai loại: “Japan” và “United States”)
4.3 Sử dụng COUNT(DISTINCT) với điều kiện
SELECT COUNT(DISTINCT email) FROM users WHERE country = 'Japan';
→ Kết quả: 2 (Số lượng giá trị email duy nhất được đăng ký ở Nhật Bản)
💡 Điểm chính:
COUNT(DISTINCT column_name)loại trừ các giá trị NULL và chỉ đếm dữ liệu duy nhất.- Bằng cách sử dụng mệnh đề
WHERE, bạn có thể đếm các bản ghi đáp ứng điều kiện cụ thể .
5. Sử dụng COUNT(DISTINCT) với nhiều cột
Trong MySQL, COUNT(DISTINCT column1, column2) không thể được sử dụng trực tiếp. Thay vào đó, một cách khắc phục phổ biến là kết hợp các cột bằng CONCAT() và xử lý chúng như một giá trị duy nhất.
5.1 Tại sao COUNT(DISTINCT column1, column2) không thể được sử dụng
Trong MySQL, bạn không thể áp dụng trực tiếp COUNT(DISTINCT) cho nhiều cột như thế này: COUNT(DISTINCT column1, column2).
Điều này là do một hạn chế trong MySQL.
5.2 Cách đếm các tổ hợp duy nhất qua nhiều cột
Để đếm các kết hợp duy nhất của nhiều cột, cách tiếp cận thường dùng là kết hợp các cột bằng CONCAT() và sau đó áp dụng COUNT(DISTINCT) vào kết quả.
Ví dụ: Đếm các kết hợp duy nhất của Quốc gia và Thành phố
SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;
💡 Các điểm chính:
- Sử dụng
CONCAT(column1, '-', column2)cho phép bạn kết hợp nhiều cột thành một giá trị duy nhất. COUNT(DISTINCT CONCAT(...))cho phép bạn lấy số lượng các kết hợp duy nhất trên nhiều cột.
6. Tối ưu hiệu năng cho COUNT(DISTINCT)
COUNT(DISTINCT) có thể ảnh hưởng đến hiệu năng, vì vậy việc tối ưu có thể cần thiết.
Khi làm việc với các bộ dữ liệu lớn, nên cân nhắc sử dụng chỉ mục hoặc các phương pháp thay thế.
6.1 Tại sao COUNT(DISTINCT) có thể chậm
- MySQL thường quét toàn bộ bản ghi để áp dụng
DISTINCT. - Nếu chỉ mục không được cấu hình đúng, việc thực thi truy vấn sẽ chậm hơn.
- Một lượng lớn dữ liệu trùng lặp làm tăng tải tính toán.
6.2 Tối ưu chỉ mục để tăng tốc COUNT(DISTINCT)
Khi xử lý một lượng lớn dữ liệu, bạn có thể cải thiện hiệu năng truy vấn bằng cách thêm chỉ mục vào cột mục tiêu.
Cách thêm chỉ mục
ALTER TABLE users ADD INDEX (country);
Kiểm tra kế hoạch thực thi truy vấn bằng chỉ mục
EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
💡 Các điểm chính:
- Sử dụng
EXPLAINcho phép bạn kiểm tra cách MySQL xử lý một truy vấn. - Áp dụng chỉ mục có thể giúp tránh quét toàn bộ bảng và cải thiện hiệu năng tìm kiếm.
6.3 Phương pháp thay thế: GROUP BY + COUNT
Tùy thuộc vào yêu cầu tổng hợp, việc sử dụng GROUP BY có thể mang lại hiệu năng tốt hơn.
Ví dụ: Đếm dữ liệu duy nhất bằng GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;
💡 Các điểm chính:
GROUP BYcó thể cung cấp hiệu năng tốt hơn so vớiCOUNT(DISTINCT)trong một số trường hợp.- Nó đặc biệt hữu ích khi bạn cần nhóm và tổng hợp dữ liệu đồng thời.
7. Các lỗi thường gặp và giải pháp cho COUNT(DISTINCT)
Khi sử dụng COUNT(DISTINCT), bạn có thể gặp một số lỗi thường gặp.
Ở đây, chúng tôi giới thiệu các vấn đề điển hình và giải pháp của chúng.
7.1 Lỗi 1: COUNT(DISTINCT column1, column2) Không thể sử dụng
Nguyên nhân của lỗi
Trong MySQL, COUNT(DISTINCT column1, column2) không được hỗ trợ khi nhắm tới nhiều cột.
Sử dụng cú pháp này trực tiếp sẽ gây ra lỗi.
Giải pháp: Sử dụng CONCAT()
Bạn có thể tránh lỗi này bằng cách kết hợp nhiều cột và áp dụng COUNT(DISTINCT) vào kết quả.
SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;
💡 Các điểm chính:
- Sử dụng
CONCAT(column1, '-', column2)cho phép bạn tạo ra các giá trị duy nhất từ nhiều cột. COUNT(DISTINCT CONCAT(...))cho phép bạn lấy các giá trị duy nhất cho mỗi kết hợp.
7.2 Lỗi 2: Kết quả không mong đợi khi có giá trị NULL
Nguyên nhân của lỗi
COUNT(DISTINCT column_name)bỏ qua các giá trị NULL, điều này có thể gây ra kết quả không mong đợi nếu cột chứa NULL.
Giải pháp: Sử dụng IFNULL()
Bạn có thể thay thế NULL bằng một giá trị mặc định khác (ví dụ: '' hoặc 'unknown') để đảm bảo việc đếm chính xác.
SELECT COUNT(DISTINCT IFNULL(email, 'unknown')) FROM users;
💡 Các điểm chính:
- Bằng cách sử dụng
IFNULL(column_name, 'default_value'), bạn có thể xử lý giá trị NULL một cách thích hợp.
7.3 Lỗi 3: COUNT(DISTINCT) Chậm
Nguyên nhân của lỗi
COUNT(DISTINCT)quét toàn bộ dữ liệu, điều này có thể dẫn đến hiệu năng chậm với các bộ dữ liệu lớn.
Giải pháp: Sử dụng chỉ mục
ALTER TABLE users ADD INDEX (country);
💡 Các điểm chính:
- Thêm chỉ mục có thể cải thiện hiệu năng truy vấn.
- Sử dụng
EXPLAINđể kiểm tra trạng thái tối ưu hóa truy vấn.EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
Bằng cách áp dụng các biện pháp này, bạn có thể nâng cao tính thực tiễn của COUNT(DISTINCT) và tránh các vấn đề về hiệu suất.
8. Câu Hỏi Thường Gặp (FAQ)
Đây là một số câu hỏi thường gặp về COUNT(DISTINCT).
8.1 Sự khác biệt giữa COUNT(*) và COUNT(DISTINCT column_name) là gì?
Sự Khác Biệt Chính
| Function | Description |
|---|---|
COUNT(*) | Counts all records (including NULL values) |
COUNT(DISTINCT column_name) | Counts unique values (excluding NULL values) |
Ví Dụ Sử Dụng
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT email) FROM users;
💡 Điểm Chính:
COUNT(*)đếm tất cả các bản ghi .COUNT(DISTINCT column_name)lấy số lượng giá trị duy nhất (loại trừ NULL) .
8.2 Sự khác biệt giữa DISTINCT và GROUP BY là gì?
| Feature | DISTINCT | GROUP BY |
|---|---|---|
| Purpose | Retrieve unique values | Perform aggregation by group |
| Usage | SELECT DISTINCT column_name | SELECT column_name, COUNT(*) GROUP BY column_name |
| Example | Retrieve unique countries | Count users per country |
Ví Dụ Sử Dụng
-- Using DISTINCT
SELECT DISTINCT country FROM users;
-- Using GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;
💡 Điểm Chính:
DISTINCTchỉ đơn giản loại bỏ dữ liệu trùng lặp .GROUP BYnhóm dữ liệu và có thể kết hợp với các hàm tổng hợp .
8.3 COUNT(DISTINCT) có chậm không?
Vấn Đề
COUNT(DISTINCT)quét tất cả dữ liệu , vì vậy hiệu suất có thể giảm với các tập dữ liệu lớn.
Giải Pháp: Sử Dụng Chỉ Mục
ALTER TABLE users ADD INDEX (country);
Cách Tiếp Cận Thay Thế: Sử Dụng GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;
💡 Điểm Chính:
- Áp dụng chỉ mục có thể cải thiện hiệu suất tìm kiếm .
- Sử dụng
GROUP BYcó thể mang lại kết quả nhanh hơnCOUNT(DISTINCT)trong một số trường hợp.
8.4 Làm thế nào để sử dụng COUNT(DISTINCT column1, column2)?
Vấn Đề
- Trong MySQL,
COUNT(DISTINCT column1, column2)không được hỗ trợ .
Giải Pháp: Sử Dụng CONCAT()
SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;
💡 Điểm Chính:
- Sử dụng
CONCAT(column1, '-', column2)cho phép bạn tạo giá trị duy nhất qua nhiều cột . COUNT(DISTINCT CONCAT(...))cho phép bạn lấy các kết hợp duy nhất .
Bằng cách tham khảo các câu hỏi này, bạn có thể sử dụng COUNT(DISTINCT) hiệu quả hơn.
9. Kết Luận
Trong bài viết này, chúng tôi đã giải thích chi tiết cách sử dụng hàm COUNT(DISTINCT) của MySQL.
Hãy ôn lại các điểm chính.
9.1 Những Gì Bạn Đã Học Trong Bài Viết Này
✅ Cách đếm bản ghi trong MySQL
COUNT(*)lấy tổng số bản ghiCOUNT(column_name)đếm giá trị loại trừ NULLCOUNT(DISTINCT column_name)lấy số lượng giá trị duy nhất
✅ Sự khác biệt giữa DISTINCT và COUNT(DISTINCT)
DISTINCTlấy dữ liệu với các bản sao đã bị loại bỏCOUNT(DISTINCT column_name)đếm số lượng giá trị duy nhất
✅ Cách sử dụng COUNT(DISTINCT) với nhiều cột
- Vì MySQL không hỗ trợ
COUNT(DISTINCT column1, column2)trực tiếp, hãy sử dụngCONCAT()thay thế
✅ Kỹ thuật tối ưu hóa hiệu suất
- Áp dụng chỉ mục để cải thiện hiệu suất tìm kiếm
- Sử dụng
GROUP BY + COUNTcho các truy vấn nhanh hơn khi phù hợp
9.2 Những Gì Bạn Có Thể Làm Với Kiến Thức Này
Bằng cách áp dụng kiến thức này, bạn có thể thực hiện các loại tổng hợp dữ liệu sau:
🔹 Đếm người dùng duy nhất
🔹 Lấy số lượng bản ghi dựa trên điều kiện cụ thể
🔹 Đếm dữ liệu duy nhất qua nhiều cột
🔹 Tối ưu hóa truy vấn cho các tập dữ liệu lớn
Khi thực hiện tổng hợp dữ liệu và tối ưu hóa trong MySQL, hãy sử dụng hướng dẫn này làm tài liệu tham khảo!


