基本情報技術者試験 令和7年度 科目A 公開問題(過去問) 問6 について解説します。
問題
問6 “商品”表に対する 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’
解説・解答
元のSQL文がやっていること
SELECT * FROM 商品 WHERE 仕入先ID IN (‘M002’, ‘M004’)
このSQL文は「“商品”表から 仕入先ID が M002 または M004 の行を取り出す」 という意味です。条件「項目 IN (A , B)」は「項目 = A OR 項目 = B」と同じになります。
この“商品”表では該当する行は
仕入先ID = M002 → S002(食器洗い機)
仕入先ID = M004 → S005(コーヒーメーカー), S006(ホットプレート)
の合計3行になります。
それぞれの選択肢について確認します。
ア: SELECT * FROM 商品 WHERE 仕入先ID = ‘M002’ AND 仕入先ID = ‘M004’
このSQL文の条件はANDが使われていますが、ANDは両方満たす必要があります。
WHERE 仕入先ID = ‘M002’ AND 仕入先ID = ‘M004’
しかし、“商品”表では仕入先IDの列は1つの値しかないため、「M002 でもあり、同時に M004 でもある」行は存在しません。
そのため、このSQL文の結果は0行(何も取れない)になります。元のSQLと同じ結果は得られません。
イ: SELECT * FROM 商品 WHERE 仕入先ID = ‘M002’
INTERSECT
SELECT * FROM 商品 WHERE 仕入先ID = ‘M004’
このSQL文ではINTERSECTが使われていますが、INTERSECTは2つのSELECT文の結果の共通部分のみを抽出します。
SELECT … WHERE 仕入先ID = ‘M002’
INTERSECT
SELECT … WHERE 仕入先ID = ‘M004’
しかし、“商品”表では仕入先IDの列は1つの値しかないため、仕入先ID = ‘M002’ の行と 仕入先ID = ‘M004’ の行は共通しません。
そのため、このSQL文の結果は0行(何も取れない)になります。元のSQLと同じ結果は得られません。
ウ: SELECT * FROM 商品 WHERE 仕入先ID = ‘M002’ OR 仕入先ID = ‘M004’
このSQL文の条件はORが使われていますが、ORはどちらか一方を満たせば良いという意味です。
WHERE 仕入先ID = ‘M002’ OR 仕入先ID = ‘M004’
このSQL文は「“商品”表から 仕入先ID が M002 または M004 の行を取り出す」という意味になり、元のSQL文が表している意味と全く同じになります。
そのため、このSQL文の結果は3行(S002, S005, S006)になり、元のSQLと同じ結果が得られます。これが正解です。
エ: SELECT * FROM 商品 WHERE 仕入先ID BETWEEN ‘M002’ AND ‘M004’
このSQL文の条件は「BETWEEN A AND B」が使われていますが、これは「AとBの間(A以上B以下)の範囲」という意味です。
WHERE 仕入先ID BETWEEN ‘M002’ AND ‘M004’
仕入先IDは文字列なので、文字コード順で範囲を比較します。この場合 ‘M002’ から ‘M004’ の範囲に入るのは M002, M003, M004 になります。
そのため、このSQL文の結果は5行(S002, S003, S004, S005, S006)になります。元のSQLと同じ結果は得られません。
以上により、この問題の解答は「ウ」になります。
