情報処理試験を勉強していると、「SELECT文ってどういう順番で書けばいいの?」「WHEREとHAVINGの違いがわからない…」とつまずきがちです。SELECT文はSQLの中で最も使用頻度が高く、試験でも繰り返し問われる最重要テーマです。
対象試験と出題頻度
SELECT文は、ITパスポート・基本情報技術者・応用情報技術者のすべてで出題されるテーマです。
関係データベースの操作問題の中心であり、FE・APでは「SQL文の実行結果を選べ」「空欄に入る句を選べ」といった形式で毎回のように出題されます。
詳細をクリックして確認
ITパスポート
基本情報技術者
応用情報技術者
★★★★★
ランクS(超重要)絶対に覚える必要あり
用語の定義
SELECT文とは、一言で言うと
「関係データベースの表(テーブル)から、条件に合うデータを検索・抽出するためのSQL命令」
のことです。
イメージとしては、「図書館の蔵書検索機」です。
「著者が○○で、出版年が2020年以降の本を、タイトル順に並べて見せて」と条件を打ち込むと、該当する本だけが一覧で表示されます。
SELECT文も同じで、「どの表から」「どの列を」「どんな条件で」取り出すかを指定し、必要なデータだけを返します。
📊 SELECT文の基本情報
| 項目 | 内容 |
|---|---|
| 分類 | DML(データ操作言語) |
| 役割 | 表からデータを検索・抽出する |
| 基本構文 | SELECT 列名 FROM 表名 WHERE 条件 |
| 関連SQL命令 | INSERT(挿入)、UPDATE(更新)、DELETE(削除) |
解説
SQLはDDL(データ定義言語)、DML(データ操作言語)、DCL(データ制御言語)の3つに分類されます。SELECT文はDMLに属し、データを「読み取る」操作を担当します。
INSERT・UPDATE・DELETEがデータを「書き換える」操作であるのに対し、SELECT文は表の中身を変更しません。
SELECT文の構文と句の記述順序
SELECT文は複数の句(キーワード)を組み合わせて書きます。
記述する順序はSQLの文法で決まっており、順序を間違えると構文エラーになります。
📝 SELECT文の記述順序(構文テンプレート)
SELECT 列名1, 列名2, ... FROM 表名 WHERE 抽出条件 GROUP BY グループ化する列 HAVING グループに対する条件 ORDER BY ソートする列 [ASC | DESC]
各句の役割
各句がどの処理を担当するかを一覧で整理します。ここだけは確実に押さえてください。
| 句 | 役割 | 省略 |
|---|---|---|
| SELECT | 取得する列を指定する。* で全列を指定できる |
不可 |
| FROM | データを取り出すテーブルを指定する | 不可 |
| WHERE | 行単位の抽出条件を指定する | 可 |
| GROUP BY | 指定した列の値が同じ行をグループにまとめる | 可 |
| HAVING | GROUP BYでまとめたグループに対して条件を指定する | 可 |
| ORDER BY | 結果を昇順(ASC)または降順(DESC)に並べ替える | 可 |
WHEREは「グループ化する前の行」に対する条件、HAVINGは「グループ化した後の集計結果」に対する条件です。この違いは頻出なので、混同しないよう注意してください。
図解:SELECT文の処理フロー
SELECT文を構成する句は、記述順序と実行順序が異なります。
DBMSの内部では以下の順番で処理されます。
SELECT文の実行順序
※ SELECT句は「最初に書く」が「5番目に実行される」点に注意
具体例:社員テーブルからの抽出
以下の「社員」テーブルを使って、実際のSQL文とその結果を確認します。
社員テーブル
| 社員番号 | 氏名 | 部署 | 給与 |
|---|---|---|---|
| 001 | 田中 | 営業 | 300 |
| 002 | 鈴木 | 開発 | 400 |
| 003 | 佐藤 | 営業 | 350 |
| 004 | 高橋 | 開発 | 450 |
例1:部署が「営業」の社員の氏名を取得
SELECT 氏名 FROM 社員 WHERE 部署 = '営業'
→ 結果:田中、佐藤
例2:部署ごとの平均給与が350以上の部署を取得
SELECT 部署, AVG(給与) AS 平均給与 FROM 社員 GROUP BY 部署 HAVING AVG(給与) >= 350
→ 結果:開発(平均425)。営業は平均325のため除外される
集計関数とDISTINCT
SELECT句ではデータの集計に使う関数を指定できます。試験で問われる主な集計関数は5つです。
| 関数 | 意味 |
|---|---|
| COUNT | 行数を数える |
| SUM | 合計値を求める |
| AVG | 平均値を求める |
| MAX | 最大値を求める |
| MIN | 最小値を求める |
また、DISTINCTをSELECT句に付けると、結果から重複行を除去できます。
「SELECT DISTINCT 列名 FROM 表名」のように記述します。
複数テーブルの結合
FROM句に複数の表を指定し、WHERE句やJOIN句で主キーと外部キーの対応を示すことで、表と表を結合してデータを取得できます。
結合条件を書かずに2つの表を指定すると「直積(すべての行の組み合わせ)」が返される点は注意が必要です。
では、この構文が試験でどのように出題されるか見ていきましょう。
💡 SELECT文の核心を3行で
・テーブルからデータを抽出するDMLの命令で、記述順はSELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
・WHEREは「行単位の条件」、HAVINGは「グループ集計後の条件」
・集計関数(COUNT, SUM, AVG, MAX, MIN)とDISTINCTはSELECT句で使用する
試験ではこう出る!
SELECT文は、IP・FE・APすべての午前問題で毎回のように出題される最頻出テーマです。出題パターンは3つに分かれます。
📊 過去問での出題実績(一部抜粋)
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| IP H31春 問95 |
関係データベースを操作するための言語を選ぶ問題 | SQL=データベース操作言語であることの基本知識 |
| FE R2免除 問28 |
2つの表を結合するSELECT文の実行結果を選ぶ問題 | WHERE句による結合条件の読み取りと結果の導出 |
| FE H28秋 問28 |
関係代数の直積に対応するSELECT文を選ぶ問題 | 直積・差集合(EXCEPT)・和集合(UNION)・積集合(INTERSECT)の区別 |
| AP R5秋 問29 |
NOT EXISTSを使った相関副問合せの結果行数を求める問題 | 副問合せの実行ロジックとNOT EXISTSの動作 |
| AP R6秋 問30 |
同一結果を得るためにSQL文の空欄に入る句を選ぶ問題 | INNER JOINとウィンドウ関数(PARTITION BY)の理解 |
📝 IPA試験での出題パターン
パターン1:「SQL文の実行結果を選べ」(FE・AP頻出)
テーブルとSQL文が提示され、4つの結果表から正しいものを選ぶ形式。WHERE句の結合条件を1行ずつ当てはめて結果を導出する作業が必要。ミスしやすいのは「結合条件に合致しない行が結果に含まれない」点の見落とし。
パターン2:「空欄に入る句・式を選べ」(FE・AP頻出)
SQL文の一部が空欄になっており、正しい句や条件式を選ぶ形式。GROUP BY句にない列をSELECT句に書けないルールや、HAVINGに集計関数を使う構文がよく問われる。
パターン3:「SQLとは何かを選べ」(IP頻出)
SQL・FAQ・SSL・UMLなど類似略語の中から「データベースを操作する言語」としてSQLを選ばせる形式。SELECT文の構文自体はIPでは問われないため、「SQL=データベースの操作言語」とだけ覚えておけばOK。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 「社員」表に対して次のSQL文を実行したとき、結果として得られるものはどれか。
FROM 社員
WHERE 給与 >= 300
GROUP BY 部署
HAVING COUNT(*) >= 2
- A. WHERE句で給与300以上の行を抽出し、部署ごとにグループ化した後、人数が2以上のグループだけを返す。
- B. 社員表のすべての行を部署ごとにグループ化し、各グループの給与の合計が300以上かつ人数が2以上のグループを返す。
- C. 社員表から給与の昇順で並べ替えた結果のうち、先頭2件を部署ごとに返す。
正解と解説を見る
正解:A
解説:
このSQL文は、まずWHERE句で「給与 >= 300」の行だけに絞り、次にGROUP BY句で部署列を基準にグループ化し、最後にHAVING句で「COUNT(*) >= 2」(グループ内の行数が2以上)のグループだけを返します。SELECT句は「部署」と「COUNT(*)(人数)」を出力します。
選択肢Bは、WHERE句とHAVINGの役割を混同しています。WHERE句は行単位の条件であり、「給与の合計が300以上」という集計条件ではありません。選択肢Cは、ORDER BYやLIMITの動作を述べていますが、このSQL文にはどちらも含まれていません。
よくある質問(FAQ)
Q. SELECT文とSELECT句は何が違いますか?
SELECT文は「SELECT ~ FROM ~ WHERE ~ …」というSQL命令全体を指します。一方、SELECT句はその中の「SELECT 列名1, 列名2」という部分だけを指す用語です。試験の問題文で「SELECT句」と書かれていたら、文全体ではなくSELECTキーワード直後の列指定部分のことだと判断してください。
Q. SELECT文は関係代数のどの演算に対応しますか?
SELECT句で列を選ぶ操作は関係代数の「射影」、WHERE句で行を絞る操作は「選択」に対応します。紛らわしいですが、「SELECTという名前=選択」ではなく「SELECT句=射影、WHERE句=選択」と覚えてください。FE H25春 問28やH28秋 問28で実際にこの対応が出題されています。
Q. 副問合せ(サブクエリ)とは何ですか?
SELECT文の中にさらにSELECT文を入れ子にしたものです。WHERE句の中で「WHERE 列名 IN (SELECT …)」のように使い、内側のSELECT文の結果を外側の条件に利用します。APではNOT EXISTSを使った「相関副問合せ」が出題されることもあります(AP R5秋 問29など)。FEの範囲ではIN句による副問合せの基本パターンを理解しておけば十分です。
Q. 実務でSELECT文はどのような場面で使われますか?
ほぼすべてのWebアプリケーションやシステムで使われています。ECサイトの商品検索、社内システムの売上集計レポート、顧客管理画面の一覧表示など、「データベースからデータを表示する」処理の裏側にはSELECT文が存在します。エンジニアに限らず、マーケティング担当者やデータアナリストがBIツールを使う際にもSELECT文の知識は役立ちます。