ข้อแตกต่าง ระหว่าง GROUP BY และ DISTINCT
GROUP BY และ DISTINCT ใช้เพื่อเลือกข้อมูลที่เหมือนๆกัน ออกมาแสดงได้เหมือนกัน แต่ทั้ง 2 แบบมีจุดประสงค์ต่างกัน คือ
DISTINCT ใช้ในการกรองข้อมูลที่ซ้ำกัน (ทุกฟิลด์ที่ระบุ) ให้ออกมาเพียงรายการเดียวเท่านั้น ยกตัวอย่างข้อมูล
คำสั่งด้านบนจะ Query เอาข้อมูลที่มี sex ซ้ำกันออกมาเพียงรายการเดียว คำสั่งรูปแบบนี้มักจะใช้ในการหาว่ามี sex อะไรบ้างอยู่ในระบบ
ลองดูอีกตัวอย่างหนึ่ง
มีการระบุฟิลด์ `name` ด้วย คำสั่งด้านบนจะ Query เอาข้อมูลที่มีทั้ง `sex` และ `name` ซ้ำกันออกมาเพียงรายการเดียว ส่วนรายการที่ `sex` เหมือนกันแต่ `name` ไม่ซ้ำกับอันอื่นจะยังคงเอาออกมาด้วย สังเกตนะครับว่า DISTINCT มันมีผลกับทุกฟิลด์ที่ระบุ
คำสั่ง DISTINCT ถ้าใช้ร่วมกับ Aggregate ฟังก์ชั่น เช่น COUNT(), SUM() อาจให้ผลแปลกๆ ไม่แนะนำให้ใช้ครับ ตัวอย่าง
ผลลัพท์
จากตัวอย่างจะเห็นว่ามันสรุปข้อมูลผิดพลาด และคืนค่าข้อมูลออกมาเพียงแถวเดียวเท่านั้น ผมแนะนำว่า ถ้า Query มี Aggregate ฟังก์ชั่น ให้ใช้ GROUP BY แทน
ผลลัพท์
GROUP BY คือการจัดกลุ่มข้อมูลที่เหมือนๆกัน ซึ่งมันจะทำการจัดกลุ่มข้อมูลที่เหมือนๆกัน (ตามที่ระบุไว้ใน GROUP BY) แล้วถึงจะให้ Aggregate ฟังก์ชั่นดำเนินการกับข้อมูลในแต่ละกลุ่มอีกที
สรุป DISTINCT เหมาะสำหรับเลือกเอาข้อมูลที่ซ้ำๆกันเพียงฟิลด์ใดฟิลด์หนึงมาใช้งาน เช่นการเลือกเพศ มาใส่ Select เป็นต้น ส่วน GROUP BY เรามักจะใช้ร่วมกับ query ที่ซับซ้อนกว่าเพื่อเลือกเอาข้อมูลที่ต้องการมาแสดงผล นอกจากนี้ GROUP BY ยังสามารถใช้ร่วมกับ HAVING เพื่อจำกัดข้อมูลที่ต้องการได้อีกด้วย
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 | ทดสอบ |
SELECT DISTINCT `sex`,COUNT(*) FROM `user`
ผลลัพท์
sex | COUNT(*) |
---|---|
f | 4 |
SELECT `sex`, COUNT(*) FROM `user` GROUP BY `sex`
ผลลัพท์
sex | COUNT(*) |
---|---|
f | 1 |
m | 3 |
สรุป DISTINCT เหมาะสำหรับเลือกเอาข้อมูลที่ซ้ำๆกันเพียงฟิลด์ใดฟิลด์หนึงมาใช้งาน เช่นการเลือกเพศ มาใส่ Select เป็นต้น ส่วน GROUP BY เรามักจะใช้ร่วมกับ query ที่ซับซ้อนกว่าเพื่อเลือกเอาข้อมูลที่ต้องการมาแสดงผล นอกจากนี้ GROUP BY ยังสามารถใช้ร่วมกับ HAVING เพื่อจำกัดข้อมูลที่ต้องการได้อีกด้วย