เมื่อต้องการนับจำนวนค่าที่ไม่ซ้ำกัน (Unique Values) ในคอลัมน์ ให้ใช้ COUNT(DISTINCT column_name) ซึ่งจะข้ามค่าที่ซ้ำกันนับเพียงครั้งเดียว
สร้างตารางและข้อมูล (มีค่าซ้ำ)
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(10)
);
mysql> insert into DemoTable(FirstName) values
('Larry'),('John'),('Sam'),('John'),('John'),
('Larry'),('Mike'),('Robert'),('Carol'),('Mike');
ข้อมูลในตาราง (10 แถว แต่มีซ้ำ)
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Larry | | 2 | John | | 3 | Sam | | 4 | John | | 5 | John | | 6 | Larry | | 7 | Mike | | 8 | Robert | | 9 | Carol | | 10 | Mike | +----+-----------+
คำสั่งนับค่า Unique
mysql> select count(distinct FirstName) from DemoTable;
ผลลัพธ์: 6 ค่าที่ไม่ซ้ำ
+---------------------------+ | count(distinct FirstName) | +---------------------------+ | 6 | +---------------------------+
ค่าที่ไม่ซ้ำ: Larry, John, Sam, Mike, Robert, Carol
COUNT() vs COUNT(DISTINCT)
| ฟังก์ชัน | ผลลัพธ์ | คำอธิบาย |
|---|---|---|
| COUNT(*) | 10 | นับทุกแถว |
| COUNT(FirstName) | 10 | นับแถวที่ FirstName ไม่ใช่ NULL |
| COUNT(DISTINCT FirstName) | 6 | นับค่าที่ไม่ซ้ำกัน |
ขยาย: แสดงค่า Unique พร้อมจำนวน
SELECT FirstName, COUNT(*) as frequency FROM DemoTable GROUP BY FirstName ORDER BY frequency DESC;
+-----------+-----------+ | FirstName | frequency | +-----------+-----------+ | John | 3 | | Larry | 2 | | Mike | 2 | | Sam | 1 | | Robert | 1 | | Carol | 1 | +-----------+-----------+
ประสิทธิภาพ
- COUNT(DISTINCT) ต้องใช้ Temporary Table / Sort → ช้ากว่า COUNT(*)
- เพิ่ม Index บนคอลัมน์ที่นับ Unique จะช่วยได้
- ข้อมูลใหญ่ ควรใช้
APPROX_COUNT_DISTINCT()(MySQL 8.0.11+) เพื่อประมาณการเร็ว