Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

จัดกลุ่มชื่อและนับจำนวน แสดงในคอลัมน์ใหม่ด้วย GROUP BY และ COUNT() ใน MySQL

ภาพรวม

ใช้ GROUP BY จัดกลุ่มแถวที่มีค่าเหมือนกัน และ COUNT() นับจำนวนแถวในแต่ละกลุ่ม แสดงผลในคอลัมน์ใหม่

ตัวอย่างสมบูรณ์

1. สร้างตารางและข้อมูล (มีชื่อซ้ำ)

CREATE TABLE DemoTable (Name VARCHAR(30));

INSERT INTO DemoTable VALUES ('Chris');
INSERT INTO DemoTable VALUES ('Robert');
INSERT INTO DemoTable VALUES ('Mike');
INSERT INTO DemoTable VALUES ('Robert');
INSERT INTO DemoTable VALUES ('Mike');
INSERT INTO DemoTable VALUES ('David');

2. ข้อมูลทั้งหมด

SELECT * FROM DemoTable;
+--------+
| Name   |
+--------+
| Chris  |
| Robert |
| Mike   |
| Robert |
| Mike   |
| David  |
+--------+

3. GROUP BY + COUNT()

SELECT Name, COUNT(Name) AS NumberOfRowsPerName
FROM DemoTable
GROUP BY Name;

4. ผลลัพธ์

+--------+---------------------+
| Name   | NumberOfRowsPerName |
+--------+---------------------+
| Chris  | 1                   |
| Robert | 2                   |
| Mike   | 2                   |
| David  | 1                   |
+--------+---------------------+

รายละเอียด COUNT()

รูปแบบนับอะไรNULL
COUNT(*)ทุกแถวในกลุ่มนับ
COUNT(column)แถวที่ column ไม่ใช่ NULLไม่นับ
COUNT(DISTINCT column)ค่าที่ไม่ซ้ำในกลุ่มไม่นับ

การประยุกต์ใช้

เรียงตามจำนวนมากไปน้อย

SELECT Name, COUNT(*) AS Cnt
FROM DemoTable
GROUP BY Name
ORDER BY Cnt DESC;

กรองกลุ่มที่มีมากกว่า 1 (HAVING)

SELECT Name, COUNT(*) AS Cnt
FROM DemoTable
GROUP BY Name
HAVING COUNT(*) > 1;

หลายคอลัมน์ (Multi-column Grouping)

SELECT Department, JobTitle, COUNT(*) AS EmpCount
FROM Employees
GROUP BY Department, JobTitle;

ใช้ WITH ROLLUP (เพิ่มแถวรวม)

SELECT Name, COUNT(*) AS Cnt
FROM DemoTable
GROUP BY Name WITH ROLLUP;
-- เพิ่มแถวสุดท้าย: NULL | 6 (Total)

ข้อควรระวัง

  • คอลัมน์ใน SELECT ต้องอยู่ใน GROUP BY หรือเป็น Aggregate Function
  • MySQL (ONLY_FULL_GROUP_BY mode) บังคับให้อbey กฎนี้เข้มงวด
  • NULL ถูกจัดกลุ่มรวมกันเป็นกลุ่มเดียว

สรุป

SELECT col, COUNT(*) FROM table GROUP BY col - จัดกลุ่มและนับจำนวน แสดงในคอลัมน์ใหม่ (Alias ด้วย AS)