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和數位發行。