MySQLで特定のキーワードを含むデータだけを抽出する


データベースを利用したWebアプリケーションを開発していく中で、テーブル内の情報から特定のキーワードで文言検索をかける仕様をデザインに追加する時があります。
検索窓やカテゴリーを選択させて検索させる場合でしょうか。

そうした仕様にする場合は裏側で文字列を検索するSQL文を発行して処理を実行します。

ここではMySQLで特定のキーワードを含むデータだけを抽出する方法をご紹介します。

LIKE演算子


LIKE演算子は指定した文字列データのパターンマッチングを行う際に利用します。
LIKE演算子ではいろんなパターンの抽出方法がありますが、ここではワイルドカードを使った基本的な使い方を紹介します。

ワイルドカードとして「%(パーセント)」と「_(アンダースコア)」を利用します。

% 任意の文字列
_ 任意の1文字


WHEREで指定したフィールドからLIKE演算子して文字列を抽出するサンプルになります。

「%」は任意の文字列を意味しますので末尾の一致、前方の一致、部分一致などで使われます。

//末尾一致検索の場合
SELECT * FROM テーブル名 WHERE フィールド名 LIKE '%文字列'
 
//前方一致検索の場合
SELECT * FROM テーブル名 WHERE フィールド名 LIKE '文字列%'
 
//部分一致検索(どこかに含まれていれば良い)の場合
SELECT * FROM テーブル名 WHERE フィールド名 LIKE '%文字列%'
 
//jで始まりtで終わる任意の長さの文字列の場合
SELECT * FROM テーブル名 WHERE フィールド名 LIKE 'j%t'



最後の場合だとJavaScriptなどの文字列が抽出することができます。

「_」は任意の1文字を意味します。
ですのでアンダースコアを3つ、4つ並べて利用すれば、3文字、4文字分の任意の文字列が当てはまることになります。

//アンダースコアを2つ利用したjで始まりaで終わる4文字の文字列の場合
SELECT * FROM テーブル名 WHERE フィールド名 LIKE 'j__a'



この場合だとJavaなどの文字列が抽出することができます。

もし抽出する文字列以外にする場合は、LIKE演算子にNOTを追加することで実行できます。

SELECT * FROM テーブル名 WHERE フィールド名 NOT LIKE '文字列'



他にもワイルドカードをいろいろ組み合わせることでいろんなパターンを抽出することができます。

BINARY演算子


LIKE演算子のみだと大文字と小文字を区別しませんが、BINARY演算子を利用することで大文字と小文字を区別した抽出を行うことができます。

SELECT * FROM テーブル名 WHERE フィールド名 LIKE BINARY 'J%t';



この場合だと「JavaScript」は抽出されますが「javascript」は抽出されません。
もし大文字と小文字を正確に比較する場合にはLIKE演算子とBINARY演算子を一緒に利用してください。