データベースを効率的に運用する上で、特定の文字列を含むデータを柔軟に検索する技術は欠かせません。

SQLの「LIKE演算子」を用いた部分一致検索は、ユーザー検索機能やデータ分析の現場で最も頻繁に利用される手法の一つです。

本記事では、ワイルドカードの基礎からパフォーマンスを意識した実務的なテクニックまでを詳しく解説します。

正確な構文と最適な検索パターンを理解することで、大規模なデータベースでも高速かつ正確なデータ抽出が可能になります。

LIKE演算子とワイルドカードの基本概念

SQLで部分一致検索を行う際には、LIKE演算子を使用するのが標準的な方法です。

この演算子は、比較対象の列が指定したパターンに一致するかどうかを判定するために用いられます。

LIKE演算子と組み合わせて使用されるのが、ワイルドカードと呼ばれる特殊な記号です。

ワイルドカードを活用することで、不特定の文字列や一文字だけの違いを表現できるようになります。

SQLで使用される主要なワイルドカード

標準的なSQLにおいて、部分一致検索に使用されるワイルドカードは主に2種類存在します。

一つは、0文字以上の任意の文字列を表す「%(パーセント)」です。

もう一つは、任意の1文字を表す「_(アンダースコア)」です。

これらの記号を検索キーワードのどこに配置するかによって、検索の挙動が大きく変化します。

ワイルドカード意味使用例
%0文字以上の任意の文字列'SQL%'(SQLで始まる全ての文字列)
_任意の1文字'S_L'(Sで始まりLで終わる3文字の文字列)

部分一致検索の3つの基本パターン

実務で利用される部分一致検索は、キーワードの配置によって「前方一致」「後方一致」「中間一致」の3種類に分類されます。

それぞれの特性を理解することは、検索精度の向上だけでなく、システムの処理負荷を抑えるためにも重要です。

前方一致検索(Forward Match)

前方一致検索は、検索キーワードが文字列の先頭にあるデータを抽出する手法です。

例えば、商品コードや顧客IDの特定のプレフィックス(接頭辞)を探す際に非常に有効です。

構文としては、キーワードの直後に%を記述します。

SQL
-- 「株式会社」で始まる顧客名を検索する例
SELECT customer_id, customer_name
FROM customers
WHERE customer_name LIKE '株式会社%';
実行結果
customer_id | customer_name
------------+----------------------
101        | 株式会社サンプル商事
105        | 株式会社データテック

前方一致検索は、多くの場合においてインデックスが適用されるため、実行速度が非常に速いという特徴があります。

後方一致検索(Backward Match)

後方一致検索は、文字列の末尾が指定したキーワードで終わるデータを抽出します。

メールアドレスのドメイン指定や、ファイル拡張子の検索などでよく利用されます。

構文としては、キーワードの直前に%を記述します。

SQL
-- ドメインが「.jp」で終わるメールアドレスを検索する例
SELECT user_id, email
FROM users
WHERE email LIKE '%.jp';
実行結果
user_id | email
--------+-----------------------
202     | taro@example.co.jp
210     | hanako@example.ne.jp

後方一致検索では、通常、標準的なB-treeインデックスが効果を発揮しません。

中間一致検索(Partial Match / Middle Match)

中間一致検索は、キーワードが文字列のどこかに含まれていれば一致とみなす最も柔軟な検索手法です。

ユーザーが入力したキーワードを含むデータを漏れなく抽出したい検索フォームなどで多用されます。

キーワードの前後を%で囲む形式で記述します。

SQL
-- 商品名に「スマート」という文字が含まれる商品を検索する例
SELECT product_id, product_name
FROM products
WHERE product_name LIKE '%スマート%';
実行結果
product_id | product_name
-----------+-------------------------
301        | スマートウォッチ A1
355        | 高性能スマートフォン X

中間一致検索は非常に便利ですが、大量のデータセットに対して実行すると、検索パフォーマンスが著しく低下するリスクがあります。

パフォーマンス最適化とインデックスの重要性

SQLのクエリパフォーマンスを左右する最大の要因は、インデックスが適切に使用されているかどうかです。

LIKE演算子を使用する場合、その記述方法によってインデックスが効くかどうかが決まります。

インデックスが効くパターンと効かないパターン

多くのリレーショナルデータベース(RDBMS)で使用されるB-treeインデックスは、文字列を左から順に評価して検索を行います。

そのため、前方一致検索('keyword%')ではインデックスが正常に動作します。

一方で、中間一致('%keyword%')や後方一致('%keyword')では、インデックスの木構造を効率的に辿ることができません。

その結果、テーブル内の全レコードを一行ずつ確認する「フルテーブルスキャン(全件走査)」が発生します。

パフォーマンスを改善するための代替案

数百万件以上のデータを対象に中間一致検索を行う必要がある場合、単純なLIKE検索では実用的な速度が出ないことがあります。

そのような場面では、「全文検索インデックス(Full-Text Search Index)」の導入を検討すべきです。

MySQLのFULLTEXTインデックスや、PostgreSQLのGINインデックスなどがこれに該当します。

また、検索対象の文字列が短い場合は、正規表現(REGEXPなど)を利用する方法もありますが、これもインデックスの利用には制限があるため注意が必要です。

特殊文字を検索するためのエスケープ処理

検索したい文字列自体に「%」や「_」が含まれている場合、そのまま記述するとワイルドカードとして解釈されてしまいます。

これらの記号を純粋な文字として検索したい場合には、エスケープ処理が必要です。

ESCAPE句を使用することで、特定の文字の直後にある記号を通常の文字として扱うように指定できます。

SQL
-- 商品名に「10%」という文字列を含むデータを検索する例
-- $ をエスケープ文字として定義
SELECT product_name
FROM promotion_items
WHERE product_name LIKE '%10$%off%' ESCAPE '$';
実行結果
product_name
-------------------------
夏の大感謝祭 10%off セール

このように、エスケープ文字を定義することで、ワイルドカードとの混同を避けて正確な検索が可能になります。

データベース製品による挙動の違いと注意点

SQLの標準規格はあるものの、大文字と小文字の区別(Case Sensitivity)についてはデータベース製品ごとに挙動が異なります。

MySQLやSQL Serverのデフォルト設定では、LIKE検索において大文字と小文字を区別しないことが多いです。

一方で、PostgreSQLのLIKE演算子は厳密に大文字と小文字を区別します。

PostgreSQLで大文字小文字を区別せずに部分一致検索を行いたい場合は、専用の演算子であるILIKEを使用します。

SQL
-- PostgreSQLで大文字小文字を無視して検索
SELECT user_name
FROM users
WHERE user_name ILIKE '%john%';

このように、使用しているデータベースの仕様を正しく把握しておくことが、予期せぬ不具合を防ぐ鍵となります。

NOT LIKEを使用した除外検索

特定の文字列を「含まない」データを抽出したい場合には、NOT LIKE演算子を使用します。

条件を反転させることで、特定のキーワードを除外したリストを簡単に作成できます。

SQL
-- テスト用アカウント(testから始まる)を除外してユーザーを取得
SELECT user_id, user_name
FROM users
WHERE user_name NOT LIKE 'test%';

除外検索においても、インデックスの効力についてはLIKEと同様のルールが適用されるため、大規模なデータでは注意が必要です。

実務で役立つ複数の部分一致条件の組み合わせ

実際のアプリケーション開発では、複数のキーワードを組み合わせて検索する要件がよく発生します。

ANDORを活用することで、複雑なフィルタリング条件を構築できます。

SQL
-- 商品名に「ポータブル」を含み、かつ「電源」または「バッテリー」を含む商品を検索
SELECT product_name
FROM products
WHERE product_name LIKE '%ポータブル%'
  AND (product_name LIKE '%電源%' OR product_name LIKE '%バッテリー%');

複数のLIKE条件をORで繋ぐ際は、括弧を使用して優先順位を明確にすることが重要です。

また、条件が増えるほどクエリのコストが増大するため、可能な限り他の列(カテゴリIDや作成日時など)で事前に絞り込みを行うのが定石です。

まとめ

SQLにおける部分一致検索は、LIKE演算子とワイルドカードを使いこなすことで、非常に強力なデータ抽出手段となります。

「%」と「_」の役割を理解し、検索パターンに応じた記述を選択することが、正確な結果を得るための第一歩です。

しかし、中間一致検索や後方一致検索はデータベースのパフォーマンスに大きな影響を与える可能性があるため、データ量に応じた慎重な設計が求められます。

インデックスの特性を考慮したクエリ作成や、必要に応じた全文検索機能の活用、そして適切なエスケープ処理を心がけることで、高品質なデータベース操作を実現しましょう。

日々の開発やデータ分析において、今回紹介したテクニックをぜひ役立ててください。