メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
= は値全体に一致させます。LIKE はパターンに一致させるので、ある単語で 始まるタイトル、ある単語で終わるタイトル、特定の形をしたタイトルを求める ことができます。 始める前に mysql -u root -p sakila でクライアントを開いてください。

LIKE の仕組み

PATTERN_TEXT を一致させるパターンに置き換えます。パターンは普通のテキストに 2 つの特殊文字を加えたものです。 パターン内のそれ以外の文字は、その文字自身に一致します。% も _ も含まない パターンは = とほぼ同じように振る舞います。両者が分かれるのは末尾の空白です。 utf8mb4_general_ci のような PAD SPACE 照合順序では、'a ' = 'a' は真で 'a ' LIKE 'a' は偽です。NO PAD 照合順序(すべての utf8mb4_0900 照合順序が そうです)では、どちらも偽です。

例

  1. 前方一致

  1. 後方一致

  1. 決まった文字数

J の後の 3 つのアンダースコアは、ちょうど 4 文字の名前を求めます。
JOHNNY はリストにありません。J___ は 4 文字に一致し、それ以上には一致 しないからです。

  1. 一致しない

ここでは LIKE は大文字と小文字を区別しない

同じパターンを小文字で書いても同じ行が返ります。
これは LIKE のルールではありません。列のルールです。列の照合順序が、2 つの 文字列を等しいとみなすかどうかを決めます。Sakila の照合順序は大文字と小文字を 区別せず、MySQL のデフォルトも同様です。 大文字と小文字の区別のレッスンでは、列を確認する 方法と、大文字と小文字を区別する一致を求める方法を示しています。

% や _ そのものに一致させる

検索テキスト内の % は、特に指定しない限りワイルドカードです。ESCAPE は その直後の文字の特殊な意味を打ち消す文字を指定するので、パターンで本物の パーセント記号を求めることができます。
a%b が axxb に一致したのは、% が xx を表したからです。a!%b は a と b の間にパーセント記号そのものを求めましたが、axxb にはそれがありません。
アンダースコアも同じように働きます。
データに含まれていないと確信できる文字なら、どれでも使えます。ESCAPE が なければバックスラッシュが次の文字をエスケープするので、'a\%b' は同じ 意味になります。この近道は、サーバーの sql_mode に NO_BACKSLASH_ESCAPES が あると使えなくなりますが、ESCAPE はどちらでも使えます。

先頭の % はコストが高い

LIKE 'ACADEMY%' は列のインデックスを使えます。すべての一致が同じ既知の テキストで始まり、インデックスはソートされた順に保持されているので、サーバーは その部分に直接飛べるからです。LIKE '%GOLDFINGER' には出発点がありません。 一致はどこから始まってもよいので、サーバーは列のすべての値を読み、1 つずつ テストします。2 つのクエリに EXPLAIN をかけると違いが分かります。推定行数が 1 に対して 1,000 です。 1,000 本の映画では誰も気づきません。大きなテーブルでは、ルックアップとフル スキャンの差になります。大規模にテキストの内部を検索する必要があるときは、 別の道具が適しています。 MySQL の全文検索を参照してください。

まとめ

  • 値全体ではなくパターンに一致させるには LIKE を使います。
  • % は任意の長さの文字の並び、_ はちょうど 1 文字と読みます。
  • % や _ そのものに一致させるには、ESCAPE でエスケープ文字を指定します。
  • 大文字と小文字を区別するかどうかは、LIKE ではなく列の照合順序が決めます。
  • 大きなテーブルでは先頭の % を避けてください。どのインデックスも検索を絞り込めません。

関連項目