พลังของฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่มาจากการกรองข้อมูลและการรวมตารางเข้าด้วยกัน นี่คือเหตุผลที่เราเป็นตัวแทนของความสัมพันธ์เหล่านั้นตั้งแต่แรก แต่ระบบฐานข้อมูลสมัยใหม่มีเทคนิคที่มีคุณค่าอีกอย่างหนึ่ง นั่นคือ การจัดกลุ่ม
การจัดกลุ่มช่วยให้คุณสามารถดึงข้อมูลสรุปจากฐานข้อมูล ช่วยให้คุณสามารถรวมผลลัพธ์เพื่อสร้างข้อมูลทางสถิติที่เป็นประโยชน์ การจัดกลุ่มช่วยให้คุณไม่ต้องเขียนโค้ดสำหรับกรณีทั่วไป เช่น รายการตัวเลขเฉลี่ย และสามารถทำให้ระบบมีประสิทธิภาพมากขึ้น
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 เป็นผู้ที่ชื่นชอบเทคโนโลยีซึ่งทำงานเป็นนักพัฒนาซอฟต์แวร์มาเกือบสองทศวรรษ เขาหลงใหลในการเล่นเกม ทำงานเป็นบรรณาธิการบทวิจารณ์ที่ Switch Player Magazine และหมกมุ่นอยู่กับทุกแง่มุมของการเผยแพร่ออนไลน์และการพัฒนาเว็บ
เพิ่มเติมจาก Bobby Jackสมัครรับจดหมายข่าวของเรา
เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!
คลิกที่นี่เพื่อสมัครสมาชิก