令和7年度 秋期 午前Ⅱ 問9
データ操作
“名簿1”表と“名簿2”表のそれぞれ対応する行が全て等しいかどうかを確認するSQL文のa,b,cに入れる適切な字句はどれか。
名簿1
| 名前 | 住所 | 性別 | 年齢 |
|---|---|---|---|
| 試験 太郎 | 東京 | 男 | 22 |
| 情報 花子 | 大阪 | 女 | 24 |
| 処理 一郎 | 京都 | 男 | 35 |
名簿2
| 名前 | 住所 | 性別 | 年齢 |
|---|---|---|---|
| 試験 太郎 | 東京 | 男 | 22 |
| 情報 花子 | 大阪 | 女 | 24 |
| 処理 一郎 | 京都 | 男 | 35 |
〔SQL文〕
SELECT CASE WHEN COUNT(*) = 0 THEN '等しい' ELSE '異なる' END AS 結果
FROM ((SELECT * FROM 名簿1 [ a ] SELECT * FROM 名簿2)
[ b ]
(SELECT * FROM 名簿1 [ c ] SELECT * FROM 名簿2)
) COMPARE
選択肢は原典ではa・b・cの表。
- アa:EXCEPT / b:UNION ALL / c:INTERSECT
- イa:EXCEPT / b:UNION / c:INTERSECT
- ウa:UNION ALL / b:INTERSECT / c:UNION
- エa:UNION / b:EXCEPT / c:INTERSECT
答えと解説を見る
✓ これが正解エa:UNION / b:EXCEPT / c:INTERSECT
解説
和集合から共通部分を引いて行が残らなければ、二つの表は等しいと判定できます。
二つの表が等しいかを調べるには、どちらか一方にしかない行があるかを数えます。名簿1と名簿2の和集合(UNION)から、両方にある行の集合(INTERSECT)を差し引く(EXCEPT)と、一方にだけある行が残ります。この件数が0なら等しく、1件以上あれば異なると判定できます。問の表では、和集合は3行、共通部分も3行で、差は0行なので、結果は等しいになります。見分ける軸は、二つの表が等しいときに件数が0になる組合せかどうかです。各選択肢について、問の等しい表を当てはめて件数を数えると、0になるのは和集合から共通部分を引く組合せだけです。
ほかの選択肢はなぜ違うのか
- アa:EXCEPT / b:UNION A…:名簿1から名簿2を引いた行(0行)と、両方にある行(3行)を UNION ALL で合わせると3行になります。表が等しいのに件数が0にならず、結果は異なるになるので、判定に使えません。
- イa:EXCEPT / b:UNION /…:名簿1から名簿2を引いた行(0行)と、両方にある行(3行)を UNION で合わせると3行です。結局は名簿1の行を数えることになり、等しい表でも結果は異なるになってしまいます。
- ウa:UNION ALL / b:INTE…:二つの表を UNION ALL で合わせた6行と、UNION で合わせた3行の共通部分を取ると3行が残ります。等しい表でも件数が0にならないので、結果は異なるになり、判定に使えません。
出典:令和7年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問9
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)