SQL LIKE: 前方・後方・部分一致で絞り込む

SQL LIKE は、文字列列を SQL ワイルドカード付きのパターンと照合して行を絞り込みます。% は 0 文字以上、_ はちょうど 1 文字に一致します。SQL の前方一致フィルター('prefix%')、後方一致フィルター('%suffix')、部分一致フィルター('%term%')で使います。

前方一致の SQL LIKE の例

出力:

ここに出力が表示されます...

出力:

+-------+----------------+
| name  | email          |
+-------+----------------+
| Alice | [email protected] |
| Alina | [email protected] |
+-------+----------------+
2 row(s)

LIKE ‘Al%’ が行を絞り込む仕組み

  1. CREATE TABLEINSERTcustomers に 4 行を投入します。
  2. name LIKE 'Al%'Al で始まる名前だけを残します。% は残りの文字列に一致します。
  3. name に通常の B-tree インデックスがあれば、'Al%' のような前方一致パターンはインデックス範囲走査を使えます。

SQL LIKE 演算子とは?

SQL LIKE は文字列列をパターンと比較します。片側または両側に % を付けない限り、LIKE は部分文字列ではなく文字列全体に一致します。ワイルドカードなしの LIKE 'text'= 'text' と同じ挙動です。列が NULL の場合、LIKENOT LIKE は unknown になり、WHERE でその行は除外されます。

ワイルドカードパターン: %, _, ESCAPE

%_ で多くの絞り込み要件を満たせます。SQL WHERE のワイルドカードパターンでは、固定文字列に %_ を組み合わせて前方一致、後方一致、部分一致を表現します。

パターン意味一致例
'Al%'Al で始まるAlice, Alina
'%org'org で終わる[email protected]
'%mail%'mail を含む[email protected]
'_ob'任意の 1 文字 + obBob

文字どおりの % または _ を検索するには、ESCAPE 句でエスケープ文字を定義します。

SELECT label FROM metrics
WHERE label LIKE '%100\%%' ESCAPE '\';

\ をエスケープ文字として宣言しているため、\% はワイルドカードではなく実際の % に一致します。

SQL NOT LIKE: 一致する行を除外する

NOT LIKE は一致条件を反転します。SQL の NOT LIKE クエリは、パターンに一致しないすべての行を返します。

SELECT name FROM customers
WHERE email NOT LIKE '%corp%';

このクエリは Bob と Carol を返します。つまり、メールアドレスに corp を含まない行です。列が NULL の行は LIKE と NOT LIKE のどちらでも除外されます。NULL も含めるには、OR column IS NULL を明示的に追加します。

SQL LIKE でよくある間違い

間違い: LIKE 'term' が部分一致になると思っている。

誤り:

WHERE name LIKE 'li'

正しい例:

WHERE name LIKE '%li%'

理由: LIKE は文字列全体に一致します。両側に % がないと、li と完全一致する場合だけ一致します。

間違い: ESCAPE を使わずに文字どおりの % を検索する。

誤り:

WHERE discount LIKE '100%'

正しい例:

WHERE discount LIKE '100\%' ESCAPE '\'

理由: ESCAPE がないと % はワイルドカードとして働き、1001000100USD、そして 100 で始まるその他の値にも一致します。

LIKE の性能: 前方一致と先頭ワイルドカード

通常の B-tree インデックスでは、LIKE 'abc%' はインデックス範囲走査を使えます。'%abc''%abc%' のように % で始まるパターンはインデックスシークを妨げるため、エンジンは一般により多くの行を走査します。

大規模な部分文字列検索では、LIKE '%term%' ではなく全文検索(FTS)を使います。

方言ごとの大文字小文字の扱い

LIKE の大文字小文字の扱いはデータベースエンジンごとに異なります。

データベースLIKE の既定動作
PostgreSQL大文字小文字を区別。区別しない比較は ILIKE
MySQL列の照合順序に依存(多くは区別しない)
SQLite既定では ASCII 文字で大文字小文字を区別しない

SQLite では、ASCII 範囲では LIKE 'al%'LIKE 'Al%' は同じように扱われます。PRAGMA case_sensitive_like = ON を設定すると、厳密な大文字小文字一致に切り替わります。PostgreSQL の ILIKE は SQL 標準にはない拡張です。

列を LOWER() で包む方法は方言をまたいで使えますが、インデックスを使えなくなります。性能が重要なら、大文字小文字を区別しない照合順序か、方言固有の演算子を優先します。