Sử dụng GROUP BY trong truy vấn con để gom nhóm giá trị trùng lặp, sau đó COUNT(*) đếm số nhóm.
Tạo bảng
mysql> CREATE TABLE DemoTable (Value INT);
Chèn dữ liệu có trùng lặp
mysql> INSERT INTO DemoTable VALUES(10), (20), (10), (30), (10), (20), (40), (10), (20), (20), (60);
Xem dữ liệu (11 hàng, 5 giá trị khác nhau)
mysql> SELECT * FROM DemoTable;
+-------+ | Value | +-------+ | 10 | | 20 | | 10 | | 30 | | 10 | | 20 | | 40 | | 10 | | 20 | | 20 | | 60 | +-------+
Đếm số giá trị khác nhau (distinct values)
mysql> SELECT COUNT(*) FROM (SELECT * FROM DemoTable GROUP BY Value) AS tbl;
+----------+ | COUNT(*) | +----------+ | 5 | +----------+
Giải thích
- Truy vấn con:
SELECT * FROM DemoTable GROUP BY Value→ 5 hàng (10, 20, 30, 40, 60) - Truy vấn cha:
COUNT(*)đếm 5 hàng đó → 5
Cách đơn giản hơn: COUNT(DISTINCT)
SELECT COUNT(DISTINCT Value) FROM DemoTable;
+------------------------+ | COUNT(DISTINCT Value) | +------------------------+ | 5 | +------------------------+
Khuyên dùng cách này — ngắn gọn, chuẩn SQL, optimizer tốt hơn.
Khi nào cần subquery GROUP BY?
- Cần logic phức tạp hơn trong nhóm (ví dụ: HAVING COUNT(*) > 2)
- Cần truy cập các cột khác của hàng đại diện
- Học tập/hiểu bản chất GROUP BY
Mở rộng: Đếm tần suất mỗi giá trị
SELECT Value, COUNT(*) AS Frequency FROM DemoTable GROUP BY Value ORDER BY Frequency DESC;
+-------+-----------+ | Value | Frequency | +-------+-----------+ | 10 | 4 | | 20 | 5 | | 30 | 1 | | 40 | 1 | | 60 | 1 | +-------+-----------+