基本情報技術者 2013年 春期 午前(科目A) 問29
問題文
“BOOKS”表から書名に“UNIX”を含む行を全て探すために次のSQL文を用いる。
aに指定する文字列として、適切なものはどれか。ここで、書名は“BOOKS”表の“書名”列に格納されている。
SELECT * FROM BOOKS WHERE 書名 LIKE '[ a ]'
選択肢
ア:%UNIX
イ:%UNIX%(正解)
ウ:UNIX
エ:UNIX%
🔒 解説は解答すると表示されます
LIKEとワイルドカード【午前解説】
正解の理由
問われているのは「書名に文字列 'UNIX' を含む行をすべて抽出する」ことです。SQLのLIKE句で部分一致を表すワイルドカードは
% で、任意の文字列(長さ0以上)にマッチします。したがって、文字列の前後に何があっても 'UNIX' を含む行をすべて取り出すには、パターン %UNIX% を使います。これが選択肢のうち正しいもの、すなわち イ に当たります。(SQL例)
SELECT * FROM BOOKS WHERE 書名 LIKE '%UNIX%';
解法ステップ
- 抽出条件を「部分文字列を含む」に設定する必要があると確認する。
- LIKE で部分一致を表すには
%を使用することを想起する。 - 前後いずれにも任意の文字列が許されるため、パターンは前方と後方に
%を付ける:%UNIX%。 - SQL文に適用して実行する(パターンはクォートで囲むこと)。
選択肢別の誤答解説
- ア:
%UNIX%UNIXは末尾がUNIXで終わる文字列にマッチします。先頭に任意の文字列があってもマッチします(例:ABCUNIXはマッチ)。しかしUNIXBOOKのようにUNIXの後ろに文字がある場合はマッチしません。よって「UNIX を含む(前後問わず)」条件を満たさないため不正解です。
- イ:
%UNIX%- 前後に
%が付いているため、任意の文字列の中にUNIXが含まれていればすべてマッチします。問題の目的に合致するため正解です。イ
- 前後に
- ウ:
UNIX- これは完全一致を意味し、書名がちょうど
UNIXの場合にしかマッチしません。部分一致の条件を満たさないため不正解です。
- これは完全一致を意味し、書名がちょうど
- エ:
UNIX%- これは
UNIXで始まる文字列(例:UNIXBOOK)にはマッチしますが、前に文字があるもの(例:ABCUNIX)やUNIXが中間にあるものにはマッチしません。従って不正解です。
- これは
よくある誤解
%は「1文字以上」を表すと誤解する%は長さ0の部分文字列にもマッチする(空文字列を含む)。したがって%UNIX%は文字列がちょうどUNIXでもマッチします。
- データベースによる大/小文字の扱いを考慮しない
- LIKE の大文字小文字の感度はDBの照合順序(コレーション)による。必要なら
UPPER(書名) LIKE '%UNIX%'のように正規化して検索する。
- LIKE の大文字小文字の感度はDBの照合順序(コレーション)による。必要なら
補足コラム
- 単一文字ワイルドカードは
_(アンダースコア)です。例えばUNIX_はUNIXの後に1文字ある文字列にマッチします。 %や_を文字として検索したい場合はエスケープ句を使います(例:LIKE '%\%%' ESCAPE '\')。- 大量データでLIKE '%...%' を多用するとフルテーブルスキャンになりやすく、性能面で問題になることがあります。インデックスを効かせたい場合はプレフィックス検索(
UNIX%)や全文検索機能の利用を検討してください。
FAQ
Q1: 大文字小文字を無視して検索したいときは?
A1: DBの照合順序で変わります。一般的には
A1: DBの照合順序で変わります。一般的には
UPPER(書名) LIKE '%UNIX%' や 書名 ILIKE '%UNIX%'(PostgreSQL)などを使います。Q2: パターン内の
A2: エスケープを使います。例:
% を文字として検索するには?A2: エスケープを使います。例:
WHERE 書名 LIKE '%\%%' ESCAPE '\'。Q3: インデックスで高速に部分一致検索する方法は?
A3: 前方一致(
A3: 前方一致(
UNIX%)なら一部のインデックスが使えますが、%UNIX% のような前方にもワイルドカードがある検索は通常インデックスを使えないため、全文検索エンジンや逆インデックス、n-gramインデックス等の利用が現実的です。関連キーワード: SQL、LIKE、ワイルドカード、部分一致、%記号、_(アンダースコア)、エスケープ、検索最適化

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

