MySQL GREATEST and LEAST

摘要:在本教程中,您将学习如何使用 MySQL GREATESTLEAST函数分别查找两个或多个字段的最大值和最小值。

MySQL GREATEST 和 LEAST 函数简介

GREATESTLEAST函数都接受 N 个参数并分别返回最大值和最小值。下面说明了GREATESTLEAST函数的语法:

GREATEST(value1, value2, ...);
LEAST(value1,value2,...);
Code language: SQL (Structured Query Language) (sql)

参数可以具有混合数据类型。以下比较规则适用于这两个函数:

  • 如果任何参数为NULL ,则两个函数立即返回 NULL 而不进行任何比较。
  • 如果函数在INT或 REAL 上下文中使用,或者所有参数都是整数值或 REAL 值,则它们将分别作为 INT 和 REAL 进行比较。
  • 如果参数同时包含数字和字符串,函数会将它们作为数字进行比较。
  • 如果至少一个参数是非二进制(字符)字符串,则函数会将参数作为非二进制字符串进行比较。
  • 在所有其他情况下,函数将参数作为二进制字符串进行比较。

以下示例演示了GREATESTLEAST函数的工作原理。

SELECT GREATEST(10, 20, 30),  -- 30
       LEAST(10, 20, 30); -- 10


SELECT GREATEST(10, null, 30),  -- null
       LEAST(10, null , 30); -- null
Code language: SQL (Structured Query Language) (sql)

MySQL 最伟大和最不重要的例子

让我们创建一个新表来进行演示。

CREATE TABLE IF NOT EXISTS revenues (
    company_id INT PRIMARY KEY,
    q1 DECIMAL(19 , 2 ),
    q2 DECIMAL(19 , 2 ),
    q3 DECIMAL(19 , 2 ),
    q4 DECIMAL(19 , 2 )
);
Code language: SQL (Structured Query Language) (sql)

revenues表由作为主键的company_id和四列组成,用于存储公司每个季度的收入。

以下语句将两行插入revenues表中。

INSERT INTO revenues(company_id,q1,q2,q3,q4)
VALUES (1,100,120,110,130),
       (2,250,260,300,310);
Code language: SQL (Structured Query Language) (sql)

要获得每个公司的最高和最低收入,您可以使用GREATESTLOWEST函数,如下所示:

SELECT 
    company_id,
    LEAST(q1, q2, q3, q4) low,
    GREATEST(q1, q2, q3, q4) high
FROM
    revenues;
Code language: SQL (Structured Query Language) (sql)
MySQL GREATEST and LEAST example

如果任何参数为 NULL,那么GREATESTLEAST函数都会返回 NULL,这可能不是您所期望的。为了避免这种情况,可以使用IFNULL函数将 NULL 视为零来执行数值比较。

以下语句将新行插入到revenues表中,其中q4列中的值为 NULL。

INSERT INTO revenues(company_id,q1,q2,q3,q4)
VALUES (3,100,120,110,null);
Code language: SQL (Structured Query Language) (sql)

如果您使用GREATESTLEAST函数来查询数据,您将得到设计的结果。

SELECT 
    company_id,
    LEAST(q1, q2, q3, q4) low,
    GREATEST(q1, q2, q3, q4) high
FROM
    revenues;
Code language: SQL (Structured Query Language) (sql)

如您所见,公司 id 3 的低值和高值均为 NULL。

为了避免这种情况,您可以使用IFNULL函数,如下所示:

SELECT 
    company_id,
    LEAST(IFNULL(q1, 0),
            IFNULL(q2, 0),
            IFNULL(q3, 0),
            IFNULL(q4, 0)) low,
    GREATEST(IFNULL(q1, 0),
            IFNULL(q2, 0),
            IFNULL(q3, 0),
            IFNULL(q4, 0)) high
FROM
    revenues;
Code language: SQL (Structured Query Language) (sql)
MySQL GREATEST and LEAST example with IFNULL

在本教程中,您学习了如何使用 MySQL GREATESTLEAST函数来查找值列表中的最大值和最小值。

本教程有帮助吗?