基本情報技術者 2025年 科目A 問06
問題文
“商品”表に対するSQL文と同じ結果が得られるSELECT文はどれか。
〔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'
🔒 解説は解答すると表示されます
IN句の等価表現【午前解説】
正解の理由
SELECT ... WHERE 仕入先ID IN ('M002','M004') は、仕入先ID が 'M002' または 'M004' の行を抽出します。従って、これと同じ結果を返すのは OR を使った選択肢であり、選択肢ウ(仕入先ID = 'M002' OR 仕入先ID = 'M004')が等価です。実際に該当する行は「S002(M002)」「S005(M004)」「S006(M004)」の3行になります。
例(等価なSQL):
SELECT * FROM 商品
WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004';
解法ステップ
- IN句の意味を確認する:IN('A','B') は「列がAまたはBである」を表す(論理和)。
- 各選択肢を論理演算で比較する:
- = と AND の組合せは「同時に両方の値である」を意味する(ありえない)。
- INTERSECT は2つの結果の共通部分を取る(同じ行が両方の条件を満たす必要がある)。
- OR は「いずれか一方を満たす」=INと同義。
- BETWEEN は範囲指定なので、文字列の順序により中間の値も含まれる可能性がある。
- 上記を当てはめ、IN と等価なのは OR を使った選択肢と判断する。
選択肢別の誤答解説
-
ア: SELECT ... WHERE 仕入先ID = 'M002' AND 仕入先ID = 'M004'
AND は「両方を同時に満たす」必要があるため、単一列に2つの異なる値が同時に入ることはなく、結果は空になります。INの意味とは逆です。 -
イ: SELECT ... WHERE 仕入先ID = 'M002' INTERSECT SELECT ... WHERE 仕入先ID = 'M004'
INTERSECT は2つの結果の共通部分を返します。仕入先IDが同一行で 'M002' かつ 'M004' となる行はないため、これも結果は空になります。INTERSECTは集合の共通部分を取る操作で、INの「いずれか」に対応しません。 -
ウ: SELECT ... WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004'
ここが正解です。OR(論理和)は「どちらか一方または両方」を満たす行を返すため、INと等価になります。選択肢は ウ にあたります。 -
エ: SELECT ... WHERE 仕入先ID BETWEEN 'M002' AND 'M004'
BETWEEN は範囲(下限以上かつ上限以下)を意味します。文字列比較では 'M002' ≤ 値 ≤ 'M004' に該当する 'M003' も含まれるため、M003 の行(S003、S004)まで余分に抽出され、IN の結果とは異なります。
よくある誤解
- AND と OR を取り違える:複数条件を書くとき、AND は「同時に満たす」、OR は「どちらかを満たす」。IN は OR と同義であると覚えておくこと。
- INTERSECT を OR の代わりに使う誤り:INTERSECT は集合の交差を取る(ANDに近い集合演算)ため、同列の異なる値を並列に扱う場合は空集合になりやすい。
- BETWEEN の文字列挙挙動の誤解:BETWEEN は数値だけでなく文字列でも機能し、コレーション順(辞書順)に基づいて範囲を決めるため、見た目では想定外の行が含まれることがある。
補足コラム
- IN と OR は基本的に同等ですが、可読性の点で複数値の比較には IN を使う方が明快です。値の数が多い場合、IN のほうが長くなりにくく可読性が保たれます。
- NULL を含む場合の挙動に注意:列が NULL の場合、等価比較は UNKNOWN になり除外されます。IN に NULL を含めた場合の扱いも注意が必要です。
- BETWEEN は上下限ともに包含(inclusive)です。文字列や日付で範囲指定するときは境界を意識して使いましょう。
FAQ
Q1: IN と OR は常に同じ結果になりますか?
A1: 単純な等価比較では同じ結果になります。ただし NULL の扱いやサブクエリを含むケースでは微妙な違いが出ることがあるため注意してください。
A1: 単純な等価比較では同じ結果になります。ただし NULL の扱いやサブクエリを含むケースでは微妙な違いが出ることがあるため注意してください。
Q2: BETWEEN は上下の値を含みますか?
A2: はい。BETWEEN は下限と上限を含みます(inclusive)。
A2: はい。BETWEEN は下限と上限を含みます(inclusive)。
Q3: パフォーマンス面で IN と OR の違いはありますか?
A3: 多くのデータベースではオプティマイザが同等に扱いますが、値の数が非常に多い場合はINの方が可読性と最適化の面で有利になることがあります。インデックス利用やクエリ計画を確認すると良いです。
A3: 多くのデータベースではオプティマイザが同等に扱いますが、値の数が非常に多い場合はINの方が可読性と最適化の面で有利になることがあります。インデックス利用やクエリ計画を確認すると良いです。
関連キーワード: SQL、WHERE句、IN句、OR、BETWEEN、INTERSECT、論理演算子

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

