Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: แสดงข้อมูลไม่ซ้ำกัน (Distinct) จากแถวที่ซ้ำ

สร้างตารางและข้อมูลตัวอย่าง

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

คุณสมบัติDISTINCTGROUP 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 * เปรียบเทียบทุกคอลัมน์ อาจช้า หากต้องการเฉพาะบางคอลัมน์ ระบุชื่อคอลัมน์ชัดเจน