สามารถรวม DISTINCT เข้าไปใน COUNT() เพื่อนับค่า Unique ในคอลัมน์ได้
Syntax
COUNT(DISTINCT column_name)
COUNT(DISTINCT col1, col2, ...) -- นับ Unique Combination
ตัวอย่าง
CREATE TABLE DistCountDemo (
id INT,
name VARCHAR(100),
age INT
);
INSERT INTO DistCountDemo VALUES
(1, 'John', 23),
(2, 'Bob', 24),
(3, 'John', 23),
(4, 'Carol', 23);
นับชื่อที่ไม่ซ้ำกัน โดยอายุ = 23
SELECT COUNT(DISTINCT name)
FROM DistCountDemo
WHERE age = 23;
-- ผลลัพธ์: 2 (John, Carol)
นับ Unique Combination (name, age)
SELECT COUNT(DISTINCT name, age) FROM DistCountDemo;
-- ผลลัพธ์: 3 (John-23, Bob-24, Carol-23)
เปรียบเทียบ COUNT แบบต่างๆ
| Function | ความหมาย | ตัวอย่างผลลัพธ์ |
|---|---|---|
| COUNT(*) | นับทุกแถว (รวม NULL) | 4 |
| COUNT(name) | นับแถวที่ name ไม่ใช่ NULL | 4 |
| COUNT(DISTINCT name) | นับค่า name ที่ไม่ซ้ำกัน (Non-NULL) | 3 |
| COUNT(DISTINCT name, age) | นับ Pair (name,age) ที่ไม่ซ้ำ | 3 |
ใช้กับ GROUP BY
SELECT
age,
COUNT(*) AS total_rows,
COUNT(DISTINCT name) AS unique_names
FROM DistCountDemo
GROUP BY age
ORDER BY age;
ผลลัพธ์
+------+------------+--------------+
| age | total_rows | unique_names |
+------+------------+--------------+
| 23 | 3 | 2 |
| 24 | 1 | 1 |
+------+------------+--------------+
Performance Notes
COUNT(DISTINCT ...)ต้อง Sort/Hash เพื่อ Dedup → ช้ากว่าCOUNT(*)- สร้าง Index บนคอลัมน์ที่ COUNT DISTINCT:
CREATE INDEX idx_age_name ON DistCountDemo(age, name) - MySQL 8.0+: ใช้
COUNT(DISTINCT ...) OVER (PARTITION BY ...)สำหรับ Window Function - Approximate Count (Large Data): ใช้
APPROX_COUNT_DISTINCT()(MySQL 8.0.13+)
APPROX_COUNT_DISTINCT (MySQL 8.0.13+)
SELECT APPROX_COUNT_DISTINCT(name) FROM large_table;
-- เร็วมาก Error Rate ~1-2%