MySQLでLIKEを使って、あいまい検索を行う方法!サンプル5選

MySQL MySQL

MySQLでLIKEを使って、あいまい検索を行う方法について書いています。
SELECT文でデータを取得するときなどにLIKEを使用して、あいまい検索でレコードを絞ることができます。

公式ドキュメントでは、こちらのページにパターンマッチングということで記載がありました。
載せているSQLはMySQLのバージョン8.0.33で、動作を検証しました。

MySQLでLIKEを使って検索する

MySQLでLIKEを使って、あいまい検索するにはWHEREの後にカラムを指定して、LIKEでマッチする条件を記載します。
日本語で書くと、下記のような感じになります。

SELECT * FROM テーブル名 WHERE カラム名 LIKE パターン

指定したカラムに対して、LIKEでパターンを適用した結果が返ってきます。
実際にusersテーブルのnameカラムを指定して、前方一致させるパターンは下記になります。

SELECT * FROM users WHERE name LIKE 't%';

usersテーブルのnameカラムの値が「t」から始まるユーザーを検索しています。
%は任意の0文字以上です。
t」の後につけることで、「t」以降は任意の文字が続くユーザーを探しています。

パターンマッチで使う文字

%」のSQL例を記述しましたが、「_」を使うこともできます。
_」は任意の1文字です。

SELECT * FROM users WHERE name LIKE '_____';

上記のようにすると、nameカラムに5文字入っているユーザーのレコードが取得できます。

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

前方一致

前方一致させるには、最初に一致させたい文字を書いて、末尾に「%」を使います。
例えば、下記のようにSQLを書きます。

SELECT * FROM users WHERE name LIKE 'y%';

こうすると、nameカラムの値の先頭が「y」から始まるユーザーのレコードが取得できます。

後方一致

後方一致させるには、最後に一致させたい文字を書いて、先頭に「%」を使います。
例えば、下記のようにSQLを書きます。

SELECT * FROM users WHERE name LIKE '%ro';

こうすると、nameカラムの値の末尾が「ro」で終わるユーザーのレコードが取得できます。

部分一致

部分一致させるには、最初と最後に「%」を書いて、間に部分一致させたい文字を書きます。
例えば、下記のようにSQLを書きます。

SELECT * FROM users WHERE name LIKE '%o%';

こうすると、nameカラムの値に「o」を含んだユーザーのレコードが取得できます。
%」は任意の0文字以上なので、先頭と末尾に「o」がついているものも対象になります。

MySQLでLIKEを使ったサンプルSQL5選

実際にサンプルSQLを実行した結果を見ていきましょう。
5つのSQLを実際に動作させて、検証してみました。

テストデータ

こちらのusersテーブルを使います。

CREATE TABLE users (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(128),
  birthday DATE,
  PRIMARY KEY (id)
);

usersテーブルはユーザー情報が入っているテーブルです。
適当にレコードを追加してみました。レコードは下記になります。

id name birthday
1 rieko 1973-04-17
2 tomo 1989-10-01
3 naoko 1982-01-10
4 tokio 1993-12-15
5 mitimasa 1980-03-20
6 jiro 2000-01-01
7 koji 1975-07-28
8 shinji 1983-03-30

前方一致してみる

前方一致させてみます。
t」から始まる名前のユーザーを取得します。

SELECT * FROM users WHERE name LIKE 't%';

usersテーブルのnameカラムに対して条件をつけています。
t」から始まるユーザーのレコードを検索するように、パターンとして「t%」を指定しました。

そうすると、下記のように「t」から始まるユーザーレコードが2行取得できたことが確認できました。

mysql> SELECT * FROM users WHERE name LIKE 't%';
+----+-------+------------+
| id | name  | birthday   |
+----+-------+------------+
|  2 | tomo  | 1989-10-01 |
|  4 | tokio | 1993-12-15 |
+----+-------+------------+
2 rows in set (0.00 sec)

後方一致してみる

後方一致させてみます。
ユーザー名が「o」で終わるユーザーレコードを取得します。

SELECT * FROM users WHERE name LIKE '%o';

実行すると、下記のように「o」で終わるユーザーのレコードが取得できました。

mysql> SELECT * FROM users WHERE name LIKE '%o';
+----+-------+------------+
| id | name  | birthday   |
+----+-------+------------+
|  1 | rieko | 1973-04-17 |
|  2 | tomo  | 1989-10-01 |
|  3 | naoko | 1982-01-10 |
|  4 | tokio | 1993-12-15 |
|  6 | jiro  | 2000-01-01 |
+----+-------+------------+
5 rows in set (0.01 sec)

部分一致してみる

o」が名前に2つ入っているユーザーレコードを取得してみます。

SELECT * FROM users WHERE name LIKE '%o%o%';

こうすると、nameカラムの値に「o」が2つ入っているユーザーが取得できます。
%o%o%」というようにパターンを指定しています。間に「%」が入っているので「o」が2つ値にあるものとなります。

実行すると、下記のように対象のレコードが取得できました。

mysql> SELECT * FROM users WHERE name LIKE '%o%o%';
+----+-------+------------+
| id | name  | birthday   |
+----+-------+------------+
|  2 | tomo  | 1989-10-01 |
|  3 | naoko | 1982-01-10 |
|  4 | tokio | 1993-12-15 |
+----+-------+------------+
3 rows in set (0.00 sec)

任意の5文字のユーザーは?

名前カラムの値に5文字入っているユーザーを取得します。
何かの1文字は「_」なので、下記のようにSQLを記述することができます。

SELECT * FROM users WHERE name LIKE '_____';

実行すると、下記のようにnameカラムの値が5文字のレコードが取得できました。

mysql> SELECT * FROM users WHERE name LIKE '_____';
+----+-------+------------+
| id | name  | birthday   |
+----+-------+------------+
|  1 | rieko | 1973-04-17 |
|  3 | naoko | 1982-01-10 |
|  4 | tokio | 1993-12-15 |
+----+-------+------------+
3 rows in set (0.01 sec)

誕生日が1月のユーザーは?

DATE型のカラムに対しても、LIKEを使うことができます。
下記のように使うと、1月が誕生日のユーザーが取得できます。

SELECT * FROM users WHERE birthday LIKE '%-01-%';

usersテーブルのbirthdayカラムに対して、LIKEで誕生日が1月のユーザーを取得しました。
実行すると、下記のように対象が取得できました。

mysql> SELECT * FROM users WHERE birthday LIKE '%-01-%';
+----+-------+------------+
| id | name  | birthday   |
+----+-------+------------+
|  3 | naoko | 1982-01-10 |
|  6 | jiro  | 2000-01-01 |
+----+-------+------------+
2 rows in set (0.01 sec)

MySQLでLIKEを使って「あいまい」検索する方法まとめ

今回はMySQLでLIKEを使って、あいまい検索する方法について書きました。
記事の内容をまとめると、下記のようになります。

・MySQLでLIKEを使うことで、あいまい検索ができた。
・LIKEを使って、前方一致・後方一致・部分一致の確認ができた。
・「`%`」は任意の0文字以上
・「`_`」は任意の1文字

コメント

タイトルとURLをコピーしました