สร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable1998 ( Name varchar(20) );
mysql> insert into DemoTable1998 values('Robert');
mysql> insert into DemoTable1998 values('Chris');
mysql> insert into DemoTable1998 values('Robert');
mysql> insert into DemoTable1998 values('David');
mysql> insert into DemoTable1998 values('Bob');
mysql> insert into DemoTable1998 values('David');
ข้อมูลก่อน (มีซ้ำ)
+--------+
| Name |
+--------+
| Robert |
| Chris |
| Robert |
| David |
| Bob |
| David |
+--------+
Query ใช้ DISTINCT
mysql> select distinct * from DemoTable1998;
ผลลัพธ์ (ไม่ซ้ำ)
+--------+
| Name |
+--------+
| Robert |
| Chris |
| David |
| Bob |
+--------+
อธิบาย
DISTINCT กรองแถวที่ซ้ำกันทั้งแถว (ทุกคอลัมน์เหมือนกัน)
- ในที่นี้มีคอลัมน์เดียว (Name) ดังนั้นค่าที่ซ้ำจะถูกตัดทิ้ง
- ลำดับผลลัพธ์ขึ้นกับ Engine (มักเป็นลำดับที่เจอแรก)
DISTINCT กับหลายคอลัมน์
SELECT DISTINCT col1, col2 FROM table;
-- แถวจะถือว่าไม่ซ้ำก็ต่อเมื่อ (col1, col2) คู่เดียวกันทั้งคู่
DISTINCT vs GROUP BY
| คุณสมบัติ | DISTINCT | GROUP BY |
| วัตถุประสงค์ | กรองแถวซ้ำ | จัดกลุ่ม + Aggregate |
| รองรับ Aggregate | ไม่ได้ (ต้อง用子查询) | รองรับโดยตรง |
| Performance | เร็วกว่าเล็กน้อย | ช้ากว่า (มี Overhead) |
| ORDER BY | ได้ (MySQL) | ได้ |
นับจำนวนค่าที่ไม่ซ้ำ
SELECT COUNT(DISTINCT Name) FROM DemoTable1998; -- ผลลัพธ์: 4
คำเตือน
DISTINCT ใช้ Resource มากหากข้อมูลเยอะ (ต้อง Sort/Hash เพื่อหาค่าซ้ำ)
- หากมี Primary Key หรือ Unique Index อยู่แล้ว ไม่ต้องใช้ DISTINCT
SELECT DISTINCT * เปรียบเทียบทุกคอลัมน์ อาจช้า หากต้องการเฉพาะบางคอลัมน์ ระบุชื่อคอลัมน์ชัดเจน