ITパスポート 2017年 春期 問90
問題文
関係データベースで管理している“商品”表に対して次の三つの操作a〜cを行ったとき、得られる値が大きい順に操作を左から並べたものはどれか。ここで、“%”は0文字以上の任意の文字列を表すものとする。
〔操作〕
a 大盛が‘有’でかつ商品名が‘%うどん%’で選択される商品の数を求める。
b 価格が400以上かつ550以下で選択される商品の数を求める。
c 商品名が‘うどん%’で選択される商品の数を求める。

選択肢
ア:a, b, c(正解)
イ:b, c, a
ウ:c, a, b
エ:c, b, a
🔒 解説は解答すると表示されます
関係データベースの検索条件による件数比較【ITパスポート 解説】
正解の理由
この問題は、小さな表に対して3つの「選択(フィルタ)」を適用し、それぞれ何件ヒットするかを数えるものです。
操作 a は「大盛が‘有’かつ商品名に‘うどん’を含む」行を数えます。表を見ると「大盛=有」は4件(S001, S002, S004, S006)で、これらはいずれも商品名に「うどん」を含んでいます。したがって a は 4 件です。
操作 b は「価格が 400 以上かつ 550 以下」なので該当は S003(500), S004(550), S006(400) の3件です。
操作 c は「商品名が 'うどん%'('うどん'で始まる)」なので S004(うどん定食) と S005(うどんすき) の2件です。よって件数は a=4、b=3、c=2 で、大きい順は a → b → c となり、選択肢の中では ア が一致します。
操作 a は「大盛が‘有’かつ商品名に‘うどん’を含む」行を数えます。表を見ると「大盛=有」は4件(S001, S002, S004, S006)で、これらはいずれも商品名に「うどん」を含んでいます。したがって a は 4 件です。
操作 b は「価格が 400 以上かつ 550 以下」なので該当は S003(500), S004(550), S006(400) の3件です。
操作 c は「商品名が 'うどん%'('うどん'で始まる)」なので S004(うどん定食) と S005(うどんすき) の2件です。よって件数は a=4、b=3、c=2 で、大きい順は a → b → c となり、選択肢の中では ア が一致します。
解法ステップ
- 問題文の操作(a〜c)を「データの絞り込み条件」として理解する。
- '%' はワイルドカード(0文字以上の任意の文字列)を表す。
- 'うどん%' は「うどんで始まる」、'%うどん%' は「うどんを含む」。
- 表の各行に対して、条件に合うかをチェックする。
- 条件に合う行の数をそれぞれ数える。
- 得られた件数を大きい順に並べて、選択肢と照合する。
具体的なカウント結果(表に基づく)
- a(大盛='有' かつ 商品名 LIKE '%うどん%')→ S001, S002, S004, S006 → 4件
- b(価格 >= 400 かつ <= 550)→ S003(500), S004(550), S006(400) → 3件
- c(商品名 LIKE 'うどん%')→ S004, S005 → 2件
参考として各操作を SQL(Structured Query Language:構造化問合せ言語)で書くと:
-- a
SELECT COUNT(*) FROM 商品 WHERE 大盛 = '有' AND 商品名 LIKE '%うどん%';
-- b
SELECT COUNT(*) FROM 商品 WHERE 価格 BETWEEN 400 AND 550;
-- c
SELECT COUNT(*) FROM 商品 WHERE 商品名 LIKE 'うどん%';
選択肢別の誤答解説
-
ア(a, b, c)
正解です。計算すると a=4、b=3、c=2 で降順は a→b→c になります。 -
イ(b, c, a)
これだと b が最も多いとしていますが、実際は b=3 に対して a=4 で a の方が多いので誤りです。 -
ウ(c, a, b)
これだと c が最も多い扱いですが、実データでは c=2 が最小です。順序が完全に逆です。 -
エ(c, b, a)
これも c を最大と見なしていますが、実際は c が最小の2件で誤りです。
よくある誤解
-
'%' の意味を取り違える
- '%うどん%' は「前後に何があっても 'うどん' を含む」を意味します。
- 'うどん%' は「先頭が 'うどん'」。両者は異なります。問題文では a が '%うどん%'、c が 'うどん%' なので注意してください。
-
価格の境界値の扱い(400以上かつ550以下)を「含む/含まない」で迷う
- 「以上(>=)」と「以下(<=)」は境界値を含みます。ここでは 400 と 550 の両方が該当します(S006 と S004)。
-
日本語の文字列比較で「大文字小文字」を気にする誤り
- 日本語(ひらがな・漢字)は大文字小文字の概念はありませんが、英語等で LIKE の挙動は DB の設定(照合順序:collation)によって異なります。今回の問題は日本語なので気にしなくて良いです。
補足コラム
- LIKE とワイルドカードの使い分け
- SQL の LIKE 演算子は文字列検索でよく使います。ワイルドカードは主に
%(任意の文字列、長さ0可)と_(任意の1文字)があります。覚え方は「% は大きな何でも入る箱」「_ は1文字だけ」だと思ってください。
- SQL の LIKE 演算子は文字列検索でよく使います。ワイルドカードは主に
- BETWEEN の使い方
- BETWEEN A AND B は A と B の間(通常は両端を含む)を意味します。例:価格 BETWEEN 400 AND 550 は 400 以上 550 以下。
FAQ
Q1: '%' は空文字にもマッチしますか?
A1: はい。'%うどん%' の左側や右側が空文字でも「うどん」を含むのでマッチします。例えば「うどん」だけの文字列も '%うどん%' に合います。
A1: はい。'%うどん%' の左側や右側が空文字でも「うどん」を含むのでマッチします。例えば「うどん」だけの文字列も '%うどん%' に合います。
Q2: SQL の LIKE は大文字小文字を区別しますか?
A2: データベースの設定次第です。MySQL ではデフォルトの照合順序によって区別しないことが多いですが、PostgreSQL では ILIKE(大文字小文字無視)を使うことがあります。本問の日本語例では気にしなくて良いです。
A2: データベースの設定次第です。MySQL ではデフォルトの照合順序によって区別しないことが多いですが、PostgreSQL では ILIKE(大文字小文字無視)を使うことがあります。本問の日本語例では気にしなくて良いです。
Q3: BETWEEN は端を含むのを忘れがちです。覚え方は?
A3: 「BETWEEN A AND B は A と B の間(含む)」と覚えてください。英語の意味「~の間(含む)」と対応します。
A3: 「BETWEEN A AND B は A と B の間(含む)」と覚えてください。英語の意味「~の間(含む)」と対応します。
関連キーワード: リレーショナルデータベース、SQL、LIKE演算子、ワイルドカード、BETWEEN

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

