SQL GROUP BY และ HAVING Clause พร้อมตัวอย่าง
SQL Group ตามข้อคืออะไร?
GROUP BY clause เป็นคำสั่ง SQL ที่ใช้ แถวกลุ่มที่มีค่าเหมือนกัน- GROUP BY clause ใช้ในคำสั่ง SELECT หรือจะใช้ร่วมกับฟังก์ชันรวมเพื่อสร้างรายงานสรุปจากฐานข้อมูลก็ได้
นั่นคือสิ่งที่มันทำ การสรุปข้อมูล จากฐานข้อมูล
แบบสอบถามที่มีส่วนคำสั่ง GROUP BY เรียกว่าแบบสอบถามแบบจัดกลุ่มและส่งกลับเพียงแถวเดียวสำหรับทุกๆ รายการที่จัดกลุ่ม
กลุ่ม SQL ตามไวยากรณ์
ตอนนี้เรารู้แล้วว่าคำสั่งย่อย SQL GROUP BY คืออะไร เรามาดูไวยากรณ์สำหรับกลุ่มพื้นฐานตามแบบสอบถามกันดีกว่า
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
ที่นี่
- “คำสั่ง SELECT…” คือแบบสอบถามคำสั่ง SQL SELECT มาตรฐาน
- "จัดกลุ่มตาม column_name1” คือส่วนคำสั่งที่ทำการจัดกลุ่มตาม column_name1
- “[,column_name2,…]” เป็นทางเลือก; แสดงถึงชื่อคอลัมน์อื่นๆ เมื่อจัดกลุ่มเสร็จสิ้นในคอลัมน์มากกว่าหนึ่งคอลัมน์
- “[มีเงื่อนไข]” เป็นทางเลือก; ใช้เพื่อจำกัดแถวที่ได้รับผลกระทบจาก GROUP BY clause มันคล้ายกับ WHERE ข้อ.
การจัดกลุ่มโดยใช้ คอลัมน์เดียว
เพื่อช่วยให้เข้าใจผลกระทบของ SQL Group By clause เรามาดำเนินการคิวรีง่ายๆ ที่ส่งคืนรายการเพศทั้งหมดจากตารางสมาชิก
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
สมมติว่าเราต้องการรับค่าเฉพาะสำหรับเพศต่างๆ เราสามารถใช้แบบสอบถามต่อไปนี้
SELECT `gender` FROM `members` GROUP BY `gender`;
ดำเนินการสคริปต์ข้างต้นใน MySQL ปรับแต่ง จาก Myflixdb เราจะได้ผลลัพธ์ดังนี้
gender |
---|
Female |
Male |
โปรดทราบว่ามีการส่งคืนผลลัพธ์เพียงสองรายการเท่านั้น เนื่องจากเรามีเพศเพียงสองประเภทคือชายและหญิง GROUP BY clause ใน SQL จะจัดกลุ่มสมาชิก “Male” ทั้งหมดไว้ด้วยกันและส่งคืนเพียงแถวเดียวเท่านั้น มันทำเช่นเดียวกันกับสมาชิก “หญิง”
การจัดกลุ่มโดยใช้ หลายคอลัมน์
สมมติว่าเราต้องการรับรายการภาพยนตร์ category_id และปีที่เข้าฉาย
ลองสังเกตผลลัพธ์ของแบบสอบถามง่ายๆ นี้
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
ผลลัพธ์ข้างต้นมีรายการซ้ำกันมากมาย
เรามาดำเนินการค้นหาเดียวกันโดยใช้ group by ใน SQL –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
ดำเนินการสคริปต์ข้างต้นใน MySQL การใช้งาน workbench กับ myflixdb จะให้ผลลัพธ์ดังแสดงด้านล่างนี้
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
คำสั่ง GROUP BY ดำเนินการกับทั้งรหัสหมวดหมู่และปีที่เผยแพร่เพื่อระบุ ที่ไม่เหมือนใคร แถวในตัวอย่างข้างต้นของเรา
หากรหัสหมวดหมู่เหมือนกันแต่ปีที่เผยแพร่แตกต่างกัน แถวจะถือเป็นรหัสที่ไม่ซ้ำกัน หากรหัสหมวดหมู่และปีที่เผยแพร่เหมือนกันสำหรับมากกว่าหนึ่งแถว จะถือว่าซ้ำกันและมีเพียงแถวเดียวเท่านั้น ถูกแสดง
การจัดกลุ่มและ ฟังก์ชั่นรวม
สมมติว่าเราต้องการจำนวนชายและหญิงทั้งหมดในฐานข้อมูล เราสามารถใช้สคริปต์ที่แสดงด้านล่างเพื่อดำเนินการดังกล่าวได้
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
ดำเนินการสคริปต์ข้างต้นใน MySQL การใช้งาน workbench กับ myflixdb จะให้ผลลัพธ์ดังต่อไปนี้
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
ผลลัพธ์ที่แสดงด้านล่างจะถูกจัดกลุ่มตามค่าเพศที่ไม่ซ้ำกันทุกค่าที่โพสต์ และจำนวนแถวที่จัดกลุ่มจะถูกนับโดยใช้ฟังก์ชันรวม COUNT
การจำกัดผลลัพธ์การค้นหาโดยใช้ การมี ประโยค
ไม่ใช่ว่าเราต้องการจัดกลุ่มข้อมูลทั้งหมดในตารางที่กำหนดเสมอไป จะมีบางครั้งที่เราจะต้องจำกัดผลลัพธ์ของเราให้อยู่ในเกณฑ์ที่กำหนด ในกรณีเช่นนี้ เราสามารถใช้ประโยค HAVING ได้
สมมติว่าเราต้องการทราบปีที่ออกฉายทั้งหมดของหมวดหมู่ภาพยนตร์ id 8 เราจะใช้สคริปต์ต่อไปนี้เพื่อให้ได้ผลลัพธ์
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
ดำเนินการสคริปต์ข้างต้นใน MySQL การใช้งาน workbench กับ Myflixdb จะให้ผลลัพธ์ดังแสดงด้านล่างนี้
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
โปรดทราบว่าเฉพาะภาพยนตร์ที่มีรหัสหมวดหมู่ 8 เท่านั้นที่ได้รับผลกระทบจาก GROUP BY clause ของเรา
สรุป
- GROUP BY Clause SQL ใช้เพื่อจัดกลุ่มแถวที่มีค่าเดียวกัน
- GROUP BY Clause ใช้ร่วมกับ คำสั่ง SQL SELECT.
- คำสั่ง SELECT ที่ใช้ใน GROUP BY clause สามารถใช้ได้เฉพาะชื่อคอลัมน์ ฟังก์ชันการรวม ค่าคงที่ และนิพจน์เท่านั้น
- SQL Have Clause ใช้เพื่อจำกัดผลลัพธ์ที่ส่งคืนโดย GROUP BY clause
- คำสั่ง MYSQL GROUP BY ใช้ในการรวบรวมข้อมูลจากหลายเรกคอร์ดและส่งคืนชุดเรกคอร์ดโดยคอลัมน์หนึ่งคอลัมน์หรือมากกว่า