データベースから特定の情報を抽出する際、正確な一致だけでなく「特定の文字を含む」といったあいまいな条件で検索を行いたい場面が多々あります。
SQLにおいてこのような柔軟なデータ検索を実現するのが LIKE 句と ワイルドカード です。
本記事では、SQL初学者から中級者の方に向けて、 LIKE 句の基本的な使い方からパフォーマンスを意識した実践的なテクニックまで詳しくご紹介します。
2026年現在のモダンなデータベース運用においても、この LIKE 句による文字列操作は依然として必須のスキルと言えます。
LIKE句の基本概念とワイルドカードの役割
SQLの SELECT 文において WHERE 句と組み合わせて使用される LIKE 句は、文字列パターンの照合を行うための演算子です。
通常の = (等号)演算子では、カラムの値が検索条件と完全に一致している必要があります。
しかし、 LIKE 句を使用することで、文字列の一部が一致するデータを効率的に探し出すことが可能になります。
この「一部の一致」を定義するために用いられる特殊な記号がワイルドカードです。
ワイルドカードは、任意の文字や文字列を代用する役割を果たします。
多くのリレーショナルデータベース (RDBMS) で共通して使用できる主要なワイルドカードは、 % (パーセント) と _ (アンダースコア) の2種類です。
「%」(パーセント) – 0文字以上の任意の文字列
% は、最も頻繁に使用されるワイルドカードであり、0文字以上の任意の文字列にマッチします。
例えば、「検索キーワードで始まるもの」や「特定の文字をどこかに含むもの」などを探す際に非常に便利です。
文字数が決まっていない場合や、空文字である可能性を含めて検索したい場合に使用します。
「_」(アンダースコア) – 任意の1文字
_ は、正確に1文字の任意の文字にマッチします。
% とは異なり、文字数が厳密に決まっているパターンの検索に適しています。
例えば、「3文字の単語の2文字目が『A』であるもの」といった条件を指定する際に役立ちます。
実践的なあいまい検索のパターン
ワイルドカードを配置する位置によって、検索の意味合いは大きく変わります。
ここでは、代表的な3つの検索パターンについて解説します。
前方一致検索
前方一致検索は、カラムの値が指定した文字列から始まるデータを探す方法です。
文字列の末尾に % を配置して記述します。
-- 'データ' という言葉で始まる商品名を検索する
SELECT * FROM products
WHERE product_name LIKE 'データ%';
product_id | product_name
-----------|-------------
1 | データベース基礎
2 | データ分析入門
この方法は、電話番号の市外局番や、特定のカテゴリコードで始まる品番を検索する際によく利用されます。
後方一致検索
後方一致検索は、カラムの値が指定した文字列で終わるデータを探す方法です。
文字列の先頭に % を配置して記述します。
-- '株式会社' で終わる顧客名を検索する
SELECT * FROM customers
WHERE customer_name LIKE '%株式会社';
customer_id | customer_name
------------|---------------
101 | テックソリューション株式会社
102 | 未来創造株式会社
ファイル拡張子 (.jpg や .pdf) を指定してファイルを絞り込む際などにも非常に有用な手法です。
部分一致検索
部分一致検索は、指定した文字列がカラム内のどこかに含まれていればヒットする方法です。
検索文字列の前後を % で囲みます。
-- 'クラウド' という単語を含むサービス名を検索する
SELECT * FROM services
WHERE service_name LIKE '%クラウド%';
service_id | service_name
-----------|-------------
201 | クラウドストレージ
202 | ハイブリッドクラウド構成
203 | プライベートクラウド
ユーザーが入力したキーワードを元に記事タイトルを検索するような、Webサイトの検索機能で最も汎用的に使われます。
ワイルドカードの組み合わせと応用
% と _ は、一つのクエリの中で自由に組み合わせることができます。
例えば、「2文字目に特定の文字があり、その後に続く文字列を問わない」といった複雑な条件も可能です。
-- 2文字目が 'B' であるIDを検索する
SELECT * FROM users
WHERE user_id LIKE '_B%';
user_id | user_name
--------|----------
AB123 | 佐藤
CB999 | 鈴木
このように、文字の位置を固定しながら柔軟な検索が行えるのがワイルドカードの強みです。
特殊な文字の検索とエスケープ処理
もし検索したい文字列自体に % や _ が含まれている場合、通常の LIKE 句では正しく動作しません。
これらの記号はワイルドカードとして解釈されてしまうためです。
このようなケースでは、ESCAPE句を使用してワイルドカード機能を一時的に無効化します。
-- '100%' という文字列が含まれるデータを検索する
-- ここでは '$' をエスケープ文字として定義しています
SELECT * FROM promotions
WHERE discount_rate LIKE '%100$%%' ESCAPE '$';
上記の例では、 $% と記述することで、直後の % を単なる文字として扱うようデータベースに指示しています。
エスケープ文字には $ や #、 \ (バックスラッシュ) など、データ内にあまり現れない文字を任意に選ぶことができます。
LIKE句を使用する際のパフォーマンス上の注意点
LIKE 句は非常に強力ですが、使い方を誤るとデータベースの動作を著しく重くする原因になります。
特に大規模なデータを扱うシステムでは、パフォーマンスへの考慮が不可欠です。
インデックスの効果と前方一致
一般的に、データベースのインデックス (B-tree) は 前方一致検索 であれば適用されます。
しかし、先頭にワイルドカードを置く「部分一致」や「後方一致」ではインデックスが効かないという制約があります。
先頭に % があると、データベースは全ての行を一つずつ確認する「フルテーブルスキャン」を実行しなければならないためです。
効率的な運用のための対策
パフォーマンスを改善するためには、以下のような対策を検討することが推奨されます。
| 手法 | 特徴 |
|---|---|
| 前方一致に寄せる | 可能であればデータの持ち方を工夫し、前方一致で検索できるようにする。 |
| 全文検索エンジン | 大量のテキストデータを高速に部分一致検索したい場合は、Elasticsearchや全文検索インデックスを利用する。 |
| 事前フィルタリング | 日付やカテゴリなど、インデックスが効く他の条件でまずデータを絞り込む。 |
よくある間違いとトラブルシューティング
LIKE 句を使用する際、初心者が陥りやすいミスがいくつかあります。
一つは、 大文字と小文字の区別 です。
MySQLなど一部のデータベースではデフォルトで区別しませんが、PostgreSQLやOracle、SQL Serverの設定によっては厳密に区別されます。
大文字小文字を無視して検索したい場合は、 ILIKE 句 (PostgreSQL) を使ったり、 UPPER() 関数で文字列を統一してから比較したりします。
-- 大文字小文字を区別せずに検索する一般的な方法
SELECT * FROM users
WHERE UPPER(user_name) LIKE UPPER('%Smith%');
もう一つの注意点は、 NULL値の扱い です。
LIKE 句は NULL のカラムに対しては機能しません。
値が入っていない可能性があるカラムを検索する場合は、 IS NULL や COALESCE 関数を組み合わせて適切に処理する必要があります。
他演算子との使い分け
文字列の検索には LIKE 句以外にも選択肢があります。
完全に一致する場合のみ抽出するのであれば、 = 演算子を使う方が処理速度は高速です。
また、複数の候補のいずれかと完全一致させたい場合は IN 句が適しています。
より複雑なパターン(数字のみ、特定の文字パターンの繰り返しなど)を検索したい場合は、正規表現を用いた REGEXP 演算子などの検討も必要です。
状況に応じて、最もシンプルかつ効率的な方法を選択することが、優れたSQLクエリを書くコツです。
まとめ
SQLの LIKE 句とワイルドカードは、データベースから必要な情報を柔軟に引き出すための非常に重要なツールです。
% を使った 0文字以上のマッチングと、 _ を使った1文字マッチングを使い分けることで、多様なあいまい検索が可能になります。
一方で、部分一致検索や後方一致検索はインデックスが効きにくく、大量のデータに対して実行するとパフォーマンス低下を招くリスクもあります。
実務においては、検索の利便性とシステムのパフォーマンスのバランスを考慮し、最適なインデックス設計や検索条件の指定を行うことが求められます。
本記事で学んだ基本とテクニックを活用して、より効率的で精度の高いデータ抽出を目指してください。
