SELECT文・射影と選択とは?セレクトぶん・しゃえいとせんたく
SELECT文・射影と選択とは、関係データベースの問合せの基本操作と、その関係代数上の呼び名。列を絞り込む操作を射影、条件に合う行を絞り込む操作を選択と呼び、SELECT文は射影(SELECT句)と選択(WHERE句)に結合・集約を組み合わせて必要なデータだけを取り出す。集約を伴う場合、行を絞るWHEREはグループ化の前、グループを絞るHAVINGはグループ化の後に評価される、という順序が出題の中心になる。
最終更新:2026-10-06
この語が出る過去問を解く →背景
初期のデータ操作は、どのファイルをどの順に読み、どう突き合わせるかという手順そのものをプログラムに書いていた。そのため格納方法を変えるだけで全プログラムを直すことになり、データの独立性が保てなかった。関係代数は「何が欲しいか」を集合の演算として表す枠組みで、SQLはその上に載る非手続き型の言語である。だからこそ、索引を使うかどうかといった取り出し方はDBMSの最適化に委ねられる。
具体例
「SELECT 商品名, 価格 FROM 商品 WHERE 在庫数 > 0」は、商品名と価格の2列への射影と、在庫数が正である行の選択を組み合わせている。PostgreSQLやMySQLでEXPLAINを付けて実行すると、同じ結果でも索引を使うか全表走査になるかが分かり、WHERE句の書き方が実行計画を左右することを確認できる。
試験での引っ掛け
射影が列の絞り込み、選択が行の絞り込みで、日常語の「選択」の語感と逆に覚えやすい。WHEREとHAVINGは評価される順序が違い、集約関数はWHERE句には書けない。またSELECT文は既定で重複行を除かないため、関係代数どおりの集合として扱いたい場合はDISTINCTが必要になる点も狙われる。
関連用語
出た過去問
問題文で直接問われたものと、解説の中で触れられたものが含まれます。
出典:平成28年度 秋期 応用情報技術者試験 午前 問29(IPA)
"サッカーチーム"表と"審判"表から、条件を満たす対戦を導出するSQL文のaに入れる字句はどれか。 〔条件〕 ・出場チーム1のチーム名は出場チーム2のチーム名よ…
正解:C.所属チーム名 NOT IN (A.チーム名, B.チーム名)
要点:複数値との不一致はNOT INで表す
審判は自分の所属チームが出場する対戦を担当できないので、審判の所属チーム名が出場チーム1と出場チーム2のどちらとも一致しないという条件が必要です。これは所属チーム名が2つのチーム名の集合に含まれないこと、すなわち NOT IN で簡潔に表せます。OR で結ぶと片方さえ違えば真になってしまい、自分のチームの対戦を担当する行が残ってしまいます。
出典:平成29年度 秋期 応用情報技術者試験 午前 問28(IPA)
関係R(ID, A, B, C)のA, Cへの射影の結果とSQL文で求めた結果が同じになるように、aに入れるべき字句はどれか。ここで、関係Rを表Tで実現し、表T…
正解:DISTINCT
要点:関係代数の射影は重複を除くのでSQLではDISTINCTが要る
関係代数の射影は集合演算なので、結果に重複する行は現れない。一方SQLのSELECTは既定で重複行をそのまま返すため、A列とC列だけを取り出すと同じ値の組が複数出てしまう。重複を取り除くDISTINCTを指定することで、射影の結果と一致させられる。
出典:平成31年度 春期 応用情報技術者試験 午前 問28(IPA)
過去3年分の記録を保存している“試験結果”表から、2018年度の平均点数が600点以上となったクラスのクラス名と平均点数の一覧を取得するSQL文はどれか。ここで…
正解:SELECT クラス名, AVG(点数) FROM 試験結果 WHERE 受験年月日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY クラス名 HAVING AVG(点数) >= 600
要点:行の絞り込みはWHERE、集約結果の絞り込みはHAVINGに書く
2018年度に限定するには受験年月日を2018年4月1日から2019年3月31日の範囲でWHERE句により行単位で絞り込む。そのうえでクラス名でGROUP BYし、グループ全体の集計値に対する条件はHAVING句に書く必要があるため、HAVING AVG(点数) >= 600 とする。
出典:令和2年度 10月試験 応用情報技術者試験 午前 問26(IPA)解説で登場
表に対するSQLのGRANT文の説明として、適切なものはどれか。
正解:表の利用者に対し、表への問合せ、更新、追加、削除などの操作権限を付与する。
要点:GRANTは表への操作権限を利用者に付与するDCL
GRANTは、表やビューなどのオブジェクトに対する操作権限(SELECT、UPDATE、INSERT、DELETEなど)を利用者やロールに与えるSQLのデータ制御文である。取り消すときはREVOKEを使う。接続の認証や暗号化とは別の機能である。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。