【SQL】意外と簡単!これならわかるLIKE句でのあいまい検索

みなさんこんにちは!

フリーランスプログラマーのsatoです。

今回はLIKEを使用した曖昧検索について見ていきましょう。

この曖昧検索をマスターすると、たとえば「○○を含んだ文字列を探す」なんてことが簡単に行えますよ!

  • [基本]「LIKE」とは
  • [基本]「LIKE」の使い方
  • [基本]実際に曖昧検索をしてみよう!
  • [応用]否定形の「NOT LIKE」
  • [応用]大文字・小文字を判別するなら…
  • [応用]「正規表現」でもっと複雑に検索!

まずは「LIKE」の基本について学び、理解を深めましょう。そのあと、否定形や正規表現についても少し触れていきましょう。

それではよろしくお願いいたします。

目次

「LIKE」の使い方

「LIKE」は先ほども説明しましたが「曖昧検索」を行うための仕組みです。

ワイルドカード文字を使用して○○を含んだ文字列を探すといった処理を実現可能です。

なかなか応用が効きそうな命令ですね。では早速使い方を見ていきましょう。

※ワイルドカードは後ほど説明していきますね!

基本的な使い方

基本的な使い方は以下の通りです。

SELECT [表示要素] FROM [テーブル名] WHERE [要素名] LIKE [曖昧検索の条件];

基本的に「WHERE句」の後ろに、条件の一つとして記述することになります。

少し実践的な内容で見てみましょうか。例えばユーザーの情報が入った、userテーブルがあったとして…名前に「山」がつくユーザーを探すなら、以下のようになるでしょう。

SELECT name FROM user WHERE name LIKE "%山%";

これだけで、名前に「山」がつくユーザーを一覧表示できます。

便利ですね!

しかし”%山%”部分の%となんでしょうか?

実はこれが今回重要となる、ワイルドカード文字です。

ワイルドカード文字とは

ワイルドカード文字とは、曖昧検索を指示する記号のことです。

このワイルドカード文字には二種類の文字があります。それが「% 」と「 _ 」で、それぞれ以下の効果をもちます。

% ・・・ 0文字以上の任意の文字列
_ ・・・ 任意の1文字

つまり先ほどの”%山%”部分は「どこかに山がついている文字列かどうか」を指定していたわけですね!

逆に「”_山%”」としていたら、任意の1文字が頭に必要になるので…たとえば山田はNG、竹山はOKといった指示となるわけです。

※ただし環境によっては、これ以外にもワイルドカード文字があるケースもあります。

実際に曖昧検索をしてみよう!

今回は以下のテーブルを使って、実行をしてみましょう。

userテーブル:

+------+--------+
| id   | name   |
+------+--------+
|    1 | 山田   |
|    2 | 山口   |
|    3 | 竹山   |
|    4 | 渡辺   |
+------+--------+

山がつく人全員を探す

先ほど見た通りです。

前後を「0文字以上の任意の文字列」を意味する%で囲めば実現できます。

実行命令:

SELECT * FROM user WHERE name LIKE "%山%";

実行結果:

------+--------+
| id   | name   |
+------+--------+
|    1 | 山田   |
|    2 | 山口   |
|    3 | 竹山   |
+------+--------+

山が二文字目にくる人を探す

この場合も簡単です。

「任意の1文字」を意味する_を頭に入れてあげる必要があるわけですね!

実行命令:

SELECT * FROM user WHERE name LIKE "_山%";

実行結果:

+------+--------+
| id   | name   |
+------+--------+
|    3 | 竹山   |
+------+--------+

否定形の「NOT LIKE」

ここまでで、一通りLIKEについて理解できたと思います。非常に簡単かつ有用な命令でしたね!

そんなLIKEですが、否定形も用意されています。それが「NOT LIKE」です。

先ほどのテーブルで使用するとこうなります。

実行命令:

SELECT * FROM user WHERE name NOT LIKE "%山%";

実行結果:

+------+--------+
| id   | name   |
+------+--------+
|    4 | 渡辺   |
+------+--------+

山がついていない人のみ取得できましたね!

エスケープ文字

文字列の中にワイルドカードではない、_や%を使用したいケースもあると思います。

その場合はを頭につけましょう。

「 _ 」や「 % 」とすることで、ワイルドカードではない、ただの文字として使用することが可能です。

大文字・小文字を判別するなら…

今回は漢字で使い方を見てきてしまいましたが、アルファベットでLIKEを使用することもあるでしょう。

その時注意が必要なのが、大文字小文字についてです。LIKEでは大文字小文字の違いは無視されてしまいます。

例えば以下のテーブルがあったとします。

userテーブル:

+------+------+
| id   | name |
+------+------+
|    1 | aaaa |
|    2 | AAAA |
+------+------+

この時「a」を含む文字列を指定した、以下の命令を投げると…

実行命令:

SELECT * FROM user WHERE name LIKE "%a%";

実行結果:

+------+------+
| id   | name |
+------+------+
|    1 | aaaa |
|    2 | AAAA |
+------+------+

実はLIKEでは、大文字、小文字どちらも指定してしまいます。LIKEでアルファベットを扱う場合この点に注意しましょう。

例えばmysqlでの解決方法

この問題の解決方法は、環境ごとに違います。

今回は一例として、mysqlでの解決方法を載せておきます。mysqlでの解決方法はBINARYを使用する方法です。

実行命令:

SELECT * FROM user WHERE name LIKE BINARY "%a%";

実行結果:

+------+------+
| id   | name |
+------+------+
|    5 | aaaa |
+------+------+

これで比較できていますね!

「正規表現」でもっと複雑に検索!

使用している環境によって、名称が変わるため今回は省略しますが…

「正規表現」ならば、さらに細かく条件を指定することが可能です。

もし、さらに条件を絞る必要が出てきた場合は学んでみてください。需要が高ければそのうち、記事にしてリンクをここに載せたいと思います。

まとめ

今回はLIKEについて見てきました。

文字列を扱う上で非常に有用な機能ですね。キーになるのはワイルドカード文字です。

% ・・・ 0文字以上の任意の文字列
_ ・・・ 任意の1文字

ぜひ覚えておきましょう。

また曖昧検索の速度は基本的に遅いです。あまり大規模な範囲の検索には向かいないことも覚えておいてください。

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次