เมื่อต้องการหาระเบียนที่มีค่าสูงสุดในคอลัมน์ตัวเลข (เช่น คะแนนสูงสุด) ใช้ฟังก์ชัน MAX() ร่วมกับ Subquery หรือ JOIN
ตัวอย่างการใช้งาน
สร้างตารางคะแนนผู้เล่น:
mysql> CREATE TABLE DemoTable1449 (
-> PlayerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> PlayerScore INT
-> );
เพิ่มข้อมูล:
mysql> INSERT INTO DemoTable1449 (PlayerScore) VALUES (1040), (1450), (1890), (1650);
ดูข้อมูล:
mysql> SELECT * FROM DemoTable1449; +----------+-------------+ | PlayerId | PlayerScore | +----------+-------------+ | 1 | 1040 | | 2 | 1450 | | 3 | 1890 | | 4 | 1650 | +----------+-------------+
หาผู้เล่นที่มีคะแนนสูงสุด (Subquery):
mysql> SELECT PlayerId, PlayerScore FROM DemoTable1449
-> WHERE PlayerScore = (SELECT MAX(PlayerScore) FROM DemoTable1449);
ผลลัพธ์:
+----------+-------------+ | PlayerId | PlayerScore | +----------+-------------+ | 3 | 1890 | +----------+-------------+
วิธีทางเลือกอื่นๆ
| วิธี | คำสั่ง | ข้อดี/ข้อเสีย |
|---|---|---|
| Subquery (ด้านบน) | WHERE col = (SELECT MAX(col) FROM t) | อ่านง่าย, รองรับหลายคอลัมน์ใน SELECT |
| ORDER BY + LIMIT | SELECT * FROM t ORDER BY PlayerScore DESC LIMIT 1 | เร็วกว่า (ใช้ Index ได้) แต่ได้แค่ 1 แถว (ถ้ามีค่าสูงสุดซ้ำหลายแถว จะได้แค่ 1) |
| JOIN | SELECT t1.* FROM t t1 JOIN (SELECT MAX(PlayerScore) ms FROM t) t2 ON t1.PlayerScore = t2.ms | ได้ทุกแถวที่มีค่าสูงสุด, ประสิทธิภาพดี |
| Window Function (MySQL 8.0+) | SELECT * FROM (SELECT *, MAX(PlayerScore) OVER () AS max_score FROM t) x WHERE PlayerScore = max_score | ทันสมัย, อ่านง่าย, ได้ทุกแถวที่เท่ากัน |
กรณีมีหลายคนคะแนนสูงสุดเท่ากัน
Subquery และ JOIN จะคืนทุกแถวที่เท่ากัน (Tie) ในขณะที่ ORDER BY LIMIT 1 จะได้แค่ 1 แถว
การประยุกต์ใช้
- หาสินค้าขายดีที่สุด:
MAX(SalesAmount) - หาพนักงานยอดขายสูงสุด:
MAX(TotalSales) - หาวันที่มีออเดอร์มากที่สุด:
MAX(OrderCount) GROUP BY OrderDate - หาค่าสูงสุดต่อกลุ่ม:
SELECT Category, MAX(Price) FROM Products GROUP BY Category
ฟังก์ชันรวมที่เกี่ยวข้อง
- MIN(): ค่าต่ำสุด
- MAX(): ค่าสูงสุด
- GREATEST(val1, val2, ...): ค่าสูงสุดจากหลายคอลัมน์/ค่า (Row-wise)
- LEAST(val1, val2, ...): ค่าต่ำสุดจากหลายคอลัมน์/ค่า