Đếm số lượng giá trị duy nhất (distinct) trong MySQL
Sử dụng COUNT(DISTINCT column) để đếm số giá trị khác nhau của một cột trong nhóm hoặc toàn bảng.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
CustomerId INT,
CustomerName VARCHAR(20),
ProductName VARCHAR(40)
);
mysql> INSERT INTO DemoTable VALUES
(101, 'Chris', 'Product-1'), (102, 'David', 'Product-2'),
(101, 'Chris', 'Product-1'), (101, 'Chris', 'Product-2'),
(101, 'Chris', 'Product-1');
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------------+--------------+-------------+ | CustomerId | CustomerName | ProductName | +------------+--------------+-------------+ | 101 | Chris | Product-1 | | 102 | David | Product-2 | | 101 | Chris | Product-1 | | 101 | Chris | Product-2 | | 101 | Chris | Product-1 | +------------+--------------+-------------+
3. Truy vấn: Đếm sản phẩm khác nhau của CustomerId = 101
mysql> SELECT COUNT(DISTINCT ProductName)
FROM DemoTable
WHERE CustomerId = 101;
4. Kết quả
+-----------------------------+ | COUNT(DISTINCT ProductName) | +-----------------------------+ | 2 | +-----------------------------+
Phân tích: CustomerId=101 (Chris) có 4 hàng: Product-1 (3 lần), Product-2 (1 lần) → 2 sản phẩm khác nhau.
So sánh COUNT(*) vs COUNT(col) vs COUNT(DISTINCT col):
| Hàm | Đếm gì | NULL | Trùng lặp |
|---|---|---|---|
| COUNT(*) | Số hàng | Đếm | Đếm tất cả |
| COUNT(col) | Số giá trị không NULL | Bỏ qua | Đếm tất cả |
| COUNT(DISTINCT col) | Số giá trị KHÁC NHAU không NULL | Bỏ qua | Chỉ đếm 1 lần |
Mở rộng - Đếm distinct cho nhiều cột:
SELECT COUNT(DISTINCT ProductName) AS products,
COUNT(DISTINCT CustomerName) AS customers
FROM DemoTable;
Lưu ý hiệu năng: COUNT(DISTINCT) tốn bộ nhớ (cần lưu tập giá trị duy nhất). Với bảng lớn, cân nhắc approximate count: APPROX_COUNT_DISTINCT() (MySQL 8.0.13+).