データベースを運用する上で、特定の文字列を含むデータを抽出する操作は非常に頻繁に行われます。
例えば、ユーザー名の一部しか分からない場合や、特定のドメインを持つメールアドレスをリストアップしたい場合などに、文字列の「部分一致」が必要になります。
SQLにおいて、このような曖昧な検索を実現するために使用されるのがLIKE句です。
LIKE句を適切に使い分けることで、効率的かつ柔軟なデータ抽出が可能になります。
本記事では、LIKE句の基本的な構文から、前方一致、後方一致、中間一致という3つの代表的なパターンについて詳しく整理していきます。
また、実務で重要となるパフォーマンスへの影響や、特殊な文字を検索する方法についても解説します。
SQLのLIKE句の基本構造
LIKE句は、主にSELECT文のWHERE句で使用される比較演算子の一種です。
通常のイコール演算子(=)が値の完全一致を条件とするのに対し、LIKE句はパターンマッチングによる比較を行います。
LIKE句を利用する際には、「ワイルドカード」と呼ばれる特殊な記号を組み合わせて検索条件を指定します。
SQLで標準的に使用されるワイルドカードには、主に以下の2種類があります。
| 記号 | 意味 |
|---|---|
| %(パーセント) | 0文字以上の任意の文字列を表す |
| _(アンダースコア) | 任意の1文字を表す |
これらの記号を文字列の中に配置することで、検索したい部分を柔軟に定義できます。
基本となる構文は以下の通りです。
-- LIKE句の基本構文
SELECT カラム名 FROM テーブル名 WHERE カラム名 LIKE 'パターン';
この「パターン」の部分にワイルドカードをどう配置するかによって、一致のルールが決定されます。
前方一致・後方一致・中間一致の使い分け
部分一致検索には、大きく分けて3つのパターンが存在します。
それぞれのパターンの特徴と、具体的な記述方法を確認していきましょう。
1. 前方一致検索
前方一致とは、検索したい文字列がデータの先頭にあるものを抽出する方法です。
ワイルドカードの % を検索キーワードの後ろに配置します。
例えば、名簿テーブルから名字が「田中」で始まる人を検索したい場合は、以下のように記述します。
-- 「田中」で始まる名前を検索する
SELECT * FROM users WHERE user_name LIKE '田中%';
このクエリを実行した結果の例は以下のようになります。
+----+-----------+
| id | user_name |
+----+-----------+
| 1 | 田中 太郎 |
| 2 | 田中 次郎 |
| 3 | 田中 幸子 |
+----+-----------+
「田中」そのものや、「田中」に続く文字があるデータがすべてヒットします。
一方で、「大田中」のように「田中」の前に文字があるデータは抽出されません。
2. 後方一致検索
後方一致とは、検索したい文字列がデータの末尾にあるものを抽出する方法です。
ワイルドカードの % を検索キーワードの前に配置します。
例えば、メールアドレスのドメインが「example.com」で終わるユーザーを抽出したい場合は、次のように記述します。
-- 「example.com」で終わるメールアドレスを検索する
SELECT * FROM users WHERE email LIKE '%example.com';
このクエリの実行結果は、以下のようになります。
+----+----------------------+
| id | email |
+----+----------------------+
| 10 | test@example.com |
| 15 | user123@example.com |
+----+----------------------+
後方一致は、ファイルの拡張子検索や住所の市区町村名の末尾検索など、特定の分類を抽出する際によく利用されます。
3. 中間一致検索
中間一致とは、データのどこかに指定した文字列が含まれているものをすべて抽出する方法です。
ワイルドカードの % を検索キーワードの前後両方に配置します。
例えば、商品名に「チョコ」というキーワードが含まれるものを検索する場合は、次のように記述します。
-- 商品名に「チョコ」を含むデータを検索する
SELECT * FROM products WHERE product_name LIKE '%チョコ%';
このクエリでは、「チョコレート」「生チョコ」「ミルクチョコ」といった全てのパターンがヒットします。
+----+--------------------+
| id | product_name |
+----+--------------------+
| 5 | チョコレートケーキ |
| 8 | 生チョコサンド |
| 12 | 濃厚ミルクチョコ |
+----+--------------------+
中間一致は非常に強力な検索手法であり、Webサイトのフリーワード検索機能などで最も頻繁に使用されます。
パフォーマンス上の注意点とインデックスの影響
LIKE句を使用する際、エンジニアが最も注意しなければならないのが検索スピード(パフォーマンス)です。
データベースには検索を高速化するための「インデックス(B-treeインデックス)」という仕組みがあります。
しかし、LIKE句の書き方によっては、このインデックスが正しく機能しなくなることがあります。
前方一致はインデックスが効く
原則として、前方一致検索(キーワード%)はインデックスを利用可能です。
インデックスは辞書のように並んでいるため、最初の文字が分かれば探すべき範囲を限定できるからです。
大量のデータを検索する場合でも、前方一致であれば高速なレスポンスが期待できます。
中間一致と後方一致はフルスキャンになる
一方で、中間一致(%キーワード%)や後方一致(%キーワード)はインデックスが効きません。
文字列の途中や最後がどうなっているかは、最初からすべてのデータを読み込まなければ判断できないためです。
これをデータベースの用語で「フルスキャン(全件走査)」と呼びます。
データ件数が数百万件、数千万件と増えていくと、中間一致検索は極端に動作が重くなり、システム全体に負荷をかける原因となります。
パフォーマンス対策の考え方
大規模なシステムで中間一致検索が必要な場合は、以下のような対策を検討するのが一般的です。
- 全文検索エンジン(ElasticsearchやAlgoliaなど)を導入する。
- データベース固有のフルテキストインデックス機能(MySQLのFULLTEXTインデックスなど)を利用する。
- 検索条件に必ず他のインデックスが効く項目(日付やカテゴリIDなど)を組み合わせる。
単純なLIKE句だけで解決しようとせず、データの規模に合わせた設計が求められます。
特殊なケースにおけるLIKE句の使い方
実務では、単に文字列を検索するだけでなく、少し複雑な条件が必要になるケースがあります。
ここでは、「1文字だけの検索」と「特殊文字自体の検索」について解説します。
アンダースコアを使った1文字マッチング
% が0文字以上の任意の文字列を表すのに対し、_(アンダースコア)は正確に1文字分を表します。
例えば、「3文字のIDで、最後がAで終わるもの」を検索したい場合は以下のように書きます。
-- 3文字で最後がAの値を検索する
SELECT * FROM master_table WHERE code LIKE '__A';
この場合、「A0A」や「BCA」はヒットしますが、「BA」や「ABCDA」はヒットしません。
ワイルドカード自体を検索する(エスケープ)
もし、データの中に実際に「%」や「_」という記号が含まれており、それを検索したい場合はどうすれば良いでしょうか。
そのまま LIKE '%50%%' と書くと、データベースは % をワイルドカードとして解釈してしまいます。
これを回避するために使用するのがESCAPE(エスケープ)キーワードです。
-- 「50%」という文字列を含むデータを検索する(バックスラッシュをエスケープ文字に指定)
SELECT * FROM sales WHERE discount_rate LIKE '%50\%%' ESCAPE '\';
この例では、\ の直後にある % はワイルドカードではなく、単なる文字の「%」として扱われます。
否定の検索:NOT LIKE句
特定のキーワードを含まないデータを抽出したい場合には、NOT LIKE を使用します。
例えば、管理者ユーザーを除外して一般ユーザーの一覧を取得したい場合に便利です。
-- ユーザー名に「admin」を含まないデータを取得する
SELECT * FROM users WHERE user_name NOT LIKE '%admin%';
基本的な使い方は LIKE と同じですが、条件が反転することに注意してください。
データベースごとの違い(大文字・小文字の区別)
LIKE句の挙動において、もう一つ注意が必要なのが「大文字と小文字の区別」です。
これは使用しているデータベース製品(DBMS)やその設定(照合順序/Collation)によって異なります。
| DBMS | デフォルトの挙動 |
|---|---|
| MySQL / MariaDB | 一般的に区別しない(設定による) |
| PostgreSQL | 区別する(区別したくない場合は ILIKE を使う) |
| Oracle Database | 区別する |
| SQL Server | 設定によるが、一般的に区別しない場合が多い |
PostgreSQLのように大文字小文字を厳密に区別する環境で、曖昧に検索したい場合は ILIKE 演算子を使用するのが一般的です。
-- PostgreSQLで大文字小文字を区別せずに検索する
SELECT * FROM users WHERE email ILIKE '%TEST%';
これにより、「test@example.com」も「TEST@example.com」も両方抽出することが可能になります。
まとめ
SQLのLIKE句は、文字列の部分一致検索を行うための強力なツールです。
前方一致、後方一致、中間一致の3つのパターンを、ワイルドカードの配置場所によって自在にコントロールできます。
しかし、非常に便利な反面、中間一致や後方一致はインデックスが効かないという特性を持っています。
そのため、大量のデータを扱うテーブルでLIKE句を多用する際は、実行速度に十分注意を払う必要があります。
適切なワイルドカードの使用法とパフォーマンスの特性を理解して、効率的なデータベース操作を実現しましょう。
