基本情報

SQL問題の解き方基本情報 科目Aの過去問を1行ずつトレース(SELECT・GROUP BY・NULL)

更新 ・書いた人 合格ナビ 編集長(運営者)

この記事でわかること

基本情報技術者試験のSQL問題は科目Aで出題され、科目Bには出ません。IPAのシラバスにある範囲(選択・結合・グループ化・副問合せ・制約)を、令和7・8年度の公開問題と自作の表で1行ずつトレースし、NULLやBETWEENの落とし穴まで実行結果つきで解説します。

目次
  1. SQL問題は科目Aの範囲(科目Bには出ない)
  2. SQLの読み方:書いた順ではなく、処理される順に読む
  3. 公開問題をトレース①:IN・OR・BETWEENの違い(令和7年度 問6)
  4. 公開問題をトレース②:主キーの制約違反(令和8年度 問7)
  5. 自作の表で練習:WHERE・GROUP BY・HAVING・集合関数
  6. 表の結合と副問合せ(内部結合・外部結合・EXISTS)
  7. NULL・LIKE・BETWEENの落とし穴
  8. SQLインジェクション:セキュリティ分野で問われるSQL
  9. SQL問題を解く手順のまとめ
結論:基本情報技術者試験の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 から書きますが、結果を考えるときは次の順に読むと、選択肢の違いが見えます。

順句やること
1FROM(と結合の条件)どの表を使うか。2つの表なら、結合した表を頭の中で作る
2WHERE行を1行ずつ条件に当てはめ、残す行を決める(グループ化の前)
3GROUP BY残った行を、指定した列の値が同じものどうしでまとめる
4HAVINGまとめたグループに条件を当てはめる(グループ化の後)
5SELECT表示する列・集合関数(COUNT・SUM・AVG・MAX・MIN)を計算する
6ORDER BY並べ替える(指定がなければ昇順、DESCで降順)

関係代数の言葉でいえば、WHEREで行を選ぶのが「選択」、SELECTで列を選ぶのが「射影」、2つの表をつなぐのが「結合」です。

公開問題をトレース①:IN・OR・BETWEENの違い(令和7年度 問6)

“商品”表に対するSQL 文と同じ結果が得られるSELECT 文はどれか。
商品ID商品名称仕入先ID単価
S001冷蔵庫M001155,000
S002食器洗い機M00285,000
S003電子レンジM00378,000
S004炊飯器M00332,000
S005コーヒーメーカーM00415,000
S006ホットプレートM00412,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・S006INと同じ。正解はウ
エ(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テレビS00175,0000
A222デジタルカメラS00250,00050
A333DVDプレーヤNULLNULLNULL
A444洗濯機S00445,00020
ア 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青木D1300
E02井上D1280
E03上田D2350
E04江藤D2410
E05小野D2NULL
E06加藤NULL260
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(給与) >= 300D2: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 給与 = NULL0行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問題を解く手順のまとめ

  • ① 問題の表を余白に書き写し、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問です。これは当サイトの掲載分の数で、本試験の出題数ではありません。

この資格の問題を解く基本情報技術者(FE) 科目A過去問問題集(全520問)
解いてみる

法令や試験の数字は、改正や年度で変わります。この記事の最終確認日は2026年10月2日です。申込みや合格基準は、必ず試験団体の公式情報で確かめてください。

合格ナビ 編集長・運営者

基本情報技術者(FE)の出題範囲・法令・公式の統計を参照して書いています。プロフィール・編集方針