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

MySQL: เลือก Aggregate Function พร้อมคอลัมน์อื่นๆ ทั้งหมด

การแสดงค่า Aggregate (เช่น MAX) ทุกแถว พร้อมคอลัมน์รายละเอียด

เมื่อต้องการแสดงค่าสรุป (เช่น คะแนนสูงสุด) ในทุกแถว พร้อมกับข้อมูลรายตาราง ใช้ subquery ใน SELECT clause

สร้างตารางและข้อมูล

mysql> create table DemoTable1621 (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(20),
    -> StudentMarks int
    -> );
Query OK, 0 rows affected (1.69 sec)

mysql> insert into DemoTable1621(StudentName, StudentMarks) values('Chris', 45);
mysql> insert into DemoTable1621(StudentName, StudentMarks) values('Bob', 78);
mysql> insert into DemoTable1621(StudentName, StudentMarks) values('David', 89);
mysql> insert into DemoTable1621(StudentName, StudentMarks) values('Adam', 87);

ข้อมูลต้นฉบับ

+-----------+-------------+--------------+
| StudentId | StudentName | StudentMarks |
+-----------+-------------+--------------+
| 1         | Chris       | 45           |
| 2         | Bob         | 78           |
| 3         | David       | 89           |
| 4         | Adam        | 87           |
+-----------+-------------+--------------+

คำสั่ง SQL: Subquery ใน SELECT

mysql> select tblData.*, 
    -> (select max(StudentMarks) from DemoTable1621) as MaximumMarks 
    -> from DemoTable1621 tblData;

ผลลัพธ์

+-----------+-------------+--------------+--------------+
| StudentId | StudentName | StudentMarks | MaximumMarks |
+-----------+-------------+--------------+--------------+
| 1         | Chris       | 45           | 89           |
| 2         | Bob         | 78           | 89           |
| 3         | David       | 89           | 89           |
| 4         | Adam        | 87           | 89           |
+-----------+-------------+--------------+--------------+

วิธีอื่น: ใช้ Window Function (MySQL 8.0+)

SELECT 
  StudentId, StudentName, StudentMarks,
  MAX(StudentMarks) OVER () AS MaximumMarks
FROM DemoTable1621;

Window Function มีประสิทธิภาพดีกว่าเพราะไม่ต้องสแกนตารางซ้ำ

กรณีต้องการ GROUP BY พร้อมรายละเอียด

หากต้องการค่าสูงสุดต่อกลุ่ม (เช่น ต่อห้องเรียน) พร้อมรายชื่อนักเรียน ให้ใช้ MAX() OVER (PARTITION BY class_id) หรือ JOIN กับ subquery ที่ GROUP BY

สรุป

  • Subquery ใน SELECT: ใช้ได้ทุกเวอร์ชัน เข้าใจง่าย แต่อาจช้ากว่า
  • Window Function (MySQL 8.0+): แนะนำสำหรับ production เนื่องจากประสิทธิภาพและความอ่านง่าย