MySQL の LIKE
ここでは MySQL の LIKE と NOT LIKE 演算子についてご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の LIKE 演算子
MySQL の LIKE 演算子は、パターンにマッチする時に 1 (True) を返す演算子です。
WHERE 句 など、boolean(ブーリアン)を返す式が必要な箇所で LIKE 演算子を使うことによって、パターンにマッチする値をもつレコードを取得することができます。
MySQL の LIKE 演算子の基本
MySQL の LIKE 演算子は次のような構文で使用し、[A] が指定したパターンにマッチする場合は 1 (TRUE) を、そうでなければ 0 (FALSE) を返します。
[A] LIKE パターン [ESCAPE 'エスケープ文字']
パターンの部分で一番良く使うワイルドカード文字は % で、0 以上の文字列にマッチします。
ワイルドカード文字 _(アンダースコア)は、任意の 1 文字にマッチします。
[ESCAPE 'エスケープ文字'] の部分はオプショナルです。
エスケープ文字は、値の中に % や _ が入っている時にマッチさせたい時に使えます。
デフォルトのエスケープ文字は \ で、例えば % 1 文字にマッチさせたい時は \% のように指定します。
他の文字をエスケープ文字列にしたい時に ESCAPE 'エスケープ文字' でエスケープ文字を指定します。
MySQL の LIKE で 前方一致検索
LIKE 演算子を使って、前方一致で検索したい時は [A] LIKE '文字列%' のように指定します。
それでは LIKE 演算子を使って前方一致検索をしてみましょう。
次のような students テーブルがあります。
この students テーブルから first_name が Y で始まる学生のデータを取得したい時は次のようにできます。
SELECT *
FROM students
WHERE first_name LIKE 'Y%';
[実行結果]
first_name が Y で始まる学生のデータが取得できていますね。
MySQL の LIKE で 後方一致検索
LIKE 演算子を使って、後方一致で検索したい時は [A] LIKE '%文字列' のように指定します。
例えば、students テーブルから first_name が a で終わる学生のデータを取得したい時は次のようにできます。
SELECT *
FROM students
WHERE first_name LIKE '%a';
[実行結果]
first_name が a で終わる学生のデータが取得できています。
MySQL の LIKE で 部分一致検索
LIKE 演算子を使って、部分一致で検索したい時は [A] LIKE '%文字列%' のように指定します。
例えば、students テーブルから first_name に u が入っている学生のデータを取得したい時は次のようにできます。
SELECT *
FROM students
WHERE first_name LIKE '%u%';
[実行結果]
first_name に u が入っている学生のデータが取得できていますね。
MySQL の NOT LIKE 演算子
MySQL の NOT LIKE 演算子は LIKE 演算子と反対で、パターンにマッチしない時に 1 (True) を返す演算子です。
[A] NOT LIKE パターン [ESCAPE 'エスケープ文字']
例えば、students テーブルから first_name に u が入っていない学生のデータを取得したい時は次のようにできます。
SELECT *
FROM students
WHERE first_name NOT LIKE '%u%';
[実行結果]
first_name に u が入っていない学生のデータが取得できています。
NOT LIKE 演算子を使う時は、[A] が NULL の時はパターンにマッチしていなくても、評価結果は 1 (True) にはならず NULL になるのでご注意ください。
例えば、middle_name に u が入っていない学生のデータを取得したいとします。
ですが、次のように WHERE 句 で指定してしまうと、全員 middle_name に u が入ってないのに、middle_name が NULL のため、結果セットは 0 レコードになります。
SELECT *
FROM students
WHERE middle_name NOT LIKE '%u%';
[実行結果]
こういう時は、NOT LIKE の条件式に続けて OR middle_name IS NULL を追加するか、 IFNULL(middle_name, '') や COALESCE(middle_name, '') などで NULL の時は空白文字列に変換してから NOT LIKE を使う必要があります。
以上、MySQL の LIKE と NOT LIKE 演算子についてご説明しました。