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文字入っているユーザーのレコードが取得できます。
・`_`は任意の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を使って、あいまい検索する方法について書きました。
記事の内容をまとめると、下記のようになります。
・LIKEを使って、前方一致・後方一致・部分一致の確認ができた。
・「`%`」は任意の0文字以上
・「`_`」は任意の1文字
コメント