LIKE
| 対応: | SQL-92(1992) |
|---|
文字列の部分一致や前方一致・後方一致などのパターンマッチング検索を行う演算子です。
構文
パターンに一致する行を取得します。
SELECT 列名 FROM テーブル名 WHERE 列名 LIKE 'パターン';
パターンに一致しない行を取得します。
SELECT 列名 FROM テーブル名 WHERE 列名 NOT LIKE 'パターン';
ESCAPEでワイルドカード文字をエスケープします。
SELECT 列名 FROM テーブル名 WHERE 列名 LIKE 'パターン' ESCAPE 'エスケープ文字';
ワイルドカード一覧
| ワイルドカード | 概要 |
|---|---|
| % | 0文字以上の任意の文字列に一致します。前方一致・後方一致・部分一致のすべてに使用できます。 |
| _(アンダースコア) | 任意の1文字に一致します。文字数が決まっている場合に使用します。 |
| NOT LIKE | パターンに一致しない行を取得します。 |
| ESCAPE '文字' | 指定した文字をエスケープ文字として扱い、ワイルドカードをリテラル文字として検索できます。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
メールアドレスが「user_a」で始まる社員を取得します(前方一致)。
sample_like.sql
SELECT name FROM employees WHERE email LIKE 'user_a%';
+--------+ | name | +--------+ | user_a | +--------+ 1 row in set
メールアドレスが「info」で終わる社員を取得します(後方一致)。
sample_like.sql
SELECT name FROM employees WHERE email LIKE '%info';
+--------+ | name | +--------+ | user_a | | user_c | | user_e | | user_b | +--------+ 4 rows in set
メールアドレスに「user_c」を含む社員を取得します(部分一致)。
sample_like.sql
SELECT name FROM employees WHERE email LIKE '%user_c%';
+--------+ | name | +--------+ | user_e | +--------+ 1 row in set
名前がちょうど6文字の社員を取得します(_は1文字に一致)。
sample_like.sql
SELECT name FROM employees WHERE name LIKE '______';
+--------+ | name | +--------+ | user_a | | user_c | | user_e | | user_b | +--------+ 4 rows in set
メールアドレスのユーザー名部分に「user_b」を含む社員を除外します(NOT LIKEで除外)。
sample_like.sql
SELECT name, email FROM employees WHERE email NOT LIKE 'user_b%';
+--------+------------------+ | name | email | +--------+------------------+ | user_a | user_a@wp-p.info | | user_e | user_c@wp-p.info | | user_b | user_d@wp-p.info | +--------+------------------+ 3 rows in set
メールアドレスに「_」(アンダースコア)そのものを含む行を検索します(_をリテラルとして扱います)。
sample_like.sql
SELECT name FROM employees WHERE email LIKE '%\_%' ESCAPE '\';
+--------+ | name | +--------+ | user_a | | user_c | | user_e | | user_b | +--------+ 4 rows in set
データベース別の書き方
『LIKE』の基本構文(『%』『_』ワイルドカード)は主要なデータベースで共通して使用できます。
SELECT name FROM employees WHERE email LIKE 'user_a%';
大文字・小文字の区別はデータベースによって異なります。MySQLはデフォルトで区別しません(照合順序が ci の場合)。PostgreSQLは区別するため、区別しない検索には『ILIKE』を使用します。
-- PostgreSQL(大文字・小文字を区別しないLIKE) SELECT name, email FROM employees WHERE email ILIKE '%@EXAMPLE.COM';
正規表現による高度なパターンマッチングは、データベースごとに異なる構文を使用します。
-- MySQL(REGEXP演算子) SELECT name FROM employees WHERE name REGEXP '^user_[ab]'; -- PostgreSQL(~演算子) SELECT name FROM employees WHERE name ~ '^user_[ab]';
概要
『LIKE』はテキスト検索でよく使用される演算子です。『%』は任意の長さの文字列、『_』は任意の1文字に一致します。
『LIKE』を前方一致(例:『user_a%』)で使用した場合はインデックスが有効に機能しますが、中間一致(例:『%user%』)や後方一致(例:『%info』)ではインデックスが使用されずテーブルフルスキャンが発生します。大量データのあるテーブルでの使用には注意してください。
MySQLでは大文字・小文字を区別しない照合順序(ci: case insensitive)がデフォルトのため、『LIKE 'abc%'』と『LIKE 'ABC%'』は同じ結果になります。大文字・小文字を区別したい場合は『BINARY』キーワードを使用します。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。