下面的内容是个人学习记录,来自https://www.yiibai.com/mysql/greatest-least.html。请大佬勿喷,这里是要强调一点东西。
MySQL GREATEST和LEAST函数介绍
它跟MAX()与MIN()函数的区别就是,前面是比较多个字段(列)的最大值最小值,后面是只获取单个字段(列)的最大最小值。
GREATEST
和LEAST
函数都使用N
个参数,并分别返回最大和最小值。下面说明GREATEST
和LEAST
函数的语法:
GREATEST(value1, value2, ...); LEAST(value1,value2,...);
SQL
参数可能具有混合数据类型。以下比较规则适用于这两个函数:
-
首先
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
SQL
如上面查询所见,其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