การแสดงค่า 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 เนื่องจากประสิทธิภาพและความอ่านง่าย