【SQLの基礎知識⑧】 文字列検索(ワイルドカードの使い方)

SQLの基礎知識
SQLの基礎知識
この記事は約6分で読めます。
Recommended Articles

【SQL】 文字列検索 (ワイルドカードの使い方)

ワイルドカードと一緒に使うLIKEキーワード

ここまでの演算子の説明で、条件式の書き方は理解されたと思います。比較演算子などで検索を行うには、比較の対象と同じものを指定する必要がありました。しかし、実際に検索を行うときは、必ずしも正しく値を記憶している訳ではありません。また、文字列の一部が一致するというあいまいな検索を行いたい場合もあります。このようなときに使うのがLIKEキーワードです。

LIKEキーワードはワイルドカードと呼ばれる文字列のパターンを表現するための記号とともに使います。LIKEキーワードの書式は次のように使います。

書式
<列名> LIKE <検索条件>

<検索条件>は、これから解説するワイルドカードを使って記述します。LIKEを含む全体で条件式となります。

ワイルドカードには次のようなものがあります。

イルドカード内容
%複数の文字にマッチする
_1つの文字にマッチする

ただし、MSAccessの場合には、任意の複数の文字を返す「%」ワイルドカードが「*」になり、1文字を表す「_」ワイルドカードが「?」になりますので注意して下さい。

% ワイルドカード

「%」ワイルドカードは複数の文字にマッチするワイルドカードです。

SQL文
SELECT * FROM 商品一覧 WHERE 商品名 LIKE 'うさぎ%';
実行結果

商品コード商品名カテゴリ単価仕入先
EDU-0012うさぎ算知能玩具1800実験堂
商品一覧
商品コード商品名カテゴリ単価仕入先
USA-0012眠いうさぎぬいぐるみ9800ウサギ社
USA-1011だれうさぎきぐるみ5000ウサギ社
EDU-0012うさぎ算知能玩具1800実験堂
GAM-0004子うさぎクエストゲーム6800USAGI.Corp
OOK-1001舌の出た狼きぐるみ5200がるる社
この例では、「うさぎ」の後ろに「%」を付け、「商品名」列の値が「うさぎ」で始まる行を検索しています。商品名の中には「うさぎ」を含む値はたくさんありますが、「うさぎ」で始まるものは結果として返されたものだけです。最後が「うさぎ」で終わるものを検索する場合には、「%うさぎ」と前に「%」を付けます
さらに「商品名」列の値に「うさぎ」が含まれるものすべて検索するにはどのように記述したら良いのでしょうか?次のように入力します。
SQL文
SELECT * FROM 商品一覧 WHERE 商品名 LIKE '%うさぎ%';
実行結果

商品コード商品名カテゴリ単価仕入先
USA-0012眠いうさぎぬいぐるみ9800ウサギ社
USA-1011だれうさぎきぐるみ5000ウサギ社
EDU-0012うさぎ知能玩具1800実験堂
GAM-0004うさぎクエストゲーム6800USAGI.Corp

ここまで見てくるとわかるように、%ワイルドカードには次のような記述の仕方があります。

  • 列名 LIKE ’文字列%’ : 先頭が「文字列」で始まる値
  • 列名 LIKE ’%文字列’ : 最後が「文字列」で終わる値
  • 列名 LIKE ’%文字列%’ : 「文字列」が含まれる

ところで、「うさぎ」という文字列が先頭や最後ではなく、文字列の中にある行だけを検索したい場合にはどのようにすればよいでしょうか?残念ながら直接選択する演算子はありませんが、NOT演算子と組み合せて検索条件を記述することにより検索することができます。記述としては次のようになります。

SQL文
SELECT * FROM 商品一覧
WHERE
 商品名 LIKE '%うさぎ%'
 AND 商品名 NOT LIKE 'うさぎ%'
 AND 商品名 NOT LIKE '%うさぎ';
実行結果

商品コード商品名カテゴリ単価仕入先
GAM-0004うさぎクエストゲーム6800USAGI.Corp

 「 _ 」 ワイルドカード

「%」ワイルドカードは複数の文字列にマッチするワイルドカードで、文字列数には関係なくマッチしていました。これに対して、1文字にマッチするのが「 _ 」(アンダースコア)ワイルドカードです。そのため「 _ 」ワイルドカードではマッチする文字数を厳密に指定することができます。
例えば、「A_」という指定をしたときに、マッチするかしないかのれを挙げると次のようになります。
  • A0 :マッチする
  • AA :マッチする
  • B0 :マッチしない
  • A11 :マッチしない(Aの後ろが1文字でないため)
  • AA1 :マッチしない(Aの前に文字があるため)

このように「 _ 」ワイルドカードは非常に厳密に検索を行うことができます。実際に使ってみましょう。

SQL文
SELECT * FROM 商品一覧 WHERE カテゴリ LIKE '_ぐるみ';
実行結果

商品コード商品名カテゴリ単価仕入先
USA-1011だれうさぎぐるみ5000ウサギ社
OOK-1001舌の出た狼ぐるみ5200がるる社

このSQL文ではカテゴリが「_ぐるみ」にマッチする行を表示しています。ここで「ぬいぐるみ」が出てこないのは「ぐるみ」の前が2文字になっているためです。

商品一覧
商品コード商品名カテゴリ単価仕入先
USA-0012眠いうさぎぬいぐるみ9800ウサギ社
USA-1011だれうさぎきぐるみ5000ウサギ社
EDU-0012うさぎ算知能玩具1800実験堂
GAM-0004子うさぎクエストゲーム6800USAGI.Corp
OOK-1001舌の出た狼きぐるみ5200がるる社

また、マッチさせる文字数を2つ以上にしたい場合には、文字数分だけ「 _ 」を並べます

SQL文
SELECT * FROM 商品一覧 WHERE 商品コード LIKE '___-0012';
実行結果

商品コード商品名カテゴリ単価仕入先
USA-0012眠いうさぎぬいぐるみ9800ウサギ社
EDU-0012うさぎ算知能玩具1800実験堂
この例では「商品コード」列の、何らかの3文字の後ろに「-0012」という文字列がつながる値を持つ行を検索しています。

ワイルドカードの組合せ

ワイルドカードは組合せて使うこともできます。「 % 」「 _ 」を組合せることにより。非常に多彩な文字列の検索ができます。

SQL文
SELECT * FROM 商品一覧 WHERE 商品コード LIKE 'U%-_012';
実行結果

商品コード商品名カテゴリ単価仕入先
USA-0012眠いうさぎぬいぐるみ9800ウサギ社

これは、「商品コード」列で「U」から始まる複数の文字があり、最後の「012」の頭に1文字が入る値を検索しています。このようにワイルドカードを使うと、文字列の中で特定パターンを持ったものを検索することができます。

関連リンク

次の章に進む
【SQLの基礎知識⑨】 データベース・表の作成と削除
この章では、データベース・表の作成と削除のやり方を習得できます。プライマリキーやデフォルト値の設定方法など実践で役立つ手順を解説しています。いちれべ.comは、オラクル、MS-SQL、MS-Access で使用可能か一目でわかるサイトです。
SQLの基礎知識トップページ
【SQLの基礎知識】基本ルールや基礎の基礎をマスターしよう
こちらの記事を読み進めることで、SQLの基礎が充分に身に付きます。これからSQLを身に着けたい初心者・入門者の方に最適です。データベース製品ごとに表現方法が異なることがありますので、ある程度SQLのスキルがある方も利用できるサイトです。

Recommended Articles