SQLでは、GROUP BY
句を使用して、クエリの結果を行のグループに分割できます。
これは通常、各グループで1つ以上の集計を実行するために行われます。
例1
GROUP BY
を示す例を次に示します。 条項。
次の表を見てください:
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 | 55.99 | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
そのテーブルに対して次のクエリを実行できます。
SELECT
VendorId,
COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;
結果:
+------------+---------+ | VendorId | Count | |------------+---------| | 1001 | 3 | | 1002 | 1 | | 1003 | 2 | | 1004 | 1 | +------------+---------+
ここでは、COUNT()
を使用します 各VendorId
の行数を返す集計関数 、次にGROUP BY
結果をグループ化する句。
例2
この例では、SUM()
を使用します 地区内のすべての都市の総人口を返す集計関数、次にGROUP BY
結果をグループ化する句。
City
というテーブルがあるとします。 これは、都市名とその人口、およびそれぞれの国コードと地区を(それぞれの個別の列に)格納します。
このように:
SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');
結果:
+------+---------------+---------------+-----------------+--------------+ | ID | Name | CountryCode | District | Population | |------+---------------+---------------+-----------------+--------------| | 56 | Luanda | AGO | Luanda | 2022000 | | 57 | Huambo | AGO | Huambo | 163100 | | 58 | Lobito | AGO | Benguela | 130000 | | 59 | Benguela | AGO | Benguela | 128300 | | 60 | Namibe | AGO | Namibe | 118200 | | 64 | Dubai | ARE | Dubai | 669181 | | 65 | Abu Dhabi | ARE | Abu Dhabi | 398695 | | 66 | Sharja | ARE | Sharja | 320095 | | 67 | al-Ayn | ARE | Abu Dhabi | 225970 | | 68 | Ajman | ARE | Ajman | 114395 | | 130 | Sydney | AUS | New South Wales | 3276207 | | 131 | Melbourne | AUS | Victoria | 2865329 | | 132 | Brisbane | AUS | Queensland | 1291117 | | 133 | Perth | AUS | West Australia | 1096829 | | 134 | Adelaide | AUS | South Australia | 978100 | | 135 | Canberra | AUS | Capital Region | 322723 | | 136 | Gold Coast | AUS | Queensland | 311932 | | 137 | Newcastle | AUS | New South Wales | 270324 | | 138 | Central Coast | AUS | New South Wales | 227657 | | 139 | Wollongong | AUS | New South Wales | 219761 | | 140 | Hobart | AUS | Tasmania | 126118 | | 141 | Geelong | AUS | Victoria | 125382 | | 142 | Townsville | AUS | Queensland | 109914 | | 143 | Cairns | AUS | Queensland | 92273 | +------+---------------+---------------+-----------------+--------------+
結果を3か国に減らしました。そうしないと、リストはになります。 この記事には長すぎます。
ここで、各地区の人口を取得し、各地区をその人口と国コードとともに一覧表示したいとします。
これができます。
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;
結果:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Benguela | 258300 | | AGO | Huambo | 163100 | | AGO | Luanda | 2022000 | | AGO | Namibe | 118200 | | ARE | Abu Dhabi | 624665 | | ARE | Ajman | 114395 | | ARE | Dubai | 669181 | | ARE | Sharja | 320095 | | AUS | Capital Region | 322723 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | South Australia | 978100 | | AUS | Tasmania | 126118 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
結果が指定どおりにグループ化されていることがわかります。これで、各地区の完全な人口が取得されます(個々の都市の人口とは対照的に、基になるテーブルに格納されます)。
GROUP BY
に注意してください 句は、WHERE
の後に指定する必要があります 句とORDER BY
の前 条項。
地区ではなく各国の人口を取得したい場合、クエリはさらにコンパクトになります。
SELECT
CountryCode,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;
結果:
+---------------+--------------+ | CountryCode | Population | |---------------+--------------| | AGO | 2561600 | | ARE | 1728336 | | AUS | 11313666 | +---------------+--------------+
この特定のサンプルデータベースは非常に古く、人口数は現在の現実を反映していないことに注意してください。
例3–HAVING句
HAVING
を含めることができます GROUP BY
を含む句 グループをフィルタリングする句。
例:
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;
結果:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
HAVING
句はWHERE
に似ています WHERE
を除く句 HAVING
に対して、個々の行をフィルタリングします グループをフィルタリングします。
また、WHERE
句は前のデータをフィルタリングします グループ化されているのに対し、HAVING
後のデータをフィルタリングします グループ化されます。
HAVING
句は、WHERE
で使用できるのと同じ演算子を受け入れます 句(=
など) 、) Operator for Beginners">>
、=) Operator for Beginners">>=
、IN
、LIKE
など)。