ทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับคำสั่ง SQL GROUP BY Statement

ทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับคำสั่ง SQL GROUP BY Statement

พลังของฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่มาจากการกรองข้อมูลและการรวมตารางเข้าด้วยกัน นี่คือเหตุผลที่เราเป็นตัวแทนของความสัมพันธ์เหล่านั้นตั้งแต่แรก แต่ระบบฐานข้อมูลสมัยใหม่มีเทคนิคที่มีคุณค่าอีกอย่างหนึ่ง นั่นคือ การจัดกลุ่ม





การจัดกลุ่มช่วยให้คุณสามารถดึงข้อมูลสรุปจากฐานข้อมูล ช่วยให้คุณสามารถรวมผลลัพธ์เพื่อสร้างข้อมูลทางสถิติที่เป็นประโยชน์ การจัดกลุ่มช่วยให้คุณไม่ต้องเขียนโค้ดสำหรับกรณีทั่วไป เช่น รายการตัวเลขเฉลี่ย และสามารถทำให้ระบบมีประสิทธิภาพมากขึ้น





GROUP BY ข้อทำอะไร?

GROUP BY ตามชื่อที่แนะนำ กลุ่มผลลัพธ์เป็นชุดที่เล็กกว่า ผลลัพธ์ประกอบด้วยหนึ่งแถวสำหรับแต่ละค่าที่แตกต่างกันของคอลัมน์ที่จัดกลุ่ม เราสามารถแสดงการใช้งานโดยดูข้อมูลตัวอย่างด้วยแถวที่มีค่าร่วมกันบางส่วน





โทรศัพท์ของฉันมีป๊อปอัปอยู่เรื่อยๆ

ต่อไปนี้เป็นฐานข้อมูลง่ายๆ ที่มีสองตารางแสดงอัลบั้มบันทึก คุณสามารถตั้งค่าฐานข้อมูลดังกล่าวโดย การเขียนแบบแผนพื้นฐาน สำหรับระบบฐานข้อมูลที่คุณเลือก NS อัลบั้ม ตารางมีเก้าแถวพร้อมคีย์หลัก NS คอลัมน์และคอลัมน์สำหรับชื่อ ศิลปิน ปีที่วางจำหน่าย และการขาย:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

NS ศิลปิน ตารางจะง่ายยิ่งขึ้น มีเจ็ดแถวพร้อมคอลัมน์รหัสและชื่อ:



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

คุณสามารถเข้าใจแง่มุมต่างๆ ของ GROUP BY ด้วยชุดข้อมูลง่ายๆ เช่นนี้ แน่นอน ชุดข้อมูลในชีวิตจริงจะมีแถวอีกมากมาย แต่หลักการยังคงเหมือนเดิม

การจัดกลุ่มตามคอลัมน์เดียว

สมมติว่าเราต้องการทราบจำนวนอัลบั้มที่เรามีสำหรับศิลปินแต่ละคน เริ่มต้นด้วย a เลือก แบบสอบถามเพื่อดึงคอลัมน์ artist_id:





SELECT artist_id FROM albums

ส่งคืนทั้งเก้าแถวตามที่คาดไว้:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

หากต้องการจัดกลุ่มผลการค้นหาเหล่านี้ตามศิลปิน ให้ผนวกวลี กลุ่มตามศิลปิน_id :





SELECT artist_id FROM albums GROUP BY artist_id

ซึ่งให้ผลลัพธ์ดังต่อไปนี้:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

มีเจ็ดแถวในชุดผลลัพธ์ ลดลงจากทั้งหมดเก้าใน อัลบั้ม ตาราง. แต่ละอันไม่ซ้ำกัน ศิลปิน_id มีแถวเดียว สุดท้าย ในการนับจำนวนจริง ให้เติม นับ(*) ไปยังคอลัมน์ที่เลือก:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

ผลลัพธ์กลุ่มสองแถวสำหรับศิลปินที่มีรหัส 2 และ 6 . แต่ละอัลบั้มมีสองอัลบั้มในฐานข้อมูลของเรา

ที่เกี่ยวข้อง: แผ่นโกงคำสั่ง SQL ที่จำเป็นสำหรับผู้เริ่มต้น

วิธีเข้าถึงข้อมูลที่จัดกลุ่มด้วยฟังก์ชันรวม

คุณอาจเคยใช้ นับ มาก่อนโดยเฉพาะใน นับ(*) แบบที่เห็นด้านบน มันดึงจำนวนผลลัพธ์ในชุด คุณสามารถใช้เพื่อรับจำนวนระเบียนทั้งหมดในตาราง:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNT เป็นฟังก์ชันการรวม คำนี้หมายถึงฟังก์ชันที่แปลค่าจากหลายแถวเป็นค่าเดียว มักใช้ร่วมกับคำสั่ง GROUP BY

แทนที่จะนับจำนวนแถว เราสามารถใช้ฟังก์ชันการรวมกับค่าที่จัดกลุ่มได้:

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

ยอดขายทั้งหมดที่แสดงด้านบนสำหรับศิลปิน 2 และ 6 คือยอดขายของอัลบั้มหลายอัลบั้มรวมกัน:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

การจัดกลุ่มตามหลายคอลัมน์

คุณสามารถจัดกลุ่มได้มากกว่าหนึ่งคอลัมน์ เพียงใส่หลายคอลัมน์หรือนิพจน์ โดยคั่นด้วยเครื่องหมายจุลภาค ผลลัพธ์จะจัดกลุ่มตามการรวมกันของคอลัมน์เหล่านี้

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

โดยทั่วไปแล้วจะให้ผลลัพธ์มากกว่าการจัดกลุ่มตามคอลัมน์เดียว:

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

โปรดทราบว่าในตัวอย่างเล็กๆ ของเรา มีเพียงสองอัลบั้มที่มีปีที่วางจำหน่ายและยอดขายเท่ากัน (28 ในปี 1977)

ฟังก์ชันรวมที่มีประโยชน์

นอกเหนือจาก COUNT แล้ว ฟังก์ชันหลายอย่างยังทำงานได้ดีกับ GROUP แต่ละฟังก์ชันจะส่งคืนค่าตามระเบียนที่เป็นของกลุ่มผลลัพธ์แต่ละกลุ่ม

  • COUNT() ส่งกลับจำนวนรวมของเรคคอร์ดที่ตรงกัน
  • SUM() คืนค่าผลรวมของค่าทั้งหมดในคอลัมน์ที่กำหนด
  • MIN() ส่งคืนค่าที่น้อยที่สุดในคอลัมน์ที่กำหนด
  • MAX() ส่งคืนค่าที่มากที่สุดในคอลัมน์ที่กำหนด
  • AVG() ส่งคืนค่าค่าเฉลี่ย มีค่าเท่ากับ SUM() / COUNT()

คุณยังสามารถใช้ฟังก์ชันเหล่านี้ได้โดยไม่ต้องใช้ส่วนคำสั่ง GROUP:

บูตพีซีจากโทรศัพท์ Android โดยไม่ต้องรูท
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

ใช้ GROUP BY กับ WHERE ข้อ

เช่นเดียวกับ SELECT ปกติ คุณยังคงสามารถใช้ WHERE เพื่อกรองชุดผลลัพธ์ได้:

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

ตอนนี้คุณมีเพียงอัลบั้มที่ออกหลังจากปี 1990 โดยจัดกลุ่มตามศิลปิน คุณยังสามารถใช้การรวมกับส่วนคำสั่ง WHERE แยกจาก GROUP BY:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

อย่างไรก็ตาม โปรดทราบว่าหากคุณพยายามกรองตามคอลัมน์แบบรวม:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

คุณจะได้รับข้อผิดพลาด:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

คอลัมน์ที่ยึดตามข้อมูลรวมไม่สามารถใช้ได้ในอนุประโยค WHERE

การใช้ HAVING Clause

ดังนั้นคุณจะกรองชุดผลลัพธ์หลังจากการจัดกลุ่มได้อย่างไร NS มี ข้อที่เกี่ยวข้องกับความต้องการนี้:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

โปรดทราบว่าส่วนคำสั่ง HAVING จะอยู่หลัง GROUP BY มิเช่นนั้นจะเป็นการแทนที่ WHERE ด้วย HAVING อย่างง่าย ผลลัพธ์คือ:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

คุณยังสามารถใช้เงื่อนไข WHERE เพื่อกรองผลลัพธ์ก่อนการจัดกลุ่มได้ จะทำงานร่วมกับส่วนคำสั่ง HAVING สำหรับการกรองหลังจากการจัดกลุ่ม:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

มีศิลปินเพียงคนเดียวในฐานข้อมูลของเราที่ออกอัลบั้มมากกว่าหนึ่งอัลบั้มหลังจากปี 1990:

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

การรวมผลลัพธ์กับ GROUP BY

คำสั่ง GROUP BY เป็นส่วนที่มีประโยชน์อย่างยิ่งของภาษา SQL สามารถให้ข้อมูลสรุปข้อมูลสำหรับหน้าเนื้อหาเป็นต้น เป็นทางเลือกที่ดีในการดึงข้อมูลปริมาณมาก ฐานข้อมูลจัดการกับปริมาณงานพิเศษนี้ได้ดี เนื่องจากการออกแบบทำให้เหมาะสมที่สุดสำหรับงาน

เมื่อคุณเข้าใจการจัดกลุ่มและวิธีเข้าร่วมหลายตารางแล้ว คุณจะสามารถใช้พลังส่วนใหญ่ของฐานข้อมูลเชิงสัมพันธ์ได้

แบ่งปัน แบ่งปัน ทวีต อีเมล วิธีสืบค้นตารางฐานข้อมูลหลายตารางพร้อมกันด้วย SQL Joins

เรียนรู้วิธีใช้การรวม SQL เพื่อเพิ่มประสิทธิภาพการสืบค้น ประหยัดเวลา และทำให้คุณรู้สึกเหมือนเป็นผู้ใช้ SQL

วิธีที่ดีที่สุดในการบันทึกรายการทีวี
อ่านต่อไป หัวข้อที่เกี่ยวข้อง
  • การเขียนโปรแกรม
  • SQL
เกี่ยวกับผู้เขียน Bobby Jack(58 บทความเผยแพร่)

Bobby เป็นผู้ที่ชื่นชอบเทคโนโลยีซึ่งทำงานเป็นนักพัฒนาซอฟต์แวร์มาเกือบสองทศวรรษ เขาหลงใหลในการเล่นเกม ทำงานเป็นบรรณาธิการบทวิจารณ์ที่ Switch Player Magazine และหมกมุ่นอยู่กับทุกแง่มุมของการเผยแพร่ออนไลน์และการพัฒนาเว็บ

เพิ่มเติมจาก Bobby Jack

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก