マナビング基本情報技術者

SQLのIN述語を別の条件で書き換えるとどうなるか

基本情報技術者試験 令和7年度 問6 / データベース › データ操作

過去問にチャレンジ

令和7年度 問6

"商品"表に対するSQL文と同じ結果が得られるSELECT文はどれか。 〔SQL文〕

SELECT * FROM 商品 WHERE 仕入先ID IN('M002','M004')
令和7年度 問6の図
  1. ア
    SELECT * FROM 商品 WHERE 仕入先ID = 'M002' AND 仕入先ID = 'M004'
  2. イ
    SELECT * FROM 商品 WHERE 仕入先ID = 'M002' INTERSECT SELECT * FROM 商品 WHERE 仕入先ID = 'M004'
  3. ウ
    SELECT * FROM 商品 WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004'
  4. エ
    SELECT * FROM 商品 WHERE 仕入先ID BETWEEN 'M002 'AND 'M004'

会話形式の解説

講師講師
今回はIN述語の意味を確かめる問題です。選択肢にはAND、OR、INTERSECT、BETWEENが並んでいます。それぞれがどの行を選ぶのかを、表に当てはめて比べていきましょう。
受験者受験者
INは「括弧の中の値のどれかに一致する」という意味だったと思います。まず元のSQL文でどの行が返るかを数えればよいですか。
講師講師
その順番で進めましょう。仕入先IDが'M002'か'M004'の行を表から探すと、どうなりますか。
受験者受験者
M002はS002の食器洗い機、M004はS005のコーヒーメーカーとS006のホットプレートです。合わせて3行です。
講師講師
そうです。この3行と同じ結果になる文を探します。最初に、ANDで二つの等価条件を結んだ文はどうでしょう。
受験者受験者
「M002とM004」と読めるので、これでもよさそうに見えました。でも、ANDは両方の条件を満たす必要があるのですよね。
講師講師
そこがポイントです。1つの行の仕入先IDが、'M002'と'M004'に同時に等しくなることはありません。なので結果は0行です。日本語の「と」につられてANDを選ばないよう注意しましょう。
受験者受験者
では、ORで結んだ文なら、M002の行もM004の行もどちらも選ばれるので、S002、S005、S006の3行になります。
講師講師
はい、元の結果と一致するので、これが正解です。「列名 IN (値1, 値2)」は「列名 = 値1 OR 列名 = 値2」と同じ意味になります。
受験者受験者
INTERSECTを使った文が少し気になります。M002の結果とM004の結果を組み合わせているので、合わせて3行になる気がしました。
講師講師
INTERSECTは、2つのSELECT結果の両方に含まれる行、つまり積集合(共通部分)を返します。前半はS002だけ、後半はS005とS006で、共通する行はありません。なので結果は0行です。
受験者受験者
組み合わせるといっても、足し合わせるのではなく共通部分を取るのですね。最後のBETWEENは、M002からM004までなので同じ結果になりそうですが、どうですか。
講師講師
BETWEENは、下限と上限の両端を含む連続した範囲を選びます。そのため、間にある'M003'の行、つまりS003の電子レンジとS004の炊飯器も入ってしまいます。結果はS002からS006までの5行になり、元の3行より多くなります。
受験者受験者
整理すると、ANDは0行、INTERSECTも0行、BETWEENは間の値まで入って5行、ORだけが元と同じ3行ですね。
講師講師
そのとおりです。補足すると、2つの結果を合わせたいときはINTERSECTではなくUNIONを使います。UNIONは和集合を返すので、この問題でも元と同じ3行になります。「または」と「かつ」は取り違えやすいので、迷ったら表の各行に条件を当てはめて行数を数えると確実です。

まとめ

IN述語は「括弧内の値のどれかに一致する」行を選ぶので、同じ列の等価条件をORで結んだ形と同じ意味になります。この問題では、元のSQL文もOR条件の文もS002、S005、S006の3行を返します。ANDで結ぶと、1つの行が同時に2つの値をとることはないので0行になります。INTERSECTは共通部分(積集合)を返すためこれも0行、BETWEENは両端を含む範囲なので間の'M003'の行まで入って5行になります。迷ったときは、表の各行に条件を当てはめて行数を数えると確実です。

解答・解説

正解はウです

この問題のテーマ

IN述語を使ったSQL文と同じ結果になるSELECT文を選ぶ問題です。IN、AND、OR、INTERSECT、BETWEENのそれぞれが、どの行を選ぶかを正しく区別できるかが問われています。

解き方の考え方

最初に、元のSQL文が返す行を表から確かめます。仕入先IDが'M002'または'M004'の行なので、S002(食器洗い機)、S005(コーヒーメーカー)、S006(ホットプレート)の3行です。次に、各選択肢のSELECT文を同じ表に当てはめ、返る行が3行とも一致するかを確認します。INは「括弧内のどれかに一致する」という意味なので、同じ列の等価条件をORで結んだ形と同じになると考えると、すぐに見当がつきます。

選択肢ごとの解説

  1. ×ア  
    SELECT * FROM 商品 WHERE 仕入先ID = 'M002' AND 仕入先ID = 'M004'
    アのAND条件では、1つの行の仕入先IDが'M002'と'M004'の両方に等しい必要があります。1行の列が同時に2つの値をとることはないので、結果は0行です。ANDは「すべてを満たす」という意味で、INの「いずれか」とは違います。
  2. ×イ  
    SELECT * FROM 商品 WHERE 仕入先ID = 'M002' INTERSECT SELECT * FROM 商品 WHERE 仕入先ID = 'M004'
    イのINTERSECTは、2つのSELECT結果の両方に含まれる行(積集合)を返します。前半はM002の行(S002)、後半はM004の行(S005、S006)で、共通する行はありません。そのため結果は0行です。「いずれか」を表すには、積集合ではなく和集合の考え方が必要です。
  3. ○ウ  
    SELECT * FROM 商品 WHERE 仕入先ID = 'M002' OR 仕入先ID = 'M004'
    ウのOR条件は、仕入先IDが'M002'に等しい行と'M004'に等しい行のどちらも選びます。表に当てはめると、S002、S005、S006の3行になります。元のSQL文の結果と一致するので、これが正解です。
  4. ×エ  
    SELECT * FROM 商品 WHERE 仕入先ID BETWEEN 'M002 'AND 'M004'
    エのBETWEENは、下限と上限の両端を含む範囲を指定します。'M002'以上'M004'以下が対象になるので、間にある'M003'の行(S003の電子レンジ、S004の炊飯器)も選ばれます。結果はS002〜S006の5行となり、元の3行より多くなります。

補足

「または」をAND、「かつ」をORと取り違える引っかけはよく出題されます。迷ったときは、実際に表の各行に条件を当てはめて結果の行数を数えると確実です。なお、この問題でM002とM004の結果を和集合にしたい場合は、INTERSECTの代わりにUNIONを使えば元のSQL文と同じ3行になります。

POINT

  • 列名 IN (値1, 値2) は、列名 = 値1 OR 列名 = 値2 と同じ意味です。
  • 同じ列に異なる値を求める等価条件をANDで結ぶと、どの行も満たせないので結果は0行になります。
  • INTERSECTは2つの結果の共通部分(積集合)を返し、UNIONは和集合を返します。
  • BETWEEN A AND Bは、AとBの両端を含む連続した範囲を選ぶため、間にある値も含まれます。

※出典:令和7年度 基本情報技術者試験 科目A 問6(一部改変)