SQLでは、MAX()
functionは、指定された式の最大値を返す集計関数です。
以下は、それがどのように機能するかを示すためのいくつかの基本的な例です。
サンプルテーブル
次の表があるとします。
SELECT * FROM Products;
結果:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
例
次のクエリを使用して、そのテーブルから最大価格を取得できます。
SELECT MAX(ProductPrice)
FROM Products;
結果:
+--------------------+ | (No column name) | |--------------------| | 245.00 | +--------------------+
この場合、価格情報はProductPrice
に保存されます 列なので、それを引数としてMAX()
に渡します。 関数は、結果を計算して返します。
列エイリアスの使用
以前の結果には列名が含まれていないことに気付くでしょう。一部のDBMSは、MAX(ProductPrice)
のようなものを使用する場合があります 列名として。 MAX()
であるため、これは予想されることです。 関数は列を返しません。エイリアスを割り当てることで、列名を簡単に指定できます。
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
結果:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
フィルタリングされた結果
MAX()
関数は、クエリによって返された行を操作します。したがって、結果をフィルタリングすると、MAX()
の結果になります。 それを反映します。
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;
結果:
+----------------+ | MaximumPrice | |----------------| | 25.99 | +----------------+
この場合、25.99は、指定されたベンダーが提供するすべての製品の最高価格です。
NULL
値
MAX()
関数はNULL
を無視します 値。上記のサンプルテーブルでは、製品番号6
NULL
があります そのProductPrice
列ですが、MAX()
では無視されました 例。
DBMSと設定によっては、NULL
という警告が表示される場合と表示されない場合があります。 結果セットから値が削除されました。
表示される可能性のあるものの例を次に示します。
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
結果:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
これは、列に少なくとも1つのNULL
が含まれていることを示しています。 値であり、結果を計算するときに無視されたこと。
日付/時刻データ
MAX()
を使用できます 日付/時刻の値。
次の表があるとします。
SELECT PetName, DOB
FROM Pets;
結果:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
MAX()
を使用できます 最大生年月日を見つけるには(DOB
。
SELECT MAX(DOB) AS MaxDOB
FROM Pets;
結果:
+------------+ | MaxDOB | |------------| | 2020-11-28 | +------------+
これは最年少のペットの生年月日です。前述のように、NULL
は無視されます 値。
キャラクターデータ
文字データ列で使用する場合、MAX()
照合シーケンスで最も高い値を見つけます。
例:
SELECT MAX(ProductName) AS MaximumProductName
FROM Products;
結果:
+----------------------+ | MaximumProductName | |----------------------| | Straw Dog Box | +----------------------+
DISTINCT
キーワード
お使いのDBMSでDISTINCT
が許可されている場合があります MAX()
で使用されるキーワード 働き。もしそうなら、これはおそらくISOSQL標準に準拠するためです。
したがって、これを行うことができる場合があります:
SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;
結果:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
ただし、結果には影響しません。
DISTINCT
キーワードは、他のコンテキスト(COUNT()
など)で使用すると非常に便利です。 関数)ですが、MAX()
と一緒に使用しても意味がありません 。 DISTINCT
キーワードは重複を削除しますが、MAX()
の場合 MAX()
なので、違いはありません。 同じ最大値を共有する行の数に関係なく、同じ結果を返します。
ウィンドウ関数
DBMSによっては、OVER
を使用できる場合があります MAX()
を含む句 ウィンドウ関数を作成する関数。
ウィンドウ関数は、一連のクエリ行に対して集計のような操作を実行します。クエリ行ごとに結果が生成されます。これは、クエリ行を単一の結果行にグループ化する集計操作とは対照的です。
概念を示す例を次に示します。
Products
はすでに見てきました テーブル。私たちのデータベースにはCustomers
もあります テーブルであり、次のデータが含まれています:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 1254 | AUS | (415) 413-5182 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
これらのテーブルからデータを取得し、結合を使用して1つの結果セットとして表示できます。
MAX()
を使用することもできます OVER
で機能する データにウィンドウ関数を適用する句。
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MAX(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Maximum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Maximum Price For This Vendor";
結果:
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Maximum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 25.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 25.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 25.99 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+---------------------------------+
この場合、OVER
を使用しました MAX()
を含む句 結果をベンダー名で分割する関数。
これにより、各製品の価格情報と、その特定のベンダーからのすべての製品の最大価格を返すことができました。この最大価格はベンダーの変更に応じて変更されますが(複数のベンダーが同じ最大価格を持っている場合を除く)、同じベンダーのすべての製品で同じままです。
この概念は、SUM()
などのSQLの他の集計関数にも適用できます。 、MIN()
、AVG()
、およびCOUNT()
。