Sử dụng GROUP BY ... HAVING COUNT(*) = 1 để lọc các giá trị duy nhất, sau đó đếm số lượng nhóm đó.
Tạo bảng
mysql> CREATE TABLE DemoTable (Name VARCHAR(20));
Chèn dữ liệu (có trùng lặp)
mysql> INSERT INTO DemoTable VALUES('Larry'), ('Larry'), ('Sam'), ('Chris'), ('Sam'), ('Mike'), ('Sam'), ('Larry'), ('Mike'), ('Mike'), ('Carol'), ('Robert');
Xem dữ liệu (12 hàng)
+--------+ | Name | +--------+ | Larry | | Larry | | Sam | | Chris | | Sam | | Mike | | Sam | | Larry | | Mike | | Mike | | Carol | | Robert | +--------+
Thống kê: Larry(3), Sam(3), Mike(4), Chris(1), Carol(1), Robert(1)
Đếm tên chỉ xuất hiện 1 lần
mysql> SELECT COUNT(Name) FROM (
-> SELECT Name FROM DemoTable
-> GROUP BY Name
-> HAVING COUNT(*) = 1
-> ) AS AppearOnce;
+-------------+ | COUNT(Name) | +-------------+ | 3 | +-------------+
Kết quả 3: Chris, Carol, Robert
Giải thích
- Truy vấn con:
GROUP BY Name HAVING COUNT(*) = 1→ trả về các tên duy nhất (Chris, Carol, Robert) - Truy vấn cha:
COUNT(Name)đếm số hàng của truy vấn con → 3
Cách viết gọn hơn (MySQL 8.0+ CTE)
WITH UniqueNames AS (
SELECT Name FROM DemoTable GROUP BY Name HAVING COUNT(*) = 1
)
SELECT COUNT(*) FROM UniqueNames;
Mở rộng: Liệt kê cả tên và tần suất
SELECT Name, COUNT(*) AS Freq FROM DemoTable GROUP BY Name HAVING COUNT(*) = 1;
+-------+------+ | Name | Freq | +-------+------+ | Chris | 1 | | Carol | 1 | | Robert| 1 | +-------+------+