「顧客の名前が『田中』で始まる人を検索したい」「メールアドレスに『gmail.com』を含む人を探したい」「商品コードの3文字目が『A』のものを抽出したい」…。
データベースで検索するとき、完全一致だけでは不便なことがありますよね。
そんなときに便利なのが、SQLのLIKE句とワイルドカードです。
LIKE句を使えば、あいまい検索(部分一致検索)ができるようになります。ワイルドカードを組み合わせることで、「○○で始まる」「○○を含む」「○○で終わる」といった柔軟な検索が可能なんです。
この記事では、SQLのLIKE句とワイルドカードの使い方を、初心者の方にも分かりやすく解説していきます。
LIKE句とは?基本を理解しよう

まずは、LIKE句がどういうものなのか見ていきましょう。
LIKE句の役割
LIKE句は、文字列のパターンマッチング(パターン照合)を行うためのSQL構文です。
パターンマッチングというのは、指定したパターン(型)に合う文字列を探すことですね。
基本的な構文
LIKE句は、WHERE句の中で使います。
SELECT 列名
FROM テーブル名
WHERE 列名 LIKE 'パターン';
例
SELECT name
FROM customers
WHERE name LIKE '田中%';
この例では、name列が「田中」で始まる顧客を検索しています。
完全一致との違い
通常の等号(=)は完全一致を意味します。
| 構文 | 意味 | 例 |
|---|---|---|
| = | 完全一致 | name = ‘田中太郎’ |
| LIKE | パターン一致 | name LIKE ‘田中%’ |
LIKE句を使うことで、「○○を含む」といった柔軟な検索が可能になるんです。
ワイルドカードの種類と使い方
LIKE句で使える特殊文字を、ワイルドカードと呼びます。
% (パーセント) – 任意の文字列
%(パーセント)は、0文字以上の任意の文字列にマッチします。
使用例
-- 「田中」で始まる
SELECT * FROM customers WHERE name LIKE '田中%';
-- 結果:田中太郎、田中花子、田中など
-- 「田中」で終わる
SELECT * FROM customers WHERE name LIKE '%田中';
-- 結果:山田田中、佐藤田中など
-- 「田中」を含む
SELECT * FROM customers WHERE name LIKE '%田中%';
-- 結果:田中太郎、山田田中、佐藤田中花子など
-- 「田中」と「太郎」を含む(順不同)
SELECT * FROM customers WHERE name LIKE '%田中%' AND name LIKE '%太郎%';
%の意味
- 0文字:「田中」そのものもマッチ
- 1文字以上:「田中太郎」「田中花子」などもマッチ
_ (アンダースコア) – 任意の1文字
_(アンダースコア)は、ちょうど1文字の任意の文字にマッチします。
使用例
-- 「田中」の後に1文字だけある
SELECT * FROM customers WHERE name LIKE '田中_';
-- 結果:田中太、田中花など(1文字のみ)
-- 「田中」の後に2文字ある
SELECT * FROM customers WHERE name LIKE '田中__';
-- 結果:田中太郎、田中花子など(2文字)
-- 3文字目が「A」の商品コード
SELECT * FROM products WHERE code LIKE '__A%';
-- 結果:12A001、99A999など(3文字目がA)
_と%の違い
| ワイルドカード | マッチする文字数 | 例 |
|---|---|---|
| % | 0文字以上 | ‘田中%’ → 田中、田中太郎、田中花子 |
| _ | ちょうど1文字 | ‘田中_’ → 田中太、田中花(2文字のみ) |
実践的な検索パターン
よく使う検索パターンを、具体例で見ていきましょう。
前方一致検索
指定した文字列で始まるデータを検索します。
-- 「山田」で始まる名前
SELECT * FROM customers WHERE name LIKE '山田%';
-- 「080」で始まる電話番号
SELECT * FROM customers WHERE phone LIKE '080%';
-- 「prod」で始まる商品コード
SELECT * FROM products WHERE code LIKE 'prod%';
使用場面
- 姓で検索
- 電話番号のキャリア判定
- 分類コードでの絞り込み
後方一致検索
指定した文字列で終わるデータを検索します。
-- 「太郎」で終わる名前
SELECT * FROM customers WHERE name LIKE '%太郎';
-- 「@gmail.com」で終わるメールアドレス
SELECT * FROM customers WHERE email LIKE '%@gmail.com';
-- 「.pdf」で終わるファイル名
SELECT * FROM files WHERE filename LIKE '%.pdf';
使用場面
- 名前の下の名前で検索
- ドメインでのフィルタリング
- ファイル種別での絞り込み
部分一致検索
文字列のどこかに含まれるデータを検索します。
-- 「東京」を含む住所
SELECT * FROM customers WHERE address LIKE '%東京%';
-- 「manager」を含む役職
SELECT * FROM employees WHERE position LIKE '%manager%';
-- 「sale」を含む商品名
SELECT * FROM products WHERE name LIKE '%sale%';
使用場面
- キーワード検索
- 地域での絞り込み
- タグや分類での検索
複数条件の組み合わせ
AND や OR を使って、複雑な検索ができます。
-- 「田中」または「山田」で始まる
SELECT * FROM customers
WHERE name LIKE '田中%' OR name LIKE '山田%';
-- 「東京」を含み、かつ「区」で終わる
SELECT * FROM customers
WHERE address LIKE '%東京%' AND address LIKE '%区';
-- 「gmail.com」または「yahoo.co.jp」のメールアドレス
SELECT * FROM customers
WHERE email LIKE '%@gmail.com' OR email LIKE '%@yahoo.co.jp';
否定形(NOT LIKE)
パターンに一致しないデータを検索します。
-- 「test」を含まない
SELECT * FROM users WHERE username NOT LIKE '%test%';
-- 「080」で始まらない電話番号
SELECT * FROM customers WHERE phone NOT LIKE '080%';
-- 「@gmail.com」で終わらないメールアドレス
SELECT * FROM customers WHERE email NOT LIKE '%@gmail.com';
実用例:よくある検索シナリオ
実際の業務でよく使われる検索パターンを見ていきましょう。
顧客検索
特定の地域に住む顧客を検索
SELECT name, address
FROM customers
WHERE address LIKE '%東京都%';
携帯電話番号のみを抽出
SELECT name, phone
FROM customers
WHERE phone LIKE '080%'
OR phone LIKE '090%'
OR phone LIKE '070%';
フリーメールを使っている顧客
SELECT name, email
FROM customers
WHERE email LIKE '%@gmail.com'
OR email LIKE '%@yahoo.co.jp'
OR email LIKE '%@hotmail.com';
商品検索
セール中の商品(商品名に「sale」を含む)
SELECT product_name, price
FROM products
WHERE product_name LIKE '%sale%' OR product_name LIKE '%セール%';
特定カテゴリの商品コード
商品コードが「A」で始まる場合が家電、「B」で始まる場合が書籍というルールがあるとします。
-- 家電カテゴリ
SELECT * FROM products WHERE code LIKE 'A%';
-- 書籍カテゴリ
SELECT * FROM products WHERE code LIKE 'B%';
ログ分析
エラーログの検索
SELECT log_date, message
FROM system_logs
WHERE message LIKE '%error%' OR message LIKE '%エラー%';
特定のIPアドレス範囲
-- 192.168で始まるローカルIPアドレス
SELECT * FROM access_logs WHERE ip_address LIKE '192.168.%';
エスケープ処理
ワイルドカード文字そのものを検索したいときの処理です。
エスケープが必要な場面
文字列の中に「%」や「_」が実際に含まれている場合、それを検索するにはエスケープが必要です。
例
商品名が「50%オフ」という文字列を検索したい場合、そのまま検索すると誤動作します。
-- これでは「50」の後に任意の文字列がマッチしてしまう
SELECT * FROM products WHERE name LIKE '50%オフ';
ESCAPE句の使い方
ESCAPE句を使って、エスケープ文字を指定します。
基本構文
WHERE 列名 LIKE 'パターン' ESCAPE 'エスケープ文字'
使用例
-- 「%」をエスケープして検索
SELECT * FROM products
WHERE name LIKE '50\%オフ' ESCAPE '\';
-- 結果:「50%オフ」という文字列にマッチ
エスケープが必要なケース
-- 「_」を含む文字列
SELECT * FROM files
WHERE filename LIKE 'report\_2024%' ESCAPE '\';
-- 結果:「report_2024.pdf」などにマッチ
-- 「%」を含む文字列
SELECT * FROM products
WHERE description LIKE '%\%%' ESCAPE '\';
-- 結果:「50%」「10%OFF」などにマッチ
データベースごとのエスケープ文字
| データベース | デフォルトのエスケープ文字 | 変更可能 |
|---|---|---|
| MySQL | \ (バックスラッシュ) | ○ |
| PostgreSQL | なし(ESCAPE句で指定) | ○ |
| SQL Server | [ ] (角括弧)または ESCAPE | ○ |
| Oracle | なし(ESCAPE句で指定) | ○ |
パフォーマンスへの影響

LIKE句の使い方によっては、検索速度が遅くなることがあります。
インデックスが効く場合・効かない場合
インデックスは、データベースの検索を高速化する仕組みです。
インデックスが効く(高速)
前方一致検索では、インデックスが利用されます。
-- 高速(インデックスが効く)
SELECT * FROM customers WHERE name LIKE '田中%';
インデックスが効かない(低速)
中間一致や後方一致では、インデックスが利用されません。
-- 低速(インデックスが効かない)
SELECT * FROM customers WHERE name LIKE '%田中%';
SELECT * FROM customers WHERE name LIKE '%田中';
パフォーマンス改善のコツ
可能な限り前方一致を使う
-- 遅い
WHERE email LIKE '%@gmail.com'
-- 速い(メールドメインを別カラムに分ける設計)
WHERE domain = 'gmail.com'
LIKE の前に範囲を絞る
-- 絞り込んでからLIKEを使う
SELECT * FROM customers
WHERE created_date >= '2024-01-01' -- 先に日付で絞る
AND name LIKE '%田中%';
全文検索インデックスの利用
MySQLやPostgreSQLには、全文検索専用のインデックスがあります。
-- MySQL の全文検索(LIKE より高速)
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('検索キーワード');
データベースごとの違いと注意点
LIKE句は標準SQLですが、データベースによって細かい違いがあります。
大文字・小文字の区別
MySQL
デフォルトでは大文字小文字を区別しません。
-- MySQL:'ABC' と 'abc' は同じとみなされる
SELECT * FROM users WHERE name LIKE 'john%';
-- 結果:John, JOHN, john すべてマッチ
大文字小文字を区別したい場合は、BINARY を使います。
SELECT * FROM users WHERE name LIKE BINARY 'John%';
-- 結果:John のみマッチ(john, JOHN はマッチしない)
PostgreSQL
デフォルトで大文字小文字を区別します。
-- PostgreSQL:大文字小文字を区別
SELECT * FROM users WHERE name LIKE 'John%';
-- 結果:John のみマッチ
-- 区別しない場合は ILIKE を使う
SELECT * FROM users WHERE name ILIKE 'john%';
-- 結果:John, JOHN, john すべてマッチ
SQL Server
照合順序(Collation)の設定によります。
-- 大文字小文字を区別しない照合順序
SELECT * FROM users WHERE name LIKE 'john%' COLLATE Latin1_General_CI_AS;
-- 大文字小文字を区別する照合順序
SELECT * FROM users WHERE name LIKE 'john%' COLLATE Latin1_General_CS_AS;
正規表現の利用
一部のデータベースでは、より強力な正規表現が使えます。
MySQL(REGEXP演算子)
-- 数字で始まる
SELECT * FROM products WHERE code REGEXP '^[0-9]';
-- 英字で終わる
SELECT * FROM products WHERE code REGEXP '[a-zA-Z]$';
PostgreSQL(正規表現演算子 ~)
-- 数字のみ
SELECT * FROM users WHERE phone ~ '^[0-9]+$';
-- メールアドレスの形式
SELECT * FROM users WHERE email ~ '^[^@]+@[^@]+\.[^@]+$';
ベストプラクティスと注意点
LIKE句を効果的に使うためのポイントをまとめました。
パフォーマンスを意識する
避けるべきパターン
-- 遅い:両側に%がある
SELECT * FROM large_table WHERE description LIKE '%keyword%';
改善策
- 前方一致に変更できないか検討
- 全文検索インデックスの利用
- 検索専用の列を追加
- 事前に範囲を絞ってから検索
NULL値の扱い
LIKE句は、NULL値にマッチしません。
-- NULL は何にもマッチしない
SELECT * FROM users WHERE name LIKE '%';
-- NULL の name は結果に含まれない
-- NULL も含めたい場合
SELECT * FROM users WHERE name LIKE '%' OR name IS NULL;
セキュリティへの配慮
ユーザー入力をそのままLIKEパターンに使うのは危険です。
SQLインジェクション対策
-- 危険:ユーザー入力を直接埋め込み
WHERE name LIKE '%" + userInput + "%'
-- 安全:プレースホルダーを使用
WHERE name LIKE ?
アプリケーション側で、適切なエスケープ処理を行いましょう。
可読性の向上
複雑な検索は、コメントを付けると分かりやすくなります。
-- 東京都内の23区に住む顧客
SELECT * FROM customers
WHERE address LIKE '%東京都%' -- 東京都を含む
AND (
address LIKE '%千代田区%'
OR address LIKE '%中央区%'
OR address LIKE '%港区%'
-- ... 他の区
);
実践演習問題

理解を深めるために、練習問題を用意しました。
問題1:基本的な検索
次の条件に合うSQL文を書いてください。
- 名前が「佐藤」で始まる顧客
- メールアドレスが「co.jp」で終わる顧客
- 住所に「東京」を含む顧客
解答例
-- 1
SELECT * FROM customers WHERE name LIKE '佐藤%';
-- 2
SELECT * FROM customers WHERE email LIKE '%co.jp';
-- 3
SELECT * FROM customers WHERE address LIKE '%東京%';
問題2:複雑な検索
次の条件に合うSQL文を書いてください。
- 商品コードが「A」で始まり、3文字目が「1」のもの
- 電話番号が「080」「090」「070」のいずれかで始まるもの
- ファイル名が「report」で始まり「.pdf」で終わるもの
解答例
-- 1
SELECT * FROM products WHERE code LIKE 'A_1%';
-- 2
SELECT * FROM customers
WHERE phone LIKE '080%'
OR phone LIKE '090%'
OR phone LIKE '070%';
-- 3
SELECT * FROM files
WHERE filename LIKE 'report%.pdf';
まとめ
SQLのLIKE句とワイルドカードについて解説してきました。
重要なポイント
- LIKE句を使えば、あいまい検索(パターン一致)ができる
- %は0文字以上の任意の文字列、_はちょうど1文字にマッチ
- 前方一致(’○○%’)、後方一致(’%○○’)、部分一致(’%○○%’)が可能
- 前方一致はインデックスが効くが、後方一致・部分一致は遅い
- エスケープ処理で「%」「_」そのものを検索できる
- データベースによって大文字小文字の扱いが異なる
- パフォーマンスとセキュリティに注意が必要
- NOT LIKEで否定形の検索もできる
LIKE句とワイルドカードを使いこなせば、データベース検索の幅が大きく広がります。
まずは前方一致や部分一致から練習して、徐々に複雑な検索パターンにも挑戦してみてください。
実務で必要な柔軟な検索を、効率的に実現できるようになりますよ!

コメント