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 ใช้ในการรวบรวมข้อมูลจากหลายเรกคอร์ดและส่งคืนชุดเรกคอร์ดโดยคอลัมน์หนึ่งคอลัมน์หรือมากกว่า