2026年版・3-5

SQL応用(結合・集約・副問合せ)の一問一答

基本情報技術者試験 科目A「技術要素」から、SQL応用(結合・集約・副問合せ)に関する4択問題を10問。「答えと解説を見る」を開くと、正解とその理由がその場で読めます。会員登録は不要です。

この分野の演習

全10問/解説つき・基本無料

アプリ形式で解く(全600問) 技術要素の要点解説を読む
問題

上から順に解いてみてください。答えは各問の下で確認できます。科目Aの本試験と同じく、4択で出題しています。

問13-5

次の社員表と部署表について、下のSQL文を実行したとき、結果として得られる行の数はいくつか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
部署
部署コード部署名
D1営業
D2総務
D3製造
D4開発
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)SELECT 社員.氏名, 部署.部署名 FROM 社員 INNER JOIN 部署 ON 社員.部署コード = 部署.部署コード

  • ①4行
  • ②3行
  • ③5行
  • ④20行
答えと解説を見る
正解 ①4行
解説
内部結合(INNER JOIN)は、結合の条件(部署コードが等しい)を満たす行の組だけを結果にします。
青木(D1→営業)、井上(D2→総務)、上田(D1→営業)、小野(D3→製造)の4人は、部署表に同じ部署コードがあるので結果に残ります。江藤さんの部署コードは NULL で、NULL は どの値とも「等しい」と判定されないため、結果に現れません。部署表の開発(D4)も、対応する社員がいないため現れません。
したがって、結果は4行です。

他の選択肢が不適切な理由
・3行:部署コードがD3の小野さんも除外した誤りです。D3は部署表にあるので結果に残ります。
・5行:社員表の全ての行を残す左外部結合(社員表を左)の場合の行数です。
・20行:結合の条件を付けずに全ての組合せを作る直積(5行×4行)の行数です。

覚え方のポイント
「内部結合=両方の表に相手がいる行だけ」「NULLは=で比べても一致しない」。この2点で行数を数えます。
問23-5

次の社員表と部署表について、下のSQL文を実行したとき、結果として得られる行の数はいくつか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
部署
部署コード部署名
D1営業
D2総務
D3製造
D4開発
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)SELECT 部署.部署名, 社員.氏名 FROM 部署 LEFT OUTER JOIN 社員 ON 部署.部署コード = 社員.部署コード

  • ①4行
  • ②9行
  • ③6行
  • ④5行
答えと解説を見る
正解 ④5行
解説
左外部結合(LEFT OUTER JOIN)では、左側の表(ここでは部署表)の行は、相手がいなくても全て結果に残ります。
営業(D1):青木、上田 → 2行
総務(D2):井上 → 1行
製造(D3):小野 → 1行
開発(D4):該当する社員がいない → 氏名を NULL として1行
合計は 2+1+1+1=5行です。部署コードが NULL の江藤さんは、どの部署とも一致しないため結果に現れません。

他の選択肢が不適切な理由
・4行:内部結合の場合の行数で、社員のいない開発の行を数えていません。
・6行:部署のない江藤さんも結果に出ると考えた誤りです。左側は部署表なので、江藤さんの行は残りません。
・9行:部署表の4行と社員表の5行を単純に足した値です。

覚え方のポイント
外部結合は「どちらの表を必ず残すか」を最初に確認します。LEFTなら左の表、RIGHTなら右の表の全ての行が残り、相手がいない部分にはNULLが入ります。
問33-5

次の社員表について、下のSQL文を実行したとき、得られる2つの値の組合せとして正しいものはどれか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)SELECT COUNT(*), COUNT(部署コード) FROM 社員

  • ①5 と 5
  • ②4 と 4
  • ③5 と 4
  • ④4 と 5
答えと解説を見る
正解 ③5 と 4
解説
COUNT(*) は、NULL を含むかどうかに関係なく、表の行の数を数えます。社員表は5行なので5です。
COUNT(列名) は、その列の値が NULL でない行だけを数えます。部署コードが NULL なのは江藤さんの1行なので、5-1=4です。
したがって、結果は「5 と 4」です。

他の選択肢が不適切な理由
・5 と 5:COUNT(部署コード) も NULL を含めて数えるとした誤りです。
・4 と 4:COUNT(*) も NULL の行を除くとした誤りです。
・4 と 5:2つの関数の数え方を逆に取り違えています。

覚え方のポイント
「COUNT(*)=行の数」「COUNT(列)=その列がNULLでない行の数」。SUMやAVGなど他の集計関数も、NULLの値は計算に含めません。
問43-5

次の社員表について、下のSQL文の実行結果として正しいものはどれか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)SELECT 部署コード, COUNT(*) FROM 社員 GROUP BY 部署コード HAVING COUNT(*) >= 2

  • ①D1とD2の2行になる
  • ②部署コードD1の1行だけ
  • ③D1・D2・D3の3行になる
  • ④該当する行は1つもない
答えと解説を見る
正解 ②部署コードD1の1行だけ
解説
GROUP BY 部署コード で、部署コードの値ごとにグループにまとめます。
D1:青木、上田 → 2人
D2:井上 → 1人
D3:小野 → 1人
NULL:江藤 → 1人(GROUP BY では NULL の行どうしが1つのグループにまとめられます)
HAVING COUNT(*) >= 2 で、人数が2人以上のグループだけを残すので、結果は D1(2人)の1行だけです。

他の選択肢が不適切な理由
・D1とD2の2行:D2は1人なので、条件を満たしません。
・D1・D2・D3の3行:HAVING の条件を適用せずに、部署コードが NULL でないグループを全て数えた誤りです。
・該当する行は1つもない:D1のグループは2人で、2人以上という条件を満たします。

覚え方のポイント
「WHERE=グループにまとめる前の行を絞る」「HAVING=まとめた後のグループを絞る」。COUNTなどの集計結果を条件にするときはHAVINGを使います。
問53-5

次の社員表と部署表について、下のSQL文の実行結果として正しいものはどれか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
部署
部署コード部署名
D1営業
D2総務
D3製造
D4開発
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)SELECT 部署名 FROM 部署 WHERE EXISTS (SELECT * FROM 社員 WHERE 社員.部署コード = 部署.部署コード)

  • ①開発の1行だけ
  • ②営業、総務、製造
  • ③営業、総務、製造、開発
  • ④営業の1行だけ
答えと解説を見る
正解 ②営業、総務、製造
解説
EXISTS は、かっこ内の副問合せが1行でも結果を返せば真になる条件です。この副問合せは、外側の部署表の行ごとに、「その部署コードを持つ社員がいるか」を調べます(相関副問合せ)。
営業(D1):青木、上田がいる → 真
総務(D2):井上がいる → 真
製造(D3):小野がいる → 真
開発(D4):該当する社員がいない → 偽
したがって、結果は営業、総務、製造の3行です。社員が1人でも所属している部署を求めるSQL文です。

他の選択肢が不適切な理由
・開発の1行だけ:NOT EXISTS を使った場合の結果(社員が1人もいない部署)です。
・営業、総務、製造、開発:EXISTS の条件を無視して、部署表の全ての行を取り出した誤りです。
・営業の1行だけ:社員が2人以上いる部署だけを求めた誤りです。EXISTS は1人でもいれば真になります。

覚え方のポイント
「EXISTS=該当する行が1つでもあれば真」「NOT EXISTS=1つもなければ真」。「〜が存在する(しない)ものを探す」問題で使います。
問63-5

次の社員表について、下のSQL文を実行した後、全社員の給与の合計はいくらになるか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)UPDATE 社員 SET 給与 = 給与 + 2 WHERE 部署コード = 'D1'

  • ①162万円
  • ②160万円
  • ③158万円
  • ④168万円
答えと解説を見る
正解 ①162万円
解説
実行前の給与の合計は、30+25+35+28+40=158万円です。
UPDATE 文は、WHERE 句の条件に合う行だけを更新します。部署コードがD1の社員は青木さんと上田さんの2人なので、2人の給与がそれぞれ2万円ずつ増えます。
158 + 2 × 2 = 162万円

他の選択肢が不適切な理由
・158万円:実行前の合計で、更新を反映していません。
・160万円:更新される行を1行だけと考えた値です。
・168万円:WHERE 句を無視して、全社員(5人)の給与を2万円ずつ増やした値です。

覚え方のポイント
UPDATE・DELETE は、WHERE 句で対象の行を絞ります。条件に合う行が何行あるかを先に数えてから、計算しましょう。
問73-5

SQL文「DELETE FROM 社員」(WHERE句なし)を実行した結果の説明として、最も適切なものはどれか。

  • ①社員表の先頭の1行だけが削除され、残りは残る
  • ②社員表の定義も含めて、表そのものが削除される
  • ③条件が指定されていないため、エラーで実行されない
  • ④社員表の定義は残り、表の中の全ての行が削除される
答えと解説を見る
正解 ④社員表の定義は残り、表の中の全ての行が削除される
解説
DELETE 文は、表から行を削除するデータ操作のSQL文です。WHERE 句で条件を指定すると、条件に合う行だけが削除されますが、WHERE 句を省略すると、全ての行が削除の対象になります。ただし、削除されるのは行(データ)だけで、表の定義(どんな列があるか)は残るため、その後も新しい行を追加できます。

他の選択肢が不適切な理由
・表の定義も含めて表そのものが削除される:DROP TABLE 文の説明です。
・条件がないためエラーになる:WHERE 句は省略でき、省略すると全ての行が対象になります。
・先頭の1行だけが削除される:DELETE 文に、先頭の1行だけを対象にする決まりはありません。

覚え方のポイント
「DELETE=行を消す(入れ物は残る)」「DROP=入れ物(表)ごと消す」。WHERE 句の付け忘れは全件削除につながるため、実務では特に注意が必要です。
問83-5

次の表Aと表Bについて、下のSQL文を実行したとき、結果として得られる行の数はいくつか。

表A(会員番号)
1
2
3
表B(会員番号)
2
3
4
SELECT 会員番号 FROM 表A UNION SELECT 会員番号 FROM 表B

  • ①1行
  • ②2行
  • ③4行
  • ④6行
答えと解説を見る
正解 ③4行
解説
UNION は、2つの問合せの結果を合わせ(和集合)、重複する行は1つにまとめます。
表A:1、2、3 表B:2、3、4
合わせると 1、2、3、4 となり(2と3の重複は1つにまとめる)、結果は4行です。

他の選択肢が不適切な理由
・1行:表Aにあって表Bにない行(差:EXCEPT)の行数です(1だけ)。
・2行:両方にある行(積:INTERSECT)の行数です(2と3)。
・6行:重複を除かない UNION ALL の場合の行数です(3行+3行)。

覚え方のポイント
「UNION=重複を除いて合わせる」「UNION ALL=そのまま全部つなげる」。関係代数の和・積・差と対応づけて覚えましょう。
問93-5

次の社員表について、下のSQL文を実行したとき、結果として得られる行の数はいくつか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)SELECT 氏名 FROM 社員 WHERE 給与 BETWEEN 28 AND 35

  • ①1行
  • ②2行
  • ③3行
  • ④4行
答えと解説を見る
正解 ③3行
解説
BETWEEN a AND b は、「a以上 かつ b以下」を表し、両端の値も含みます。給与が28以上35以下の社員を数えます。
青木(30)、上田(35)、江藤(28)→ 3人
井上(25)と小野(40)は範囲外です。したがって、結果は3行です。

他の選択肢が不適切な理由
・1行:両端を含めず、「28より大きく35より小さい」とした誤りです(青木だけになります)。
・2行:片方の端だけを含めた誤りです(28を除くと青木・上田、35を除くと青木・江藤の2人)。
・4行:範囲外の井上(25)か小野(40)を含めてしまった誤りです。

覚え方のポイント
「BETWEEN は両端を含む」。不等号で書くと「給与 >= 28 AND 給与 <= 35」と同じ意味です。
問103-5

次の社員表(社員番号が主キー)に、下のSQL文を実行した結果の説明として、最も適切なものはどれか。

社員
社員番号氏名部署コード給与
101青木D130
102井上D225
103上田D135
104江藤NULL28
105小野D340
(給与の単位は万円。社員番号が主キーで、江藤さんの部署コードは値が入っていない NULL である)INSERT INTO 社員 VALUES (103, '加藤', 'D2', 27)

  • ①社員番号103の上田さんの行が、加藤さんの行に置き換わる
  • ②主キーの値が重複するため、行は追加されずエラーになる
  • ③社員番号103の行が2つになり、両方とも表に格納される
  • ④社員番号が自動で106に振り直されて、行が追加される
答えと解説を見る
正解 ②主キーの値が重複するため、行は追加されずエラーになる
解説
主キーには、値が重複してはならない(一意性制約)という制約があります。社員表には既に社員番号103の上田さんの行があるため、同じ社員番号103の行を追加しようとすると、制約違反のエラーになり、行は追加されません。DBMSがこのように制約を自動で守らせることで、データの整合性が保たれます。

他の選択肢が不適切な理由
・上田さんの行が置き換わる:INSERT 文は行を追加する文で、既存の行を書き換えることはありません。書き換えるには UPDATE 文を使います。
・同じ番号の行が2つ格納される:主キーの一意性制約により、重複は許されません。
・社員番号が自動で振り直される:INSERT 文が、指定された主キーの値を勝手に別の値に変えることはありません。

覚え方のポイント
「主キー=重複もNULLも許さない」。制約に違反する追加・更新はDBMSが拒否するため、誤ったデータが入り込むのを防げます。

基本情報技術者(科目A)の対策問題(全600問)に戻る

非公式の資格試験対策サイトです。独立行政法人情報処理推進機構(IPA)とは一切関係ありません。

※本ページでは、アクセス解析(Googleアナリティクス)と、広告の配信・成果の計測(A8.net)のためにCookie等を利用し、閲覧に関する情報をGoogle LLC・株式会社ファンコミュニケーションズへ送信しています。詳しくはプライバシーポリシーをご覧ください。

※本ページの問題・解説は、生成AI(人工知能)を活用して作成しています。

【PR】