SQLでは、AVG()
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. | | 8 | 1001 | Right handed screwdriver | 25.99 | Blue. Includes right handed carry box. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
例
次のクエリを使用して、すべての価格の平均を取得できます。
SELECT AVG(ProductPrice)
FROM Products;
結果:
+--------------------+ | (No column name) | |--------------------| | 52.457142 | +--------------------+
この場合、価格情報はProductPrice
に保存されます 列なので、それを引数としてAVG()
に渡します。 次に、平均を計算して結果を返す関数。
列エイリアスの使用
以前の結果には列名が含まれていないことに気付くでしょう。 AVG()
であるため、これは予想されることです。 関数は列を返しません。エイリアスを割り当てることで、列名を簡単に指定できます。
SELECT AVG(ProductPrice) AS Average
FROM Products;
結果:
+-----------+ | Average | |-----------| | 52.457142 | +-----------+
フィルタリングされた結果
AVG()
関数は、クエリによって返された行を操作します。したがって、結果をフィルタリングすると、AVG()
の結果になります。 それを反映します。
SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001;
結果:
+-----------+ | Average | |-----------| | 19.680000 | +-----------+
この場合、19.680000は、指定されたベンダーが提供するすべての製品の平均価格です。
NULL
値
AVG()
関数はNULL
を無視します 値。上記のサンプルテーブルでは、製品番号6
NULL
があります そのProductPrice
列ですが、AVG()
では無視されました 例。
DBMSと設定によっては、NULL
という警告が表示される場合と表示されない場合があります。 結果セットから値が削除されました。
表示される可能性のあるものの例を次に示します。
SELECT AVG(ProductPrice) AS Average
FROM Products;
結果:
+-----------+ | Average | |-----------| | 52.457142 | +-----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
これは、列に少なくとも1つのNULL
が含まれていることを示しています。 値であり、結果を計算するときに無視されたこと。
日付/時刻データ
AVG()
関数は日付/時刻式を受け入れません。
次の表があるとします。
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 | +-----------+------------+
AVG()
を使おうとすると DOB
で 列、エラーが発生します。
SELECT AVG(DOB) AS Average
FROM Pets;
結果:
Msg 8117, Level 16, State 1, Line 1 Operand data type date is invalid for avg operator.
キャラクターデータ
AVG()
関数は文字列式も受け入れません。
AVG()
を使用しようとするとどうなりますか ProductName
で Products
の列 テーブル(varcharのデータ型を使用):
SELECT AVG(ProductName) AS Average
FROM Products;
結果:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for avg operator.
DISTINCT
キーワード
DISTINCT
を使用できます AVG()
を含むキーワード 個別の値のみを計算します。つまり、重複する値がある場合、それらは1つの値として扱われます。
例:
SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products;
結果:
+-------------------+ | DistinctAverage | |-------------------| | 56.868333 | +-------------------+
この結果は、DISTINCT
なしで得られた結果よりも高いことがわかります。 キーワード。
要約すると、DISTINCT
なしで52.457142を取得しました キーワード、およびDISTINCT
を使用した56.868333 キーワード。
これは、同じ価格のアイテムが2つあるためです(左ドライバーと右ドライバーの価格はどちらも25.99です)。したがって、AVG()
DISTINCT
とともに使用した場合の関数 キーワードは、これらの値の両方を1つとして扱い、それに応じて結果を計算します。
ウィンドウ関数
DBMSによっては、OVER
を使用できる場合があります AVG()
を含む句 ウィンドウ関数を作成する関数。
ウィンドウ関数は、一連のクエリ行に対して集計のような操作を実行します。クエリ行ごとに結果が生成されます。これは、クエリ行を単一の結果行にグループ化する集計操作とは対照的です。
概念を示す例を次に示します。
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つの結果セットとして表示できます。
AVG()
を使用することもできます OVER
で機能する データにウィンドウ関数を適用する句。
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
AVG(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Average For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Average For This Vendor";
結果:
+---------------+---------------------------------+----------------+---------------------------+ | VendorName | ProductName | ProductPrice | Average For This Vendor | |---------------+---------------------------------+----------------+---------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.990000 | | Mars Supplies | Long Weight (green) | 11.99 | 19.680000 | | Mars Supplies | Long Weight (blue) | 14.75 | 19.680000 | | Mars Supplies | Right handed screwdriver | 25.99 | 19.680000 | | Mars Supplies | Left handed screwdriver | 25.99 | 19.680000 | | Pedal Medals | Straw Dog Box | NULL | 245.000000 | | Pedal Medals | Chainsaw | 245.00 | 245.000000 | | Randy Roofers | Sledge Hammer | 33.49 | 33.490000 | +---------------+---------------------------------+----------------+---------------------------+
この場合、OVER
を使用しました AVG()
を含む句 結果をベンダー名で分割する関数。
これにより、各製品の価格情報と、その特定のベンダーからのすべての製品の平均価格を返すことができました。平均価格はベンダーの変更に応じて変更されますが(複数のベンダーの平均が同じである場合を除く)、同じベンダーのすべての製品で同じままです。
この概念は、SUM()
などのSQLの他の集計関数にも適用できます。 、MIN()
、MAX()
、およびCOUNT()
。