SQL(Structured Query Language)を使用してデータベースから必要な情報を取得する際、特定の文字列と完全に一致するデータだけでなく、曖昧な条件で検索したい場面が多くあります。
例えば、顧客名簿から「佐藤」という苗字の人を全員抽出したり、商品コードの先頭が特定のアルファベットで始まるものだけを探したりする場合です。
このような柔軟なテキスト検索を実現するために欠かせないのが、SQLのワイルドカードです。
ワイルドカードをマスターすることで、複雑な条件指定をシンプルに記述できるようになり、データ抽出の効率が飛躍的に向上します。
本記事では、LIKE演算子と共に使用されるワイルドカードの基本から、実務で役立つ具体的な活用テクニックまでを詳しく紹介します。
SQLのワイルドカードとは?基本概念を理解する
SQLにおけるワイルドカードとは、文字列のパターンマッチングを行う際に、1文字以上の任意の文字や、特定の1文字を代用するために使用される特殊な記号のことです。
通常の等号(=)を用いた比較では、指定した文字列と完全に一致するデータしか取得できません。
しかし、ワイルドカードを使用することで「~を含む」「~で始まる」といった曖昧な検索条件を指定できるようになります。
ワイルドカードは主に LIKE 演算子と組み合わせて使用されます。
標準的なSQLで利用される主要なワイルドカードは、パーセント(%)とアンダースコア(_)の2種類です。
これらを使い分けることで、検索したいパターンの精度を細かく制御することが可能になります。
LIKE演算子の役割
LIKE 演算子は、WHERE 句の中で使用され、カラムの値が特定のパターンに一致するかどうかを判定するために利用されます。
基本的な構文は以下の通りです。
-- LIKE演算子の基本構文
SELECT カラム名 FROM テーブル名 WHERE カラム名 LIKE 'パターン';
このパターンの中にワイルドカードを組み込むことで、動的な検索条件を作成します。
なお、LIKE 演算子は文字列型(CHAR や VARCHAR など)のデータに対して適用されるのが一般的です。
主要な2つのワイルドカード
SQLで最も頻繁に使用される2つのワイルドカードについて、それぞれの特徴と動作を詳しく見ていきましょう。
パーセント(%):0文字以上の任意の文字列
パーセント(%)は、0文字以上の任意の長さの文字列を表します。
文字数が決まっていない場合や、特定のキーワードが含まれているかどうかを確認したい場合に最適です。
たとえば、「'A%'」というパターンを指定した場合、「A」、「Apple」、「Amazon」など、Aから始まるすべての文字列がヒットします。
また、「'%test%'」と指定すれば、「test」という単語が先頭、中間、末尾のどこに含まれていても抽出対象となります。
アンダースコア(_):任意の1文字
アンダースコア(_)は、正確に1文字分の代わりとなるワイルドカードです。
検索したい文字列の長さが分かっている場合や、特定の箇所の文字だけを不問にしたい場合に利用します。
たとえば、「'A_C'」というパターンは、「ABC」や「ADC」には一致しますが、「ABDC」のように2文字以上が間にある場合には一致しません。
特定のフォーマットに基づいたIDや管理番号などを検索する際に非常に便利です。
ワイルドカードの活用パターン
実務でよく使われるパターンマッチングの例をいくつか挙げます。
前方一致(~で始まる)
検索対象の文字列が特定のキーワードから始まっているものを抽出します。
インデックスの効果が得られやすいため、パフォーマンス面でも有利な検索方法です。
-- 「株式会社」から始まる会社名を検索する
SELECT company_name
FROM clients
WHERE company_name LIKE '株式会社%';
company_name
------------------
株式会社テック
株式会社サンプル
株式会社AIソリューション
後方一致(~で終わる)
検索対象の文字列が特定のキーワードで終わっているものを抽出します。
ドメイン名の検索や、特定の単位で終わる数値データの文字列検索などに使われます。
-- 「.jp」で終わるメールアドレスを検索する
SELECT email
FROM users
WHERE email LIKE '%.jp';
email
------------------
user1@example.jp
support@test.co.jp
部分一致(~を含む)
キーワードがどこかに含まれているレコードをすべて抽出します。
最も柔軟な検索方法ですが、データ量が多い場合は処理が重くなる傾向があります。
-- 商品名に「スマート」を含む製品を検索する
SELECT product_name
FROM products
WHERE product_name LIKE '%スマート%';
product_name
------------------
スマートフォンPro
スマートウォッチ
最新型スマート家電
特殊なワイルドカード(特定のDB製品)
標準SQL以外のワイルドカードも存在します。
Microsoft SQL ServerやPostgreSQL(一部の記法)などでは、より高度なパターン指定が可能です。
ブラケット([]):指定した範囲内の1文字
「[ ]」の中に含めた文字のいずれかに一致する1文字を検索します。
例えば、「'[A-C]%'」とすると、A、B、Cのいずれかで始まるデータが対象になります。
キャレット付きブラケット([^]):指定した範囲外の1文字
「[^ ]」は、カッコ内の文字に含まれない任意の1文字を意味します。
特定の文字を除外して検索したい場合に有効です。
エスケープ文字の利用方法
検索したい文字列自体に「%」や「_」が含まれている場合、そのまま LIKE で使用するとワイルドカードとして認識されてしまいます。
これを回避するために、エスケープ文字を使用します。
ESCAPE 句を使用して、どの文字をエスケープ文字として扱うかを明示的に宣言します。
-- 「10%」という文字列そのものを検索する場合
-- バックスラッシュ(\)をエスケープ文字として定義
SELECT item_name
FROM inventory
WHERE item_name LIKE '10\%' ESCAPE '\';
item_name
------------------
10%増量パック
10%オフクーポン
このように記述することで、エスケープ文字の直後のワイルドカード記号は、通常の文字として扱われるようになります。
ワイルドカード利用時の注意点とパフォーマンス
ワイルドカードは非常に強力ですが、無計画に使用するとデータベースの動作を著しく低下させることがあります。
特に大規模なデータを扱う際には、以下のポイントに注意が必要です。
インデックスの効き方
データベースには検索を高速化するための「インデックス(索引)」という仕組みがあります。
しかし、「%キーワード」のように、検索パターンの先頭にワイルドカードを置く「後方一致」や「部分一致」では、通常のB-treeインデックスが利用されません。 この場合、データベースはテーブルの全レコードを一行ずつ確認する「フルテーブルスキャン」を実行するため、レスポンスが非常に遅くなります。
可能な限り、パターンの先頭は固定の文字列にする「前方一致('キーワード%')」の形にできないか検討してください。
どうしても部分一致が必要でパフォーマンスが問題になる場合は、全文検索エンジン(Elasticsearchなど)の導入や、データベース独自の全文検索インデックス機能を検討する必要があります。
大文字・小文字の区別
使用しているデータベース製品(MySQL, PostgreSQL, Oracle, SQL Serverなど)や、その設定(照合順序/Collation)によって、大文字と小文字を区別するかどうかが異なります。
例えば、MySQLのデフォルト設定では LIKE 'a%' は「Apple」にも一致しますが、PostgreSQLではデフォルトで区別されます。
意図しない検索結果を防ぐために、UPPER() 関数や LOWER() 関数で統一してから比較するか、PostgreSQLであれば ILIKE(大文字小文字を区別しないLIKE)を使用することを検討してください。
実務で役立つワイルドカードの比較表
ここまで解説したワイルドカードの特性を一覧表にまとめました。
| ワイルドカード | 説明 | 使用例 |
|---|---|---|
% | 0文字以上の任意の文字列 | LIKE 'ABC%' (ABCで始まる) |
_ | 任意の1文字 | LIKE 'A_C' (ABC, ADCなど) |
[ ] | 指定範囲内の1文字 (一部のDB) | LIKE '[A-M]%' (AからMで始まる) |
[^ ] | 指定範囲外の1文字 (一部のDB) | LIKE '[^0-9]%' (数字以外で始まる) |
まとめ
SQLのワイルドカードは、LIKE演算子と組み合わせることで柔軟なデータ検索を可能にする非常に便利なツールです。
「%」を使った任意の文字列検索や、「_」を使った文字数指定検索など、用途に応じて使い分けることが重要です。
ただし、特に「%」を先頭に置く検索はパフォーマンスに大きな影響を与える可能性があるため、データ量やインデックスの状況を考慮しながら適切に設計してください。
エスケープ文字の使い方や各データベース特有の挙動を理解しておくことで、より精度の高いパターンマッチングが可能になります。
今回学んだ基本を活かして、日々のデータ抽出作業やアプリケーション開発をより効率的に進めていきましょう。
