SELECT文とは(全体像)
SELECT文とは、データベースから、条件に合うデータを取り出すSQL命令のことだ。基本の形は、こうなる。
SELECT 取り出す列 FROM 表 WHERE 条件 GROUP BY 集計のまとまり HAVING 集計後の条件 ORDER BY 並べ替え
ここで活躍するのが、集約関数。これは、データをまとめて計算する関数だ。
- COUNT … 件数を数える
- SUM … 合計する
- AVG … 平均を出す
- MAX/MIN … 最大/最小を出す
ここで一番のポイント。WHEREとHAVINGは、役割が違う。WHEREは「(集計する前の)行を絞り込む」、HAVINGは「集計した後の結果を絞り込む」。「WHEREとHAVINGは同じ」と思い込むと誤りになる。
詳しく:WHEREとHAVINGの違い
ここが心臓部。ポイントを表で押さえよう。
SELECT文のポイント
| 項目 | やさしい意味 |
|---|---|
| SELECT | データを取り出すSQL命令 |
| 集約関数 | まとめて計算(COUNT・SUM・AVG・MAX・MIN) |
| WHERE | (集計する前の)行を絞り込む |
| HAVING | 集計した後の結果を絞り込む |
WHEREとHAVINGは、似ているが、絞り込むタイミングが違う。WHEREは、集計する前に、対象の行を絞り込む。HAVINGは、集計した後の結果に対して、絞り込む。
たとえば、「部署ごとの平均給与(集計)を出して、その平均が30万円以上の部署だけ表示」したいとき、「平均が30万円以上」の条件は、集計後なのでHAVINGを使う。ここで一番のポイント。集計後の絞り込みはHAVINGだ。「集計後の条件もWHEREで書く」と思い込むと誤りになる。
わかりやすく言い換えると
身近なたとえで整理しよう。
SELECT文は、「データベースへの、データ取り出しの依頼」のイメージ。
集約関数は、「件数を数える・合計する・平均を出すなど、まとめて計算する関数」こと。要するに、データを集計する。
WHEREとHAVINGの違いは、「WHEREは集計する前に行を絞り込む、HAVINGは集計した後の結果を絞り込む」こと。つまり、絞り込むタイミングが違う。
試験のツボ
🔴 一番出る:集約関数
①COUNT(件数)・SUM(合計)・AVG(平均)・MAX(最大)・MIN(最小)
②データをまとめて計算する関数
🔴 次に出る:WHEREとHAVINGの違い
①WHERE=(集計する前の)行を絞り込む
②HAVING=集計した後の結果を絞り込む
🟡 押さえると安定:SELECT文の構文
①SELECT 列 FROM 表 WHERE 条件 …の形
②GROUP BYで集計のまとまりを指定する
よくある間違い
①「WHEREとHAVINGは、まったく同じものだ」→ ✗ WHEREは集計前に行を絞り込む、HAVINGは集計後の結果を絞り込む。役割が違う。
②「集計した後の条件も、WHEREで書く」→ ✗ 集計後の絞り込みはHAVINGを使う。WHEREは集計前の行を絞り込む。
③「集約関数は、データを1件ずつ別々に表示するための関数だ」→ ✗ 集約関数は、件数・合計・平均など、データをまとめて計算する関数。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(SELECT文の正体)
SELECT文に関する次の記述のうち、最も適切なものはどれか。
- 社員の出退勤を記録して、毎月の給与を計算するためのしくみだ
- データベースから、必要なデータを取り出すSQL命令のことだ
- 取引先へ毎月の請求書を郵送する、決まった事務作業のことを指す
- 完成したシステムを宣伝して、より多く売るための広告活動である
解答は 2 です。
SELECT文は、データベースから、データを取り出すSQL命令なのです。データ取り出しの依頼なります。
選択肢1は給与計算、選択肢3は請求書の事務、選択肢4は広告で、どれも違うのです。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 給与計算のしくみではない |
| 2 | ✓ | データを取り出すSQL命令で正しい |
| 3 | ✗ | 請求書の事務の話 |
| 4 | ✗ | 広告活動ではない |
オリジナル問題2(集約関数)
集約関数に関する次の記述のうち、最も適切なものはどれか。
- 社員の給与を計算するときだけ、使われるものだとされている
- 取引先へ請求書を郵送するときだけ、使われるものだとされる
- データを1件ずつ別々に表示するための関数なのである
- COUNT・SUM・AVGなど、まとめて計算する関数だ
解答は 4 です。
集約関数は、COUNT・SUM・AVGなど、まとめて計算するための関数なのです。件数・合計・平均などを出すなります。
選択肢1の給与、選択肢2の請求書、選択肢3の「1件ずつ表示」は、いずれも違うのです。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 給与計算のときだけではない |
| 2 | ✗ | 請求書のときだけではない |
| 3 | ✗ | まとめて計算する関数(1件ずつではない) |
| 4 | ✓ | COUNT・SUM・AVGでまとめて計算で正しい |
オリジナル問題3(WHEREとHAVING)
WHEREとHAVINGの違いに関する次の記述のうち、最も適切なものはどれか。
- WHEREは集計前に行を絞り、HAVINGは集計後の結果を絞り込む
- 社員の給与を計算するときだけ、違いが出るとされているものである
- 取引先への請求書の枚数しだいで、違いが決まるとされているのだ
- WHEREもHAVINGも、まったく同じものだとされているのである
解答は 1 です。
WHEREは集計前に行を絞り込み、HAVINGは集計後の結果を絞り込むのです。絞り込むタイミングが違うなります。
選択肢2の給与、選択肢3の請求書、選択肢4の「まったく同じ」は、いずれも違うのです。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | WHERE=集計前・HAVING=集計後で正しい |
| 2 | ✗ | 給与計算で違いが出るのではない |
| 3 | ✗ | 請求書の枚数で決まるのではない |
| 4 | ✗ | WHEREとHAVINGは役割が違う |
まとめ
押さえどころ
- 🔴 SELECT文 = データベースからデータを取り出すSQL命令。
- 🔴 集約関数 = まとめて計算する関数(COUNT・SUM・AVG・MAX・MIN)。
- 🟡 WHEREとHAVING = WHEREは集計する前に行を絞り込む、HAVINGは集計した後の結果を絞り込む。役割が違う。
次に学ぶ
- SQL基本(DDL/DML/DCL/TCL) ── SQLの4分類。SELECT文は、データを操作するDMLの代表。
- 関係モデル(主キー・外部キー) ── データを表の形で表すモデル。SELECT文で、その表からデータを取り出す。
執筆: SikakuQuest編集部