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

การหาค่าสูงสุด (MAX) จากระเบียนใน MySQL

เมื่อต้องการหาระเบียนที่มีค่าสูงสุดในคอลัมน์ตัวเลข (เช่น คะแนนสูงสุด) ใช้ฟังก์ชัน 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 + LIMITSELECT * FROM t ORDER BY PlayerScore DESC LIMIT 1เร็วกว่า (ใช้ Index ได้) แต่ได้แค่ 1 แถว (ถ้ามีค่าสูงสุดซ้ำหลายแถว จะได้แค่ 1)
JOINSELECT 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, ...): ค่าต่ำสุดจากหลายคอลัมน์/ค่า