Mine

รูปภาพของฉัน
หาดใหญ่, ภาคใต้, Thailand
ชอบเอาใจ แต่ก็เอาแต่ใจ

วันอังคารที่ 28 กันยายน พ.ศ. 2553

มาทำความเข้าใจคำว่า Group By ขึ้นพื้นฐาน

สวัสดีค่ะ ช่วงนี้อากาศเปลี่ยนแปลงบ่อย ยังไงก็รักษาสุขภาพกันด้วยนะคะ ...

วันนี้เราจะมาว่าด้วยการ 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_afield_bfield_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_afield_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_afield_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 สามารถทำงานให้ประสิทธิภาพมากกว่านี้ค่ะ ...โปรดติดตามตอนต่อไป

4 ความคิดเห็น:

  1. ไม่มีความเห็น ห้ามงอนน๊ะ
    อิอิ

    ตอบลบ
  2. ไม่ระบุชื่อ18 มีนาคม 2557 เวลา 13:18

    สุดยอดมากครับ อธิบายได้ดีมาก

    ตอบลบ
  3. ขอบคุณครับ สุดยอดไปเลย ขอบคุณจิงๆ

    ตอบลบ
  4. ขอบคุณมากคะ ได้รู้เรื่องขึ้นมากคะ

    ตอบลบ