Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
LIKE
文字列の部分一致や前方一致・後方一致などのパターンマッチング検索を行う演算子です。
構文
-- パターンに一致する行を取得します。 SELECT 列名 FROM テーブル名 WHERE 列名 LIKE 'パターン'; -- パターンに一致しない行を取得します。 SELECT 列名 FROM テーブル名 WHERE 列名 NOT LIKE 'パターン'; -- ESCAPEでワイルドカード文字をエスケープします。 SELECT 列名 FROM テーブル名 WHERE 列名 LIKE 'パターン' ESCAPE 'エスケープ文字';
ワイルドカード一覧
| ワイルドカード | 概要 |
|---|---|
| % | 0文字以上の任意の文字列に一致します。前方一致・後方一致・部分一致のすべてに使用できます。 |
| _(アンダースコア) | 任意の1文字に一致します。文字数が決まっている場合に使用します。 |
| NOT LIKE | パターンに一致しない行を取得します。 |
| ESCAPE '文字' | 指定した文字をエスケープ文字として扱い、ワイルドカードをリテラル文字として検索できます。 |
サンプルコード
-- 氏名が「田」で始まる社員を取得します(前方一致)。 SELECT name FROM employees WHERE name LIKE '田%'; -- 氏名が「子」で終わる社員を取得します(後方一致)。 SELECT name FROM employees WHERE name LIKE '%子'; -- 氏名に「中」を含む社員を取得します(部分一致)。 SELECT name FROM employees WHERE name LIKE '%中%'; -- 氏名が3文字の社員を取得します(_は1文字に一致)。 SELECT name FROM employees WHERE name LIKE '___'; -- メールアドレスが「example」以外のドメインの社員を取得します。 SELECT name, email FROM employees WHERE email NOT LIKE '%@example.com'; -- 商品名に「%OFF」を含む商品を検索します(%をリテラルとして扱います)。 SELECT product_name FROM products WHERE product_name LIKE '%\%OFF' ESCAPE '\';
実行結果
-- SELECT name FROM employees WHERE name LIKE '田%'; の結果例 -- +----------+ -- | name | -- +----------+ -- | 田中太郎 | -- | 田村美咲 | -- +----------+
データベース別の書き方
『LIKE』の基本構文(『%』『_』ワイルドカード)は主要なデータベースで共通して使用できます。
SELECT name FROM employees WHERE name LIKE '田%';
大文字・小文字の区別はデータベースによって異なります。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 '^[田中]'; -- PostgreSQL(~演算子) SELECT name FROM employees WHERE name ~ '^[田中]'; -- Oracle(REGEXP_LIKE関数) SELECT name FROM employees WHERE REGEXP_LIKE(name, '^[田中]');
概要
『LIKE』はテキスト検索でよく使用される演算子です。『%』は任意の長さの文字列、『_』は任意の1文字に一致します。
『LIKE』を前方一致(例:『田%』)で使用した場合はインデックスが有効に機能しますが、中間一致(例:『%田%』)や後方一致(例:『%田』)ではインデックスが使用されずテーブルフルスキャンが発生します。大量データのあるテーブルでの使用には注意してください。
MySQLでは大文字・小文字を区別しない照合順序(ci: case insensitive)がデフォルトのため、『LIKE 'abc%'』と『LIKE 'ABC%'』は同じ結果になります。大文字・小文字を区別したい場合は『BINARY』キーワードを使用します。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。