วันนี้เราจะมาว่าด้วยการ Group By ใน Query ค่ะ สำหรับคำจำกัดความภาษาบ้านๆ ก็น่าจะเป็น "การรวมข้อมูลเป็น Record เดียวกัน โดยที่ข้อมูลใน Field ทุกๆ Field จะ้ต้องเหมือนกัน" ยกตัวอย่างข้อมูลที่สามารถ Group By ให้เป็น Record เดียวกันได้ ดังนี้
ตาราง test_table
field_a | field_b | field_c |
123 | ทดสอบ | 1 |
123 | ทดสอบ | 2 |
123 | ทดสอบ | 2 |
123 | ทดสอบ | 2 |
123 | ทดสอบ | 3 |
หากต้องการสร้างตารางเพื่อทดสอบข้อมูลให้ใช้คำสั่ง
CREATE TABLE test_table(
field_a varchar(255) NOT NULL,
field_b varchar(255) NOT NULL,
field_c varchar(255) NOT NULL
);
หลังจากนั้น INSERT ข้อมูลจากคำสั่ง
INSERT INTO test_table(field_a,field_b,field_c) VALUES('123','ทดสอบ','1');
INSERT INTO test_table(field_a,field_b,field_c) VALUES('123','ทดสอบ','2');
INSERT INTO test_table(field_a,field_b,field_c) VALUES('123','ทดสอบ','2');
INSERT INTO test_table(field_a,field_b,field_c) VALUES('123','ทดสอบ','2');
INSERT INTO test_table(field_a,field_b,field_c) VALUES('123','ทดสอบ','3');
หลังจากที่รันคำสั่ง CREATE TABLE และ INSERT INTO แล้ว เราก็จะได้ข้อมูลดังตารางข้างต้น
จากข้อมูลข้างต้นของตาราง test_table ถ้าเราเขียนคำสั่ง SQL แล้วทำการ Group By แล้วจะได้อะไร ลองมาดูจากคำสั่ง 3 ชุด
ชุดที่ 1 : เลือกแสดงข้อมูลทุก Field
SELECT field_a, field_b, field_c
FROM test_table
GROUP BY field_a, field_b, field_c;
จากคำสั่งข้างต้นเราทำ GROUP BY field_a, field_b, field_c นั่นคือ ในแต่ละ Record(แถวของข้อมูล) จะต้องมีค่าแต่ละ Field เท่ากัน ทุก Field ในตัวอย่าง
field_a มีค่า '123' เหมือนกันทุก Record
field_b มีค่า 'ทดสอบ' เหมือนกันทุก Record
แต่ field_c มีความแตกต่างกัน โดยจะมีค่า เป็น '1' ,'2' หรือ '3'
ดังนั้น Record ที่เหมือนกันทุก Field จะรวมเป็น Record เดียวกัน
ผลลัพธ์ที่ได้ คือ
field_a | field_b | field_c |
123 | ทดสอบ | 1 |
123 | ทดสอบ | 2 |
123 | ทดสอบ | 3 |
ชุดที่ 2 : เลือกแสดงบาง Field
SELECT field_a, field_b
FROM test_table
GROUP BY field_a, field_b;
จากคำสั่งข้างต้นเราทำ GROUP BY field_a, field_b นั่นคือ ในแต่ละ Record จะต้องมีค่าแต่ละ Field เท่ากัน ทุก Field ที่ทำ GROUP BY ในตัวอย่าง
field_a มีค่า '123' เหมือนกันทุก Record
field_b มีค่า 'ทดสอบ' เหมือนกันทุก Record
ผลลัพธ์ที่ได้ คือ
field_a | field_b |
123 | ทดสอบ |
ชุดที่ 3 : เลือกแสดงข้อมูลบาง Field แต่ Group By ทุก Field
SELECT field_a, field_b
FROM test_table
GROUP BY field_a, field_b, field_c;
จากคำสั่งข้างต้นเราทำ GROUP BY field_a, field_b, field_c นั่นคือ ในแต่ละ Record จะต้องมีค่าแต่ละ Field เท่ากัน ทุก Field ที่ทำการ Group By ในตัวอย่าง
field_a มีค่า '123' เหมือนกันทุก Record
field_b มีค่า 'ทดสอบ' เหมือนกันทุก Record
แต่ field_c มีความแตกต่างกัน โดยจะมีค่า เป็น '1' ,'2' หรือ '3'
ดังนั้น Record ที่เหมือนกันทุก Field จะรวมเป็น Record เดียวกัน
ผลลัพธ์ที่ได้ คือ
field_a | field_b |
123 | ทดสอบ |
123 | ทดสอบ |
123 | ทดสอบ |
* จากคำสั่งชุดที่ 3 ถึงแม้การแสดงผลจะแสดงออกมาไม่ครบทุก Field แต่ข้อมูลที่เรานำมา Group By ก็สามารถ นำ Filed ที่ไม่แสดงผลมา Goup By ด้วยก็ได้ อันนี้ก็ขึ้นอยู่กับผลลัพธ์ที่เราต้องการ
สิ่งที่ควรจำสำหรับการทำ Group By
- เราจำเป็นต้องนำ Field ที่เรา Select(แสดงผล) มา Group By ทุก Field เสมอ
- เราสามารถนำ Field อื่นที่ไม่แสดงผลมาร่วม Group By ได้ (จากตัวอย่าง ชุดคำสั่งที่ 3)
- Field ที่เราเขียน Group By ทุก Field จะถูกนำมาคิดร่วมกันเพื่อเช็คข้อมูลกลุ่มเดียวกัน นั่นคือค่าของทุก Field ต้องมีค่าเท่ากันทั้งหมด จึงจะมองว่าเป็น Record เดียวกัน
ทิ้งท้ายซักนิด
ในบางครั้งถ้าเราต้องการทำ Group By เท่ากับ Field ที่เรา Select เราอาจจะเขียนแทนด้วย Distinct ก็ได้ค่ะ
ตัวอย่าง
จากชุดคำสั่งที่ 1
SELECT field_a, field_b, field_c
FROM test_table
GROUP BY field_a, field_b, field_c;
เราอาจจะเขียนแทนเป็น
SELECT DISTINCT field_a, field_b, field_c
FROM test_table;
ซึ่งจะได้ผลลัพธ์ เหมือนกัน พิเศษหน่อยตรงที่ Distinct จะเรียงลำดับให้เราด้วยค่ะ แล้วค่อยมาว่ากันต่อ กับ Group By ขั้นต่อไป และ Distinct สามารถทำงานให้ประสิทธิภาพมากกว่านี้ค่ะ ...โปรดติดตามตอนต่อไป
ไม่มีความเห็น ห้ามงอนน๊ะ
ตอบลบอิอิ
สุดยอดมากครับ อธิบายได้ดีมาก
ตอบลบขอบคุณครับ สุดยอดไปเลย ขอบคุณจิงๆ
ตอบลบขอบคุณมากคะ ได้รู้เรื่องขึ้นมากคะ
ตอบลบ