MAX() 函数通常用于返回给定列的最大值。它对类型并不挑剔,因此该列可能包含薪水、最佳食用日期或姓氏。问题是,MAX() 函数是否也能找到跨多列的最大值?简短的回答是肯定的。更长的解释是它取决于你使用的数据库。在今天的文章中,我们将探索一些获取两列或更多列中最大值的方法,可以使用 MAX() 函数,或者使用更好的替代方法。
MySQL 解决方案
如果你正在使用 MySQL,你可以将 MAX() 与 GREATEST() 函数结合使用,以从两个或多个字段中获取最大值。这是 GREATEST 的语法:
GREATEST(value1,value2,...)
给定两个或更多参数,它返回最大(最大值)的参数。如果任何参数为 NULL,则 GREATEST 返回 NULL。
示例
如果你要跨字段寻找最大值,比较包含相似数据的列会有所帮助,可以说是公平比较。classicmodels 数据库的 products 表包含两个相似的列:“buyPrice”和“MSRP”。两者都将美元数字存储为十进制数据:
理想情况下,GREATEST() 输入参数应该是标量值。碰巧的是,MAX() 函数返回列中的最大值!这是Navicat for SQL Server 中的查询和结果:
毫不奇怪,MSRP 包含最高值。否则,公司可能要考虑不同的供应商。
其他一些解决方案
对于其他不支持 GREATEST() 函数的数据库,有一些方法可以使用 MAX() 来比较多个列。只需要花一点功夫!以下是一些使用 SQL Server 的解决方案:
UNION ALL
UNION ALL 命令组合两个或多个 SELECT 语句的结果集。与 UNION 命令不同,UNION ALL 包括重复项。在任何情况下,都可以利用任一命令将不同的列组合成一个长结果集。然后可以将其结果视为从中派生最大值的子查询:
SELECT MAX(T.field) AS MaxOfColumns FROM ( SELECT column1 AS field FROM YourTable UNION ALL SELECT column2 AS field FROM YourTable UNION ALL SELECT column3 As field FROM YourTable) AS T
以下是针对 Navicat for SQL Server中的 Sakila 示例数据库的示例查询,其中包括 rentals 表中的租用日期和归还日期:
Select MAX from VALUES
SQL VALUES 关键字不仅仅用于 INSERT。你还可以使用以下语法从值列表中 SELECT:
select (values (1), (2), (3)) as temp(c)
该声明可以扩展以达到我们的目的,如下所示:
SELECT ( SELECT MAX(myval) FROM (VALUES (column1),(column2),(column3)) AS temp(myval) ) AS MaxOfColumns FROM YourTable
我们可以使用此模板作为我们对 rentals 表进行查询的基础:
总结
正如我们今天在这里看到的,有几种方法可以跨多列获取最大值。这些包括使用 GREATEST() 函数,或花一点功夫使用 MAX() 函数。
如果你对 Navicat for SQL Server 感兴趣,可以免费试用 14 天!
Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,他拥有多张 CD 和数字发行版。