メインコンテンツへ
データベース

”商品”表に対するSQL文と同じ結果が得られるSELECT文はどれか。 〔SQL文〕 SELECT * FROM 商品 WHERE 仕入先ID IN ('M002', 'M004')

商品ID商品名称仕入先ID単価
S001冷蔵庫M001155,000
S002食器洗い機M00285,000
S003電子レンジM00378,000
S004炊飯器M00332,000
S005コーヒーメーカーM00415,000
S006ホットプレートM00412,000
ア.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句は「この招待リストに名前がある人は入場OK」という仕組み。リストの中のどれか一つに一致すればOKなので、本質はORの連続です。

なぜ ウ が正解か

ウのORは「M002か、あるいはM004か」と一行一行に問いかける。INも内部的にまったく同じ動きをしていて、候補が増えるほどORをズラズラ書く手間を省くために生まれたのがINです。つまりIN ('M002','M004') は 'M002'=true OR 'M004'=true の糖衣構文であり、返ってくる行も完全に一致します。

なぜ ア は間違いか

一つの列が同時に'M002'でも'M004'でもある商品は宇宙のどこにも存在しません。ANDは「両方同時に満たせ」という要求なので結果は常に0件——二足のわらじを一本の足に履かせようとしている状態です。

なぜ イ は間違いか

INTERSECTは「両方のSELECTに共通して登場する行」だけを返す集合演算。M002の商品とM004の商品に同じ行が重なることはないので、こちらも0件になります。UNIONなら正解でしたが、惜しくも真逆の演算子を選んでしまいました。

なぜ エ は間違いか

BETWEENは文字列の辞書順範囲なので'M002'以上'M004'以下、つまりM002・M003・M004がすべて対象になります。M003(電子レンジ)まで招待状が届いてしまうので、元のIN句より1社多く拾いすぎです。

出典: 基本情報技術者試験 令和7年 公開問題