【SQL】LIKE演算子であいまい検索をする

SQL

こんにちは、かつコーチです。
「名前に“田中”を含む人を探したい」「メールアドレスが“gmail.com”で終わる人を探したい」という場面、実務でよくありますよね。
今回は、こうしたあいまい検索(完全一致ではなく部分的に一致する文字列を探す検索)を実現するLIKE演算子の使い方を解説します。

LIKE演算子とは?

ワイルドカードで部分一致を表現する

LIKEは、ワイルドカード(任意の文字列や1文字を表す特殊記号)と組み合わせて、部分一致検索を行うための演算子です。
MySQLで使うワイルドカードは主に2種類です。

記号意味
%0文字以上の任意の文字列
_任意の1文字

=が完全一致にしか使えないのに対し、LIKEは「含む」「〜で始まる」「〜で終わる」といった柔軟な検索ができます。

なぜあいまい検索が必要なのか

ユーザーが入力する検索キーワードは、表記ゆれや部分入力を含むことがほとんどです。
「田中」で検索したユーザーに「田中太郎」「山田田中子」も表示したい、といったニーズに=だけでは対応できません。
LIKEを使うことで、こうした柔軟な検索体験を提供できます。

基本の書き方

部分一致(前方一致・後方一致・中間一致)

%の位置によって、一致のパターンを使い分けられます。

-- 中間一致:文字列のどこかに「田中」を含む
SELECT name FROM users WHERE name LIKE '%田中%';

-- 前方一致:「田中」で始まる
SELECT name FROM users WHERE name LIKE '田中%';

-- 後方一致:「太郎」で終わる
SELECT name FROM users WHERE name LIKE '%太郎';

例えば、メールアドレスがGmailのユーザーだけを抽出したい場合は、後方一致を使います。

SELECT name, email
FROM users
WHERE email LIKE '%@gmail.com';

任意の1文字を指定する(アンダースコア)

_は1文字だけを表すワイルドカードです。
郵便番号や商品コードのように、桁数が決まっている文字列の一部だけを曖昧にしたいときに使います。

-- 「item_001」〜「item_009」のような、1桁だけ異なるコードを検索
SELECT product_code FROM products WHERE product_code LIKE 'item_00_';

つまずきやすい設定・注意点

前方一致でないとインデックスが効きにくい

LIKE '%キーワード%'のように先頭に%をつける中間一致は、便利な反面、インデックス(検索を高速化する仕組み)がうまく効かず、テーブルの全件を走査してしまうことがあります。

❌ Before(データ量が増えると遅くなりやすい)

SELECT * FROM users WHERE name LIKE '%田中%';

✅ After(可能な場面では前方一致に寄せる、または全文検索インデックスを検討する)

SELECT * FROM users WHERE name LIKE '田中%';

私が過去に担当した会員検索機能で、%キーワード%の中間一致検索を安易に実装したところ、会員数が10万件を超えたあたりから検索に数秒かかるようになり、問い合わせ調査で発覚したことがあります。
このときは、インデックス設計を見直すか、MySQLの全文検索機能(FULLTEXT INDEX)への切り替えで対応しました。
中間一致検索を使う場合は、「データが増えたら遅くなる可能性がある」と最初から想定しておくと安心です。

特殊文字(%や_そのもの)を検索したいときはエスケープする

商品コードなどに%_という文字そのものが含まれる場合、そのままでは特殊記号として解釈されてしまいます。
その場合はバックスラッシュ(\)でエスケープします。

-- 「20%OFF」という文字列を検索したい場合
SELECT * FROM campaigns WHERE title LIKE '%20\%OFF%';

応用・一歩先の使い方

大文字・小文字の扱いに注意する

MySQLのデフォルト設定(多くの場合utf8mb4_general_ciなどの照合順序)では、LIKEは大文字・小文字を区別しません。
「Apple」を検索すると「apple」もヒットします。
大文字・小文字を厳密に区別したい場合は、BINARYキーワードを使うか、照合順序をcase-sensitiveなものに変更する必要があります。

SELECT * FROM products WHERE BINARY name LIKE 'Apple%';

NOT LIKEで除外する

前回の記事で紹介したNOTと組み合わせれば、特定のパターンを除外する検索もできます。

SELECT name, email
FROM users
WHERE email NOT LIKE '%@test.com';

テスト用アカウントを除外して集計したいときなど、実務でよく使うパターンです。

まとめ

この記事のポイント

  • LIKEはワイルドカード(%_)を使った部分一致検索に使う
  • %の位置で前方一致・後方一致・中間一致を使い分けられる
  • 先頭に%をつける中間一致は、データ量が増えると検索が遅くなりやすい
  • %_自体を検索したいときはエスケープが必要

次に読むべき記事

  • SQL 比較演算子とAND・OR・NOTの使い方
  • SQL IN・BETWEENで複数条件・範囲を指定する
  • SQL インデックスとは?なぜ検索が速くなるのか

タグ: SQL, 初心者向け, 基本文法

タイトルとURLをコピーしました