zoukankan      html  css  js  c++  java
  • MySQL greatest()和least()函数与MAX()和MIN()函数

    下面的内容是个人学习记录,来自https://www.yiibai.com/mysql/greatest-least.html。请大佬勿喷,这里是要强调一点东西。

    MySQL GREATEST和LEAST函数介绍

    它跟MAX()与MIN()函数的区别就是,前面是比较多个字段(列)的最大值最小值,后面是只获取单个字段(列)的最大最小值。

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

    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,而不进行任何比较。
    • 如果在INTReal上下文中使用函数,或者所有参数都是整数值或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

     --  具体的如何避免下面的情况,请往下看。

    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);

    要获得每个公司的最高和最低收入,可使用GREATESTLOWEST,如下查询语句:

    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,则GREATESTLEAST函数都返回NULL,这可能不是我们想要的。为了避免这种情况,可以使用IFNULL函数将NULL视为零来执行数字比较。

    以下语句向revenues表中插入在q4列中带有NULL值的一条新行。

    1 INSERT INTO revenues(company_id,q1,q2,q3,q4)
    2 VALUES (3,100,120,110,null);

    如果使用GREATESTLEAST函数来查询数据,则可以得到按预期设计的结果。

    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
  • 相关阅读:
    windows live writer backup
    SQL SERVER单独安装
    VS异常--未找到与约束 ContractName Microsoft.VisualStudio.Language.Intellisense.IGlyphService RequiredTypeIdentity
    ASP.NET之报表--RDLC(一)---附源码
    尚未指定报表“Report1”的报表定义
    人月神话
    [LeetCode]Reverse Nodes in k-Group
    [LeetCode]Divide Two Integer
    [LeetCode]Minimum Path Sum
    [LeetCode]Regular Expression Matching
  • 原文地址:https://www.cnblogs.com/yuezc/p/12098400.html
Copyright © 2011-2022 走看看