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 照合順序が
そうです)では、どちらも偽です。
例
- 前方一致
- 後方一致
- 決まった文字数
J の後の 3 つのアンダースコアは、ちょうど 4 文字の名前を求めます。
JOHNNY はリストにありません。J___ は 4 文字に一致し、それ以上には一致
しないからです。
- 一致しない
ここでは 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ではなく列の照合順序が決めます。 - 大きなテーブルでは先頭の
%を避けてください。どのインデックスも検索を絞り込めません。
関連項目
- REGEXP —
%と_では表せないパターン - 大文字と小文字の区別 — 小文字のパターンが一致した理由
- MySQL の文字列関数 — 比較する前にテキストを整形する
- MySQL の全文検索 — 大規模にテキストの内部を検索する