SQLを利用してデータベースから特定の情報を抽出する際、完全に一致するデータだけでなく、特定のキーワードを含むデータを検索したいケースは非常に多くあります。
このような「あいまい検索」を実現するために欠かせないのが、LIKE演算子です。
LIKE演算子を正しく使いこなすことで、ユーザー検索や商品管理、ログ解析といった幅広い実務シーンでの効率が飛躍的に向上します。
本記事では、LIKE演算子の基本的な使い方から、ワイルドカードの組み合わせ、パフォーマンスを意識した実践的な活用テクニックまで詳しく解説します。
2026年現在の開発現場でも必須となる知識を整理し、SQLスキルの向上を目指しましょう。
LIKE演算子の基本概念と構文
SQLのLIKE演算子は、WHERE句と組み合わせて使用される比較演算子の一種です。
数値の大小を比較する不等号や、完全一致を判定する「=」演算子とは異なり、文字列のパターンマッチングを行う役割を持ちます。
例えば、「名前が『山』で始まる人」や「メールアドレスに『@gmail.com』が含まれる人」といった条件指定が可能になります。
基本的な構文は以下の通りです。
-- 基本的なLIKE演算子の構文
SELECT カラム名
FROM テーブル名
WHERE カラム名 LIKE '検索パターン';
検索パターンの中には、通常の文字に加えて「ワイルドカード」と呼ばれる特殊な記号を配置します。
このワイルドカードの置き方によって、検索の挙動が大きく変わる点がLIKE演算子の最大の特徴です。
2種類のワイルドカードとその役割
LIKE演算子では、主に2種類のワイルドカード文字を使用してパターンを定義します。
それぞれの特性を理解することが、思い通りの検索結果を得るための第一歩となります。
% (パーセント): 0文字以上の任意の文字列
「%」は、0文字以上の任意の文字列にマッチするワイルドカードです。
文字数が決まっていない場合や、特定の文字が含まれているかどうかを調べたい場合に多用されます。
例えば、「A%」と指定すれば、「A」「Apple」「Amazon」など、Aから始まるすべての文字列にヒットします。
_ (アンダースコア): 任意の1文字
「_」は、ちょうど1文字の任意の文字にマッチするワイルドカードです。
「%」とは異なり、文字数を厳密に指定したい場合に非常に便利です。
例えば、「第_回」と指定すれば、「第1回」や「第2回」にはマッチしますが、「第10回」にはマッチしません。
ワイルドカードの比較表
それぞれのワイルドカードの違いを以下の表にまとめました。
| 記号 | 意味 | 使用例 | マッチする例 |
|---|---|---|---|
| % | 0文字以上の任意の文字列 | ‘SQL%’ | SQL, SQLServer, SQL入門 |
| _ | 任意の1文字 | ‘データ_’ | データ1, データA, データ集 |
実務で役立つ検索パターンの使い分け
LIKE演算子を活用する際、ワイルドカードをどの位置に置くかによって検索の種類が3つに分類されます。
これらは「前方一致」「後方一致」「部分一致」と呼ばれ、用途に応じて使い分ける必要があります。
前方一致検索
文字列の先頭が特定のパターンで始まるデータを検索する方法を前方一致と呼びます。
ワイルドカードの「%」を検索キーワードの最後に配置します。
「田中」から始まるユーザーを検索する例を見てみましょう。
-- 名字が「田中」で始まるユーザーを検索
SELECT * FROM users
WHERE user_name LIKE '田中%';
id | user_name
---+----------
1 | 田中 太郎
2 | 田中 次郎
3 | 田中 花子
前方一致は、住所の都道府県検索や、製品番号のプレフィックス検索などで頻繁に利用されます。
後方一致検索
文字列の末尾が特定のパターンで終わるデータを検索する方法を後方一致と呼びます。
ワイルドカードの「%」を検索キーワードの最初に配置します。
ドメイン名が「.jp」で終わるメールアドレスを検索する例を挙げます。
-- ドメインが「.jp」のメールアドレスを検索
SELECT * FROM contacts
WHERE email LIKE '%.jp';
id | email
---+------------------
5 | info@example.jp
8 | support@test.jp
ファイルの拡張子検索や、特定の役職で終わる名前の検索に役立ちます。
部分一致検索
文字列のどこかに特定のパターンが含まれているデータを検索する方法を部分一致と呼びます。
ワイルドカードの「%」で検索キーワードを前後から囲みます。
商品名の中に「ノート」という単語が含まれる商品を検索する例です。
-- 商品名に「ノート」を含むデータを検索
SELECT * FROM products
WHERE product_name LIKE '%ノート%';
id | product_name
---+------------------
10 | 事務用ノート
11 | ノートパソコン
25 | A5サイズノート
自由入力されたテキストデータから特定のキーワードを探し出す際に最も強力な手法です。
特殊な文字の検索とエスケープ処理
検索したい文字列自体に「%」や「_」が含まれている場合、それらはワイルドカードとして認識されてしまいます。
これを回避して、記号そのものを文字として検索するためにはエスケープ処理が必要です。
SQLでは「ESCAPE」句を使用して、エスケープ用の文字を任意に定義できます。
-- 「10%」という文字列そのものを検索したい場合
-- 一般的に「$」や「/」をエスケープ文字に指定します
SELECT * FROM sales_data
WHERE discount_rate LIKE '10$%' ESCAPE '$';
このクエリでは、$の直後にある%がワイルドカードではなく、単なる「%」という文字として扱われます。
データの中に記号が含まれる可能性がある場合は、必ずこのエスケープ処理を考慮するようにしましょう。
NOT LIKEによる否定検索
特定のパターンに一致「しない」データを抽出したい場合は、NOT LIKEを使用します。
除外条件を設定することで、より精度の高いデータ抽出が可能になります。
-- 管理者(admin)以外のアカウントを抽出
SELECT * FROM accounts
WHERE login_id NOT LIKE 'admin%';
不要なノイズデータを取り除きたいシーンなどで非常に有効な手段です。
パフォーマンス上の注意点と最適化
LIKE演算子は非常に便利ですが、大量のデータを扱うデータベースにおいてはパフォーマンスへの影響に注意が必要です。
特にワイルドカードの使い方は、検索スピードを左右する大きな要因となります。
インデックスが効くのは前方一致のみ
多くのデータベース(RDBMS)において、B-treeインデックスが有効に活用されるのは「前方一致」のみです。
「%」を先頭に置く後方一致や部分一致では、インデックスが機能しません。
その結果、テーブルの全レコードを一行ずつチェックする「フルスキャン」が発生し、数百万件規模のデータではクエリが非常に重くなります。
大量データに対する対策
大規模なシステムで部分一致検索を高速化したい場合は、以下の代替案を検討することが一般的です。
- 全文検索エンジン (Elasticsearchなど) の活用: 大量のテキストデータを高速に検索するために特化した仕組みを導入します。
- データベース固有の全文検索機能: PostgreSQLの「pg_trgm」拡張や、MySQLの「FULLTEXT」インデックスなどを利用します。
- 正規化の検討: 頻繁に検索するキーワードを別のカラムに切り出し、完全一致で検索できるようにデータ構造を見直します。
大文字・小文字の区別について
LIKE演算子で検索を行う際、大文字と小文字を区別するかどうかは、使用しているデータベースや設定(照合順序)によって異なります。
例えば、MySQLではデフォルトで大文字と小文字を区別せずに検索する設定(Case-Insensitive)が多いです。
一方で、PostgreSQLではLIKE演算子は厳密に区別を行い、区別したくない場合はILIKE演算子を使用するという違いがあります。
-- PostgreSQLで大文字小文字を無視して検索
SELECT * FROM items
WHERE item_code ILIKE 'abc%';
開発環境と本番環境で挙動が異ならないよう、利用している環境の仕様を事前に確認しておくことが重要です。
まとめ
SQLのLIKE演算子は、柔軟なデータ抽出を実現するための基本的かつ不可欠なツールです。
ワイルドカードの「%」と「_」を正しく組み合わせることで、多様なあいまい検索が可能になります。
しかし、便利な一方で、部分一致検索などはインデックスが効かずパフォーマンスを低下させるリスクも孕んでいます。
実務においては、検索の利便性とシステムの処理速度のバランスを考慮し、最適なパターンを選択することが求められます。
まずは基本となる前方一致・後方一致・部分一致の使い分けをマスターし、徐々にエスケープ処理やインデックスの仕組みについても理解を深めていきましょう。
LIKE演算子を自由自在に操れるようになれば、複雑なデータ分析やアプリケーション開発においても大きな武器となるはずです。
