下面的內容是個人學習記錄,來自https://www.yiibai.com/mysql/greatest-least.html。請大佬勿噴,這里是要強調一點東西。
MySQL GREATEST和LEAST函數介紹
它跟MAX()與MIN()函數的區別就是,前面是比較多個字段(列)的最大值最小值,后面是只獲取單個字段(列)的最大最小值。
GREATEST和LEAST函數都使用N個參數,並分別返回最大和最小值。下面說明GREATEST和LEAST函數的語法:
GREATEST(value1, value2, ...); LEAST(value1,value2,...);
參數可能具有混合數據類型。以下比較規則適用於這兩個函數:
-
首先
GREATEST(value1, value2, ...),這個函數比較的多個不同字段的數據的大小,而不是同一個字段下最大的數據。
例如:運行以下語句會報錯的。
1 SELECT 2 id, 3 `name`, 4 GREATEST(core) highCore 5 FROM 6 sys_menu;
[SQL]
SELECT
id,
`name`,
GREATEST(core) highCore
FROM sys_menu; [Err] 1582 - Incorrect parameter count in the call to native function 'GREATEST'
- 如果任何參數為NULL,則兩個函數都將立即返回
NULL,而不進行任何比較。 - 如果在INT或
Real上下文中使用函數,或者所有參數都是整數值或Real值,那么它們將分別作為int和Real來比較。 - 如果參數由數字和字符串組成,則函數將它們作為數字進行比較。
- 如果至少一個參數是非二進制(字符)字符串,則函數將將參數作為非二進制字符串進行比較。
- 在所有其他情況下,函數將參數作為二進制字符串進行比較
以下示例演示了GREATEST和LEAST函數的工作原理。
SELECT GREATEST(10, 20, 30), -- 30 LEAST(10, 20, 30); -- 10 SELECT GREATEST(10, null, 30), -- null, LEAST(10, null , 30); -- null
-- 具體的如何避免下面的情況,請往下看。
MySQL GREATEST和最小值的例子
下面為了演示,我們來創建一個名稱為:revenues的新表。
1 USE testdb; 2 3 CREATE TABLE IF NOT EXISTS revenues ( 4 company_id INT PRIMARY KEY, 5 q1 DECIMAL(19 , 2 ), 6 q2 DECIMAL(19 , 2 ), 7 q3 DECIMAL(19 , 2 ), 8 q4 DECIMAL(19 , 2 ) 9 );
revenues表由company_id作為主鍵,其它四個列分別存儲每季度公司的收入。
以下語句在revenues表中插入兩行 -
1 INSERT INTO revenues(company_id,q1,q2,q3,q4) 2 VALUES (1,100,120,110,130), 3 (2,250,260,300,310);
要獲得每個公司的最高和最低收入,可使用GREATEST和LOWEST,如下查詢語句:
SELECT company_id, LEAST(q1, q2, q3, q4) low, GREATEST(q1, q2, q3, q4) high FROM revenues;
執行上面查詢語句,得到以下結果 -
+------------+--------+--------+ | company_id | low | high | +------------+--------+--------+ | 1 | 100.00 | 130.00 | | 2 | 250.00 | 310.00 | +------------+--------+--------+ 2 rows in set
如果任何參數為NULL,則GREATEST和LEAST函數都返回NULL,這可能不是我們想要的。為了避免這種情況,可以使用IFNULL函數將NULL視為零來執行數字比較。
以下語句向revenues表中插入在q4列中帶有NULL值的一條新行。
1 INSERT INTO revenues(company_id,q1,q2,q3,q4) 2 VALUES (3,100,120,110,null);
如果使用GREATEST和LEAST函數來查詢數據,則可以得到按預期設計的結果。
1 SELECT 2 company_id, 3 LEAST(q1, q2, q3, q4) low, 4 GREATEST(q1, q2, q3, q4) high 5 FROM 6 revenues;
執行上面查詢語句,得到以下結果 -
+------------+--------+--------+ | company_id | low | high | +------------+--------+--------+ | 1 | 100.00 | 130.00 | | 2 | 250.00 | 310.00 | | 3 | NULL | NULL | +------------+--------+--------+ 3 rows in set
如上面查詢所見,其ID=3的公司的最低值和最高值為NULL。
為避免這種情況,您可以使用IFNULL函數,如下:
1 SELECT 2 company_id, 3 LEAST(IFNULL(q1, 0), 4 IFNULL(q2, 0), 5 IFNULL(q3, 0), 6 IFNULL(q4, 0)) low, 7 GREATEST(IFNULL(q1, 0), 8 IFNULL(q2, 0), 9 IFNULL(q3, 0), 10 IFNULL(q4, 0)) high 11 FROM 12 revenues;
執行上面查詢語句,得到以下結果 -
+------------+--------+--------+ | company_id | low | high | +------------+--------+--------+ | 1 | 100.00 | 130.00 | | 2 | 250.00 | 310.00 | | 3 | 0.00 | 120.00 | +------------+--------+--------+ 3 rows in set
