---
title: "SQLのGROUP BYとORDER BYの違いは？AVGで平均を求める方法【基本情報技術者試験】"
description: "SQLのGROUP BYとORDER BYの違いを、AVGで平均を求める例を使って整理し、集計単位と表示順を見分ける判断軸を基本情報技術者試験向けに解説します。"
last_modified_at: "2026-07-15"
canonical_url: "https://stemtazoo.github.io/fe/sql-group-by-order-by/"
section: "fe"
---

## まず結論

`GROUP BY` は、**どの単位でデータをまとめるかを指定する句**です。

`ORDER BY` は、**集計や検索の結果をどの順番で表示するかを指定する句**です。

基本情報技術者試験では、次のように切り分けます。

```text
○○ごとに平均や合計を求める
→ GROUP BY

○○の昇順・降順に表示する
→ ORDER BY
```

例えば、クラスごと・教科ごとの平均点を求め、クラス名と教科名の昇順で表示するなら、次のように書きます。

```sql
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名
ORDER BY クラス名, 教科名;
```

## 直感的な説明

`GROUP BY` と `ORDER BY` は、似た位置に書かれますが、役割は異なります。

```text
GROUP BY
→ 同じものをまとめる

ORDER BY
→ 結果を並べ替える
```

例えば、テスト結果が次のように並んでいるとします。

| クラス名 | 教科名 | 学生番号 | 点数 |
|---|---|---|---:|
| 11 | 数学 | 100001 | 80 |
| 11 | 数学 | 100002 | 70 |
| 11 | 英語 | 100001 | 60 |
| 12 | 数学 | 100003 | 90 |

クラス名と教科名でグループ化すると、次の単位で集計されます。

```text
11・数学
11・英語
12・数学
```

その後に `ORDER BY クラス名, 教科名` と書くと、クラス名を優先し、同じクラス内では教科名の順に表示されます。

## 定義・仕組み

### GROUP BY

`GROUP BY` は、指定した列の値が同じ行をまとめます。

例えば、次のSQLです。

```sql
SELECT クラス名, 教科名, AVG(点数) AS 平均点
FROM 中間テスト
GROUP BY クラス名, 教科名;
```

この場合、集計単位は次の組合せです。

```text
クラス名 × 教科名
```

つまり、クラスだけでも、教科だけでもなく、**クラスと教科の組合せごと**に平均点を求めます。

### ORDER BY

`ORDER BY` は、結果を指定した列の順に並べます。

```sql
ORDER BY クラス名, 教科名
```

と書いた場合は、まずクラス名で並べ、同じクラス名の中では教科名で並べます。

昇順は `ASC`、降順は `DESC` です。

```sql
ORDER BY クラス名 ASC, 教科名 ASC
```

`ASC` は省略できます。

### 集約関数

`GROUP BY` は、集約関数と組み合わせて使われることが多いです。

| 関数 | 意味 |
|---|---|
| `AVG()` | 平均 |
| `SUM()` | 合計 |
| `COUNT()` | 件数 |
| `MAX()` | 最大値 |
| `MIN()` | 最小値 |

例えば、教科ごとの平均点なら次のように書きます。

```sql
SELECT 教科名, AVG(点数)
FROM 中間テスト
GROUP BY 教科名;
```

## 科目Aでどう出る？

科目Aでは、SQL文の空欄補充や、正しい句の組合せを選ぶ問題として出やすいです。

まず、問題文の表現を分解します。

```text
平均・合計・件数を求める
→ 集約関数

○○ごとに求める
→ GROUP BY

○○順に表示する
→ ORDER BY
```

例えば、

```text
クラスごと、教科ごとの平均点を求める
```

なら、集計単位は次の2列です。

```sql
GROUP BY クラス名, 教科名
```

さらに、

```text
クラス名、教科名の昇順に表示する
```

なら、次のようにします。

```sql
ORDER BY クラス名, 教科名
```

### SELECT句との対応

集約関数と一緒に通常の列を `SELECT` する場合、その列は基本的に `GROUP BY` に指定します。

```sql
SELECT クラス名, 教科名, AVG(点数)
```

なら、通常列は `クラス名` と `教科名` です。

したがって、

```sql
GROUP BY クラス名, 教科名
```

と対応させます。

### GROUP BYへ余計な列を入れない

例えば、次のように学生番号まで指定すると、集計単位が細かくなりすぎます。

```sql
GROUP BY クラス名, 教科名, 学生番号
```

この場合は、クラス・教科ごとではなく、クラス・教科・学生ごとの集計になります。

```text
集計単位に必要な列だけをGROUP BYへ入れる
```

ことが大切です。

## どんな場面で使う？

`GROUP BY` は、データを分類して集計するときに使います。

例えば、次のような場面です。

```text
部署ごとの売上合計
商品ごとの販売件数
月ごとの平均気温
クラスごとの平均点
```

`ORDER BY` は、その結果を見やすい順に並べるときに使います。

```text
売上の高い順
日付の古い順
クラス名の昇順
平均点の降順
```

つまり、実務では次の流れで一緒に使うことがあります。

```text
データをまとめる
→ GROUP BY

結果を見やすく並べる
→ ORDER BY
```

## よくある誤解・混同

### GROUP BYとORDER BYを同じものだと思う

誤りです。

| 句 | 役割 |
|---|---|
| `GROUP BY` | 集計単位を決める |
| `ORDER BY` | 表示順を決める |

### ORDER BYの列を集計単位と考える

`ORDER BY` は結果を並べるだけです。

```sql
ORDER BY クラス名, 平均点
```

と書いても、集計単位が変わるわけではありません。

### AVGの別名をGROUP BYに使う

次のような書き方は、集計結果をグループ化の基準にしようとしているため不適切です。

```sql
GROUP BY クラス名, 平均点
```

集計前の行をどの単位でまとめるかを指定する必要があります。

### SELECTにある通常列をGROUP BYへ入れ忘れる

例えば、次のSQLでは `教科名` が `SELECT` にあるのに、`GROUP BY` にありません。

```sql
SELECT クラス名, 教科名, AVG(点数)
FROM 中間テスト
GROUP BY クラス名;
```

標準的なSQLでは不適切です。

### 昇順と降順を逆にする

```text
ASC
→ 昇順

DESC
→ 降順
```

`ASC` は省略できますが、`DESC` は明示する必要があります。

## まとめ（試験直前用）

- `GROUP BY` は、集計する単位を決める
- `ORDER BY` は、結果の表示順を決める
- 「○○ごとに平均」は `GROUP BY`
- 「○○の昇順・降順」は `ORDER BY`
- `AVG`、`SUM`、`COUNT` などは集約関数
- `SELECT` にある通常列は、基本的に `GROUP BY` に指定する
- GROUP BYへ余計な列を入れると、集計単位が細かくなりすぎる
- `ASC` は昇順で省略可能、`DESC` は降順
