首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 多列最大值比較:IF 函數巧用與 GREATEST 函數優雅方案

     編輯:MySQL 綜合教學

MySQL 多列取最大值:從嵌套 IF 到 GREATEST 函數的優雅演進

業務場景:表 abc(uid, num1, num2, num3),需查詢每行三列中的最大值並顯示 uid, max_num。本文對比嵌套 IF 寫法與標準函數 GREATEST(),展示最佳實踐。

表結構

CREATE TABLE `abc` (
    `uid` INT(10) NOT NULL,
    `num1` INT(8) NOT NULL,
    `num2` INT(8) NOT NULL,
    `num3` INT(8) NOT NULL,
    PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

方案一:嵌套 IF(原始寫法,可讀性差、效率低)

SELECT 
    IF(
        (SELECT IF(num1 > num2, num1, num2)) > num3,
        (SELECT IF(num1 > num2, num1, num2)),
        num3
    ) AS max_num, uid
FROM abc;

缺點:重複計算、嵌套子查詢、可讀性極差、優化器難以優化。

方案二:GREATEST() 函數(標準 SQL,MySQL 原生支持,推薦)

SELECT GREATEST(num1, num2, num3) AS max_num, uid FROM abc;

優勢**:

  • 語義清晰,標準 SQL:2003 函數
  • 可變參數:GREATEST(val1, val2, ..., valN)
  • 自動處理 NULL:任一參數為 NULL 結果為 NULL(可配合 IFNULL/COALESCE)
  • 執行計劃簡單,無臨時表、無文件排序

結果對比

+--------+-----+
| max_num| uid |
+--------+-----+
|      3 |   1 |
|      3 |   2 |
|      4 |   3 |
|      5 |   4 |
|      8 |   5 |
|     13 |   6 |
|     56 |   7 |
+--------+-----+
7 rows in set

延伸:LEAST() 取最小值、NULL 處理、條件最大值

  • 最小值:LEAST(num1, num2, num3)
  • 忽略 NULL 取最大:GREATEST(IFNULL(num1,0), IFNULL(num2,0), IFNULL(num3,0))
  • 條件最大值(如僅比較大於 0 的列):
    SELECT GREATEST(
        CASE WHEN num1 > 0 THEN num1 ELSE NULL END,
        CASE WHEN num2 > 0 THEN num2 ELSE NULL END,
        CASE WHEN num3 > 0 THEN num3 ELSE NULL END
    ) AS max_num FROM abc;
    

性能對比

指標嵌套 IFGREATEST()
解析時間較長極短
執行計劃可能產生臨時表簡單投影
可維護性極低高
擴展性修改極其困難增加參數即可

結論

多列比較最大/最小值,首選 GREATEST()/LEAST()。僅在極其複雜的條件邏輯下(如不同列不同權重、分段函數)才考慮 CASE WHEN 組合。拒絕嵌套 IF/子查詢反模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved