基本情報技術者試験のSQL問題は科目Aで出題され、科目Bには出ません。IPAのシラバスにある範囲(選択・結合・グループ化・副問合せ・制約)を、令和7・8年度の公開問題と自作の表で1行ずつトレースし、NULLやBETWEENの落とし穴まで実行結果つきで解説します。
目次
結論:基本情報技術者試験のSQL問題は科目A(四肢択一・60問)で出題され、科目B(アルゴリズムとプログラミング16問・情報セキュリティ4問)にはデータベースの分野がありません。IPAのシラバスが挙げる範囲は、行と列の選択・表の結合・BETWEENやINなどの述語・集合関数・グループ化・並べ替え・副問合せ・相関副問合せ・制約とINSERT/UPDATE/DELETEです。解き方は1つで、表を書き出し、SQLを FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY の順に1行ずつ当てはめることです。
当サイトに掲載している基本情報の問題520問(平成21年度〜令和7年度。2026-10-02 集計)のうち、SQL文を読む・選ぶ問題は8問、SQLインジェクションの問題は6問です。この記事のSQLは、IPAの公開問題と自作の表を使い、すべてSQLite(Pythonのsqlite3)で実行して結果を確かめています。
SQL問題は科目Aの範囲(科目Bには出ない)
| 項目 | 科目A | 科目B |
|---|---|---|
| 試験時間・出題数 | 90分・60問(四肢択一) | 100分・20問 |
| データベース(SQL)の分野 | あり(データベース>データ操作「データベースを操作するための言語(SQLほか),関係代数など」) | なし(分野はアルゴリズムとプログラミング16問・情報セキュリティ4問) |
| SQLインジェクション | 情報セキュリティの出題範囲に例示あり | 科目Bの情報セキュリティ分野(4問)の出題範囲の詳細は試験要綱を参照 |
出典:IPA 試験要綱 Ver.5.6(2026年10月の試験から適用)。
基本情報技術者試験の試験時間・出題数:科目A 90分・60問、科目B 100分・20問(アルゴリズムとプログラミング分野16問、情報セキュリティ分野4問)。最終確認日:2026-10-02。出典:IPA 試験要綱 Ver.5.6。
IPA シラバス 基本情報技術者試験 Ver.9.2 の「データ操作」は、SELECT文について「条件を指定した特定行や列の選択,表の結合,BETWEENやINなどの述語指定,集合関数,グループ化,並べ替え,副問合せ,相関副問合せなどの基本的な操作を理解する」としています。このほか、表を定義するSQL文と制約(一意性制約・参照制約・検査制約・非NULL制約)、INSERT・UPDATE・DELETE・GRANTの基本も範囲です。SQLそのものの意味は用語集「SQL」にまとめています。
SQLの読み方:書いた順ではなく、処理される順に読む
SELECT文は SELECT から書きますが、結果を考えるときは次の順に読むと、選択肢の違いが見えます。
| 順 | 句 | やること |
|---|---|---|
| 1 | FROM(と結合の条件) | どの表を使うか。2つの表なら、結合した表を頭の中で作る |
| 2 | WHERE | 行を1行ずつ条件に当てはめ、残す行を決める(グループ化の前) |
| 3 | GROUP BY | 残った行を、指定した列の値が同じものどうしでまとめる |
| 4 | HAVING | まとめたグループに条件を当てはめる(グループ化の後) |
| 5 | SELECT | 表示する列・集合関数(COUNT・SUM・AVG・MAX・MIN)を計算する |
| 6 | ORDER BY | 並べ替える(指定がなければ昇順、DESCで降順) |
関係代数の言葉でいえば、WHEREで行を選ぶのが「選択」、SELECTで列を選ぶのが「射影」、2つの表をつなぐのが「結合」です。
公開問題をトレース①:IN・OR・BETWEENの違い(令和7年度 問6)
“商品”表に対するSQL 文と同じ結果が得られるSELECT 文はどれか。
| 商品ID | 商品名称 | 仕入先ID | 単価 |
|---|---|---|---|
| S001 | 冷蔵庫 | M001 | 155,000 |
| S002 | 食器洗い機 | M002 | 85,000 |
| S003 | 電子レンジ | M003 | 78,000 |
| S004 | 炊飯器 | M003 | 32,000 |
| S005 | コーヒーメーカー | M004 | 15,000 |
| S006 | ホットプレート | M004 | 12,000 |
〔SQL 文〕 SELECT * FROM 商品 WHERE 仕入先ID IN ('M002', 'M004')
ア SELECT * FROM 商品 WHERE 仕入先ID = 'M002' AND 仕入先ID = 'M004'
イ SELECT * FROM 商品 WHERE 仕入先ID = 'M002'
INTERSECT
SELECT * FROM 商品 WHERE 仕入先ID = 'M004'
ウ SELECT * FROM 商品 WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004'
エ SELECT * FROM 商品 WHERE 仕入先ID BETWEEN 'M002' AND 'M004'
出典:令和7年度 基本情報技術者試験 科目A 公開問題 問6(独立行政法人情報処理推進機構)。問題PDF・解答例PDF
トレース(SQLiteで実行した結果):
| SQL | 残る行 | 理由 |
|---|---|---|
| 問題のSQL(IN) | S002・S005・S006 | 仕入先IDがM002かM004のどちらかに一致する行 |
| ア(AND) | 0行 | 1つの行の仕入先IDが同時にM002とM004になることはない |
| イ(INTERSECT) | 0行 | M002の行の集合とM004の行の集合に共通の行はない |
| ウ(OR) | S002・S005・S006 | INと同じ。正解はウ |
| エ(BETWEEN) | S002〜S006の5行 | BETWEENは両端を含む範囲なので、間のM003(S003・S004)も入る |
検算:「IN (a, b)」は「= a OR = b」の書き換えなので、ウだけが同じ行を返します。逆に、エが正解になるには仕入先IDがM003の行が無いことが必要ですが、表にはS003とS004があるので不一致です。
公開問題をトレース②:主キーの制約違反(令和8年度 問7)
次のSQL 文によって定義され,値が格納されている“商品”表に対して,制約違反で実行エラーとなるSQL 文はどれか。
〔SQL 文〕 CREATE TABLE 商品 (商品コード CHAR(4) PRIMARY KEY, 商品名 VARCHAR(21), 仕入先コード CHAR(4), 仕入単価 INT, 在庫数 INT)
| 商品コード | 商品名 | 仕入先コード | 仕入単価 | 在庫数 |
|---|---|---|---|---|
| A111 | テレビ | S001 | 75,000 | 0 |
| A222 | デジタルカメラ | S002 | 50,000 | 50 |
| A333 | DVDプレーヤ | NULL | NULL | NULL |
| A444 | 洗濯機 | S004 | 45,000 | 20 |
ア DELETE FROM 商品 WHERE 仕入先コード IS NULL
イ INSERT INTO 商品 VALUES ('A555', '空気清浄機', 'S005', 60000, 50)
ウ UPDATE 商品 SET 商品コード = 'A666' WHERE 商品コード = 'A444'
エ UPDATE 商品 SET 商品コード = 'A777' WHERE 在庫数 >= 20
出典:令和8年度 基本情報技術者試験 科目A 公開問題 問7(独立行政法人情報処理推進機構)。問題PDF・解答例PDF
トレース:
- ア:仕入先コードがNULLのA333を1行削除するだけ。制約は商品コードの主キーだけなので、エラーにならない
- イ:A555は既存の商品コードと重ならないので、追加できる
- ウ:A444を1行だけA666に変える。A666は他に無いので、主キーの一意性を保つ
- エ:在庫数が20以上の行はA222(50)とA444(20)の2行。2行とも商品コードがA777になり、主キーの値が重複する → 制約違反。正解はエ
検算:SQLiteで同じ表を作って4つを別々に実行すると、ア・イ・ウは成功し、エだけが「UNIQUE constraint failed」で止まりました。A333の在庫数はNULLなので、「在庫数 >= 20」の判定は真にならず、更新の対象に入りません(3行が対象になるという読み違いに注意)。なお、令和8年度の公開問題は当サイトの問題ページにまだ掲載していないため、IPAのPDFで確認してください。
自作の表で練習:WHERE・GROUP BY・HAVING・集合関数
ここからは当記事で作った表(試験問題ではありません)で、科目Aで問われる操作を一通りトレースします。
“部署”表
| 部署コード | 部署名 |
|---|---|
| D1 | 営業 |
| D2 | 開発 |
| D3 | 総務 |
“社員”表(小野の給与と加藤の部署コードはNULL)
| 社員番号 | 氏名 | 部署コード | 給与 |
|---|---|---|---|
| E01 | 青木 | D1 | 300 |
| E02 | 井上 | D1 | 280 |
| E03 | 上田 | D2 | 350 |
| E04 | 江藤 | D2 | 410 |
| E05 | 小野 | D2 | NULL |
| E06 | 加藤 | NULL | 260 |
| SQL | 実行結果 |
|---|---|
| SELECT 氏名 FROM 社員 WHERE 給与 >= 300 | 青木・上田・江藤(NULLの小野は選ばれない) |
| SELECT 部署コード, COUNT(*), COUNT(給与), AVG(給与) FROM 社員 GROUP BY 部署コード | D1:2・2・290/D2:3・2・380/NULL:1・1・260 |
| SELECT 部署コード, AVG(給与) FROM 社員 GROUP BY 部署コード HAVING AVG(給与) >= 300 | D2:380 |
| SELECT 部署コード, COUNT(*) FROM 社員 WHERE 給与 >= 300 GROUP BY 部署コード | D1:1/D2:2 |
| SELECT 氏名, 給与 FROM 社員 WHERE 給与 IS NOT NULL ORDER BY 給与 DESC | 江藤410・上田350・青木300・井上280・加藤260 |
読み方のポイント:
- ① COUNT(*)は行の数、COUNT(給与)はNULLでない値の数。D2は3行あるが、給与がある行は2つ
- ② AVGはNULLを除いて計算する。D2の平均は (350 + 410) ÷ 2 = 380
- ③ WHEREはグループ化の前、HAVINGはグループ化の後。4行目は先に給与300未満とNULLの行を落としてから数えるので、D1は1人になる
- ④ 部署コードがNULLの加藤も、GROUP BYでは1つのグループ(NULLのグループ)になる
検算:D2の平均を「SUM(給与) ÷ COUNT(給与)」で計算し直すと 760 ÷ 2 = 380 でAVGと一致します。もし行数のCOUNT(*)=3で割ると 760 ÷ 3 ≒ 253.3 となり、AVGの値とずれます。これが「集合関数はNULLを除く」ことの確かめになります。
表の結合と副問合せ(内部結合・外部結合・EXISTS)
| SQL | 実行結果 | ポイント |
|---|---|---|
| SELECT 社員.氏名, 部署.部署名 FROM 社員, 部署 WHERE 社員.部署コード = 部署.部署コード | 青木・井上(営業)、上田・江藤・小野(開発)の5行 | 内部結合。部署コードがNULLの加藤と、社員のいない総務は出てこない |
| SELECT 部署.部署名, COUNT(社員.社員番号) FROM 部署 LEFT OUTER JOIN 社員 ON 部署.部署コード = 社員.部署コード GROUP BY 部署.部署名 | 営業2・開発3・総務0 | 左外部結合。左の表(部署)の行は相手がいなくても残る |
| SELECT 氏名, 給与 FROM 社員 WHERE 給与 > (SELECT AVG(給与) FROM 社員) | 上田350・江藤410 | 副問合せの平均は 1600 ÷ 5 = 320(NULLを除く5人) |
| SELECT 部署名 FROM 部署 WHERE EXISTS (SELECT * FROM 社員 WHERE 社員.部署コード = 部署.部署コード AND 社員.給与 >= 400) | 開発 | 相関副問合せ。部署の1行ごとに、条件に合う社員が1人でもいるかを調べる |
検算:副問合せの平均は、全6行で割ると 1600 ÷ 6 ≒ 266.7 になり、その場合は青木(300)と井上(280)も選ばれてしまいます。実行結果が上田・江藤の2人だったことから、AVGがNULLの小野を除いた5人で割っていることが確かめられます。
結合だけを問う問題は当サイトの掲載分に少ないため、テクノロジ系の問題一覧からデータベースの問題を選んで、上の表と同じように結合した表を書き出して解いてください。
NULL・LIKE・BETWEENの落とし穴
| 書き方 | 結果(自作の表) | 理由 |
|---|---|---|
| WHERE 給与 = NULL | 0行 | NULLとの比較は真にならない |
| WHERE 給与 IS NULL | 小野 | NULLを調べるときは IS NULL |
| WHERE 氏名 LIKE '%藤' | 江藤・加藤 | % は0文字以上の任意の文字列。「藤で終わる」 |
| WHERE 仕入先ID BETWEEN 'M002' AND 'M004' | M002〜M004(両端を含む) | 令和7年度 問6のエ |
LIKEの「%」と「_」(任意の1文字)は、どちらの位置に置くかで意味が変わります。「%UNIX%」なら「UNIXを含む」、「UNIX%」なら「UNIXで始まる」です。
SQLインジェクション:セキュリティ分野で問われるSQL
SQLの知識は、情報セキュリティの問題でも使います。試験要綱は情報セキュリティの出題範囲に「サイバー攻撃(SQLインジェクション,…)」を挙げています。対策として問われるのは、入力された文字がSQLの中で特別な意味を持たないようにすることと、プレースホルダ(値を後から当てはめる仕組み)でSQL文を組み立てることです。
- SQLインジェクションの対策として有効なもの(令和6年度 科目A 問10)
- SQLインジェクション攻撃による被害を防ぐ方法(サンプル問題 問36)
- SQLインジェクション攻撃の説明(平成28年度春期 午前 問37)
- SQLインジェクション攻撃による被害を防ぐ方法(平成30年度春期 午前 問41)
SQL問題を解く手順のまとめ
- ① 問題の表を余白に書き写し、NULLのセルに印を付ける
- ② FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY の順に、残る行を1行ずつ消していく
- ③ 集合関数があれば、NULLを除いた行で計算する
- ④ 選択肢どうしの違い(AND と OR、IN と BETWEEN、WHERE と HAVING、内部結合と外部結合)だけを見比べる
- ⑤ 制約の問題は、更新後の表で主キーが重複しないか、参照先が存在するかを確かめる
用語の確認には主キー・外部キー・正規化・インデックスの用語集が使えます。
関連記事:科目Aの対策/科目Bの対策/基本情報技術者試験とは
よくある質問
Q基本情報の科目BでSQLは出ますか?
IPAの試験要綱(Ver.5.6)では、科目Bの20問の分野別の出題数は「アルゴリズムとプログラミング分野16問,情報セキュリティ分野4問」で、データベースの分野はありません。SQLは科目Aの出題範囲(データベース>データ操作)に入っています。SQL文そのものを読む問題は、科目Aの対策で準備します。
QSQLは独学で勉強できますか?
できます。基本情報の科目Aで問われるのはSELECT文の読み方と基本的な制約の意味が中心なので、紙の上で表を書いて1行ずつ条件を当てはめる練習で十分に対策できます。手元で確かめたい場合は、無料のSQLite(Pythonに標準で付いているsqlite3モジュールなど)で表を作って実行すると、答えを自分で検算できます。
QSQLで間違えやすいのはどこですか?
当記事の例で確かめた範囲では、①NULLとの比較(「= NULL」では1行も選ばれず、「IS NULL」を使う)②集合関数がNULLを除くこと(AVGの分母はNULLを除いた行数)③BETWEENが両端を含む範囲であること④WHEREとHAVINGの違い(グループ化の前か後か)の4つです。
QSQL問題は何問くらい出ますか?
IPAは科目Aの分野別の出題数を公表していないため、本試験で何問出るかは言えません。当サイトに掲載している基本情報の問題520問(2026-10-02 集計)のうち、SQL文を読む・選ぶ問題は8問、SQLインジェクションの問題は6問です。これは当サイトの掲載分の数で、本試験の出題数ではありません。
法令や試験の数字は、改正や年度で変わります。この記事の最終確認日は2026年10月2日です。申込みや合格基準は、必ず試験団体の公式情報で確かめてください。

