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

หาค่า Max และ Min พร้อมกันใน MySQL Query เดียว

เมื่อต้องการหาค่าสูงสุด (MAX) และต่ำสุด (MIN) ของหลายคอลัมน์ใน Query เดียว ให้ใช้ Aggregate Functions MIN() และ MAX() แยกคอลัมน์ด้วยจุลภาค

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

mysql> create table DemoTable (FirstValue int, SecondValue int);
mysql> insert into DemoTable values(10,30),(30,60),(100,500),(50,80);

ข้อมูลในตาราง

+------------+-------------+
| FirstValue | SecondValue |
+------------+-------------+
| 10         | 30          |
| 30         | 60          |
| 100        | 500         |
| 50         | 80          |
+------------+-------------+

คำสั่ง MIN/MAX หลายคอลัมน์

mysql> select min(FirstValue), min(SecondValue), max(FirstValue), max(SecondValue) from DemoTable;

ผลลัพธ์

+-----------------+------------------+-----------------+------------------+
| min(FirstValue) | min(SecondValue) | max(FirstValue) | max(SecondValue) |
+-----------------+------------------+-----------------+------------------+
| 10              | 30               | 100             | 500              |
+-----------------+------------------+-----------------+------------------+

เพิ่ม Alias อ่านง่าย

SELECT 
    MIN(FirstValue) AS min_first,
    MAX(FirstValue) AS max_first,
    MIN(SecondValue) AS min_second,
    MAX(SecondValue) AS max_second
FROM DemoTable;

ขยาย: รวม Aggregate อื่นๆ

SELECT 
    COUNT(*) AS cnt,
    MIN(FirstValue) AS min_val,
    MAX(FirstValue) AS max_val,
    AVG(FirstValue) AS avg_val,
    SUM(FirstValue) AS sum_val,
    STDDEV(FirstValue) AS stddev_val
FROM DemoTable;

NULL Handling

  • MIN/MAX/SUM/AVG ข้าม NULL อัตโนมัติ
  • ถ้าทุกค่าเป็น NULL → ผลลัพธ์ NULL (ยกเว้น COUNT(*) = 0)
  • ใช้ COALESCE: COALESCE(MIN(col), 0)

ประสิทธิภาพ

  • Single Table Scan - อ่านตารางครั้งเดียว คำนวณ Aggregate ทั้งหมดพร้อมกัน
  • Index บนคอลัมน์ช่วย MIN/MAX เร็วขึ้น (Index Seek แทน Full Scan)
  • Composite Index: INDEX idx_fv_sv (FirstValue, SecondValue)

Window Functions (MySQL 8.0+) - ต่อแถว

SELECT 
    FirstValue,
    MIN(FirstValue) OVER() AS min_overall,
    MAX(FirstValue) OVER() AS max_overall
FROM DemoTable;