ข้อแตกต่าง ระหว่าง GROUP BY และ DISTINCT

GROUP BY และ DISTINCT ใช้เพื่อเลือกข้อมูลที่เหมือนๆกัน ออกมาแสดงได้เหมือนกัน แต่ทั้ง 2 แบบมีจุดประสงค์ต่างกัน คือ

DISTINCT ใช้ในการกรองข้อมูลที่ซ้ำกัน (ทุกฟิลด์ที่ระบุ) ให้ออกมาเพียงรายการเดียวเท่านั้น ยกตัวอย่างข้อมูล
sex name
f ตัวอย่าง
m เดโม
m เดโม
m ทดสอบ
SELECT DISTINCT `sex` FROM `user`

คำสั่งด้านบนจะ Query เอาข้อมูลที่มี sex ซ้ำกันออกมาเพียงรายการเดียว คำสั่งรูปแบบนี้มักจะใช้ในการหาว่ามี sex อะไรบ้างอยู่ในระบบ
sex
f
m
ลองดูอีกตัวอย่างหนึ่ง
SELECT DISTINCT `sex`,`name` FROM `user`

มีการระบุฟิลด์ `name` ด้วย คำสั่งด้านบนจะ Query เอาข้อมูลที่มีทั้ง `sex` และ `name` ซ้ำกันออกมาเพียงรายการเดียว ส่วนรายการที่ `sex` เหมือนกันแต่ `name` ไม่ซ้ำกับอันอื่นจะยังคงเอาออกมาด้วย สังเกตนะครับว่า DISTINCT มันมีผลกับทุกฟิลด์ที่ระบุ
sex name
f ตัวอย่าง
m เดโม
m ทดสอบ
คำสั่ง DISTINCT ถ้าใช้ร่วมกับ Aggregate ฟังก์ชั่น เช่น COUNT(), SUM() อาจให้ผลแปลกๆ ไม่แนะนำให้ใช้ครับ ตัวอย่าง
SELECT DISTINCT `sex`,COUNT(*) FROM `user`

ผลลัพท์
sex COUNT(*)
f 4
จากตัวอย่างจะเห็นว่ามันสรุปข้อมูลผิดพลาด และคืนค่าข้อมูลออกมาเพียงแถวเดียวเท่านั้น ผมแนะนำว่า ถ้า Query มี Aggregate ฟังก์ชั่น ให้ใช้ GROUP BY แทน
SELECT `sex`, COUNT(*) FROM `user` GROUP BY `sex`

ผลลัพท์
sex COUNT(*)
f 1
m 3
GROUP BY คือการจัดกลุ่มข้อมูลที่เหมือนๆกัน ซึ่งมันจะทำการจัดกลุ่มข้อมูลที่เหมือนๆกัน (ตามที่ระบุไว้ใน GROUP BY) แล้วถึงจะให้ Aggregate ฟังก์ชั่นดำเนินการกับข้อมูลในแต่ละกลุ่มอีกที

สรุป DISTINCT เหมาะสำหรับเลือกเอาข้อมูลที่ซ้ำๆกันเพียงฟิลด์ใดฟิลด์หนึงมาใช้งาน เช่นการเลือกเพศ มาใส่ Select เป็นต้น ส่วน GROUP BY เรามักจะใช้ร่วมกับ query ที่ซับซ้อนกว่าเพื่อเลือกเอาข้อมูลที่ต้องการมาแสดงผล นอกจากนี้ GROUP BY ยังสามารถใช้ร่วมกับ HAVING เพื่อจำกัดข้อมูลที่ต้องการได้อีกด้วย
ผู้เขียน goragod โพสต์เมื่อ 02 เม.ย. 2551 เปิดดู 66,211 ป้ายกำกับ SQL
^