SQLの部分一致についてまとめています。
MySQLのサンプルデータベースEmployeesを使用しています。
SQLの部分一致は、likeを使う
SQLで文字列の部分一致を条件にするには、Where節でlikeとワイルドカード文字(%)を使います。
部分一致には、後方一致、前方一致、部分一致、中間一致の4パターンがあります。順に見て行きましょう。
後方一致
指定文字列で始まる文字列にマッチする指定方法です。例えば、以下はfirst_nameがAで始まるデータを抽出するサンプルです。
SELECT * FROM employees WHERE first_name like 'A%'; +--------+------------+------------+--------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+--------------+--------+------------+ | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10033 | 1956-11-14 | Arif | Merlo | M | 1987-03-18 | | 10035 | 1953-02-08 | Alain | Chappelet | M | 1988-09-05 | | 10036 | 1959-08-10 | Adamantios | Portugali | M | 1992-01-03 | | 10039 | 1959-10-01 | Alejandro | Brender | M | 1988-01-19 | | 10059 | 1953-09-19 | Alejandro | McAlpine | F | 1991-06-26 | | 10062 | 1961-11-02 | Anoosh | Peyn | M | 1991-08-30 | | 10091 | 1955-10-04 | Amabile | Gomatam | M | 1992-11-18 | | 10094 | 1957-05-25 | Arumugam | Ossenbruggen | F | 1987-04-18 | | 10103 | 1953-11-26 | Akemi | Birch | M | 1986-12-02 | | 10120 | 1960-03-26 | Armond | Fairtlough | F | 1996-07-06 |
【関連記事】
▶sql likeを使ったサンプル集 likeは本当に遅いのか?
前方一致
指定文字列で終わる文字列にマッチする指定方法です。以下は、first_nameがmiで終わるデータを抽出するサンプルです。
mysql> SELECT * FROM employees WHERE first_name like '%mi'; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10051 | 1953-07-28 | Hidefumi | Caine | M | 1992-10-15 | | 10054 | 1957-04-04 | Mayumi | Schueller | M | 1995-03-13 | | 10103 | 1953-11-26 | Akemi | Birch | M | 1986-12-02 | | 10145 | 1956-03-30 | Akemi | Esposito | F | 1987-08-01 | | 10514 | 1963-04-03 | Tomofumi | McClure | M | 1992-04-29 | | 10878 | 1952-06-13 | Lakshmi | Deville | M | 1988-02-25 | | 10968 | 1961-03-19 | Lakshmi | Kolinko | M | 1985-08-11 | | 10976 | 1963-01-27 | Hitomi | Valette | F | 1992-12-06 |
部分一致
文字列の一部に指定文字列が含まれる場合にマッチする指定方法です。以下は、first_nameにraが含まれるデータを抽出するサンプルです。
mysql> SELECT * FROM employees WHERE first_name like '%ra%'; +--------+------------+---------------+----------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+---------------+----------------+--------+------------+ | 10021 | 1960-02-20 | Ramzi | Erde | M | 1988-02-10 | | 10025 | 1958-10-31 | Prasadram | Heyers | M | 1987-08-17 | | 10037 | 1963-07-22 | Pradeep | Makrucki | M | 1990-12-05 | | 10090 | 1961-05-30 | Kendra | Hofting | M | 1986-03-14 | | 10102 | 1959-11-04 | Paraskevi | Luby | F | 1994-01-26 | | 10115 | 1964-12-25 | Chikara | Rissland | M | 1986-01-23 | | 10124 | 1962-05-23 | Geraldo | Marwedel | M | 1991-09-05 | | 10168 | 1964-09-11 | Dharmaraja | Stassinopoulos | M | 1986-12-06 | | 10177 | 1954-11-08 | Pragnesh | Iisaka | M | 1993-02-06 |
この指定の場合、raで始まる場合も、raで終わる場合も含めてデータを抽出します。
中間一致
部分一致とほぼ同じですが、指定文字列で始まる場合と、指定文字列で終わる場合を除外します。
以下は、first_nameにraを含みかつ、始まりと終わりがraではないものにマッチします。
mysql> SELECT * FROM employees WHERE first_name like '_%ra%_'; +--------+------------+---------------+----------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+---------------+----------------+--------+------------+ | 10025 | 1958-10-31 | Prasadram | Heyers | M | 1987-08-17 | | 10037 | 1963-07-22 | Pradeep | Makrucki | M | 1990-12-05 | | 10102 | 1959-11-04 | Paraskevi | Luby | F | 1994-01-26 | | 10124 | 1962-05-23 | Geraldo | Marwedel | M | 1991-09-05 | | 10168 | 1964-09-11 | Dharmaraja | Stassinopoulos | M | 1986-12-06 | | 10177 | 1954-11-08 | Pragnesh | Iisaka | M | 1993-02-06 | | 10198 | 1953-05-28 | Pranav | Furedi | M | 1985-08-31 | | 10250 | 1958-08-12 | Serap | Etalle | M | 1992-08-30 | | 10297 | 1956-06-17 | Narain | Oaver | F | 1986-05-28 | | 10347 | 1953-10-03 | Pradeep | Kaminger | M | 1985-12-12 |
まとめ
- SQLで文字列の部分一致を指定するには、likeを使う
- 後方一致は、前方一致、後方一致、部分一致、中間一致が使用可能。
- 中間一致は、’_%文字列%_’と指定する