จัดกลุ่มและสรุปข้อมูลด้วย GROUP BY และ Aggregate Functions
GROUP BY จัดกลุ่มแถวที่มีค่าเหมือนกันในคอลัมน์ที่ระบุ แล้วใช้ Aggregate Function (SUM, COUNT, AVG, MIN, MAX) คำนวณค่าสรุปต่อกลุ่ม
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Subject VARCHAR(20),
Price INT
);
INSERT INTO DemoTable (Subject, Price) VALUES
('MySQL', 456), ('MySQL', 456), ('MongoDB', 56), ('MongoDB', 60), ('Java', 100), ('Java', 130);
ข้อมูลในตาราง
+----+---------+-------+ | Id | Subject | Price | +----+---------+-------+ | 1 | MySQL | 456 | | 2 | MySQL | 456 | | 3 | MongoDB | 56 | | 4 | MongoDB | 60 | | 5 | Java | 100 | | 6 | Java | 130 | +----+---------+-------+
คำสั่ง GROUP BY Subject และ SUM(Price)
SELECT SUM(Price) AS Total, Subject FROM DemoTable GROUP BY Subject;
ผลลัพธ์
+-------+---------+ | Total | Subject | +-------+---------+ | 912 | MySQL | | 116 | MongoDB | | 230 | Java | +-------+---------+
คำอธิบาย:
GROUP BY Subjectจัดกลุ่ม 3 กลุ่ม: MySQL (2 แถว), MongoDB (2 แถว), Java (2 แถว)SUM(Price)รวมราคาในแต่ละกลุ่ม- คอลัมน์ใน SELECT ต้องเป็น: คอลัมน์ใน GROUP BY, หรือ Aggregate Function เท่านั้น (SQL Standard)
ฟังก์ชันสรุปอื่นๆ:
COUNT(*)นับจำนวนแถวต่อกลุ่มAVG(Price)ค่าเฉลี่ยMIN(Price), MAX(Price)ค่าต่ำสุด/สูงสุดGROUP_CONCAT(Price)รวมค่าเป็นสตริง
⚐ SQL Mode ONLY_FULL_GROUP_BY: MySQL 5.7+ เปิดโดยค่าเริ่มต้น ห้าม SELECT คอลัมน์ที่ไม่อยู่ใน GROUP BY และไม่ใช่ Aggregate ต้องปิดโหมดนี้หรือเขียน Query ให้ถูกต้อง