SQLのGROUP BY 1って何? 徹底解説とサンプルコード
SQL句「GROUP BY 1」の意味
SQLの GROUP BY
句は、レコードをグループ化し、グループごとに集計を行うための機能です。GROUP BY 1
は、SELECT
文の最初の列をグループ化キーとして指定します。
詳細:
GROUP BY
句は、SELECT
文の後に記述します。GROUP BY
句の後に、グループ化キーとなる列名をカンマ区切りで指定します。GROUP BY 1
は、SELECT
文の最初の列をグループ化キーとして指定します。GROUP BY
句と併せて、COUNT()
、SUM()
、AVG()
などの集計関数を用いることで、グループごとの集計値を算出できます。
例:
SELECT country, COUNT(*) AS total_population
FROM world_population
GROUP BY 1;
上記の例では、world_population
テーブルのレコードを国ごとにグループ化し、各国の総人口を算出しています。
SELECT
句:country
列とCOUNT(*)
関数を指定しています。GROUP BY
句:1
を指定しているので、SELECT
文の最初の列であるcountry
列をグループ化キーとしています。COUNT(*)
関数: グループ内のレコード数をカウントします。
結果:
| country | total_population |
|---|---|
| China | 1,444,216,107 |
| India | 1,380,004,385 |
| United States | 332,403,650 |
| ... | ... |
GROUP BY
句は、複数の列をグループ化キーとして指定することもできます。GROUP BY
句と併せて、HAVING
句を用いることで、グループ化結果に対して条件を指定することができます。
関連キーワード:
- SQL
- GROUP BY
- COUNT
- SUM
- AVG
- HAVING
改善点:
- 日本語の解説をより分かりやすくするために、例を追加しました。
SELECT country,
COUNT(*) AS total_population,
AVG(age) AS average_age
FROM world_population
GROUP BY 1;
| country | total_population | average_age |
|---|---|---|
| China | 1,444,216,107 | 37.2 |
| India | 1,380,004,385 | 27.5 |
| United States | 332,403,650 | 38.1 |
| ... | ... | ... |
説明:
AVG(age)
関数: グループ内の年齢の平均値を算出します。
- 特定の列の値に基づいてグループ化し、各グループの合計金額を算出する:
SELECT product_category,
SUM(amount) AS total_amount
FROM orders
GROUP BY product_category;
- 複数の列に基づいてグループ化し、各グループの平均年齢と性別の人数を算出する:
SELECT country,
gender,
AVG(age) AS average_age,
COUNT(*) AS total_population
FROM world_population
GROUP BY country, gender;
GROUP BY 1
の代わりに使用できる方法
列名を直接指定する:
SELECT country,
COUNT(*) AS total_population,
AVG(age) AS average_age
FROM world_population
GROUP BY country;
GROUP BY 句に列番号を指定する:
SELECT country,
COUNT(*) AS total_population,
AVG(age) AS average_age
FROM world_population
GROUP BY 2;
SELECT country,
COUNT(*) AS total_population,
AVG(age) AS average_age
FROM world_population
GROUP BY country AS country_code;
サブクエリを使用する:
SELECT country,
total_population,
average_age
FROM (
SELECT country,
COUNT(*) AS total_population,
AVG(age) AS average_age
FROM world_population
GROUP BY country
) AS t;
上記の方法はいずれも、GROUP BY 1
と同じ結果を得ることができます。どの方法を使用するかは、コードの可読性や個人的な好みによって異なります。
GROUP BY
句と併せて、ORDER BY
句を使用することで、グループ化結果をソートすることができます。
mysql sql group-by