「名前が”山田”で始まる人を検索したい」
「メールアドレスに”gmail”が含まれる人だけを表示したい」
──そんなときに便利なのが、SQLのLIKE演算子です。
LIKEは、完全一致ではなく部分一致やあいまい検索を可能にする演算子で、実際の仕事でもよく使われます。
この記事では、LIKEの基本的な使い方から、ワイルドカードの活用方法、注意点、さらには実践例までを初心者向けに詳しく説明します。
LIKE演算子って何?

LIKEの役割
LIKE演算子は、文字列の一部が特定のパターンに合うかどうかを調べるために使います。
通常の=
では完全に同じ文字列しか見つけられませんが、LIKEを使えば「〜で始まる」「〜を含む」「〜で終わる」といった柔軟な検索ができます。
基本的な書き方
SELECT * FROM テーブル名 WHERE 列名 LIKE 'パターン';
=とLIKEの違い
=
を使った完全一致
SELECT * FROM users WHERE name = '山田太郎';
→ 名前が「山田太郎」の人だけ見つかる
LIKEを使った部分一致
SELECT * FROM users WHERE name LIKE '山田%';
→ 「山田太郎」「山田花子」「山田次郎」など、「山田」で始まる人が全て見つかる
実際の使用例
-- 名前が「山田」で始まる人を検索
SELECT * FROM users WHERE name LIKE '山田%';
-- メールアドレスに「gmail」が含まれる人を検索
SELECT * FROM users WHERE email LIKE '%gmail%';
-- 電話番号が「090」で始まる人を検索
SELECT * FROM contacts WHERE phone LIKE '090%';
ワイルドカードの使い方

LIKEでは、「ワイルドカード」という特別な記号を使って検索パターンを指定します。
%(パーセント):何文字でもOK
%
は「0文字以上の任意の文字列」を表します。
前方一致(〜で始まる)
SELECT * FROM users WHERE name LIKE '山田%';
- 山田太郎 ✓
- 山田花子 ✓
- 山田 ✓
- 田中太郎 ✗
後方一致(〜で終わる)
SELECT * FROM users WHERE name LIKE '%太郎';
- 山田太郎 ✓
- 田中太郎 ✓
- 鈴木次郎 ✗
- 太郎 ✓
部分一致(〜を含む)
SELECT * FROM products WHERE name LIKE '%限定%';
- 春の限定商品 ✓
- 限定版ゲーム ✓
- 数量限定セール ✓
- 通常商品 ✗
_(アンダースコア):1文字だけ
_
は「任意の1文字」を表します。
使用例
SELECT * FROM users WHERE name LIKE '山_田';
- 山中田 ✓
- 山本田 ✓
- 山田田 ✓
- 山田 ✗(文字数が足りない)
- 山川田 ✗(文字数が多い)
複数の_
を使う
SELECT * FROM products WHERE code LIKE 'A_B_';
- A1B2 ✓
- AxBy ✓
- A12B ✗(文字数が足りない)
%と_を組み合わせる
-- 「山田」で始まり、3文字目が「郎」の人
SELECT * FROM users WHERE name LIKE '山田_郎';
-- 山田太郎 ✓
-- 山田次郎 ✓
-- 山田花子 ✗
-- メールアドレスで、@より前が3文字の人
SELECT * FROM users WHERE email LIKE '___@%';
-- abc@gmail.com ✓
-- test@yahoo.co.jp ✗(4文字だから)
実際の仕事で使える例

顧客管理システム
特定の地域の顧客を検索
-- 住所に「東京」が含まれる顧客
SELECT customer_name, address
FROM customers
WHERE address LIKE '%東京%';
-- 郵便番号が「100」で始まる顧客(東京都千代田区周辺)
SELECT customer_name, postal_code
FROM customers
WHERE postal_code LIKE '100%';
メールドメイン別の顧客分析
-- Gmailユーザーの数を調べる
SELECT COUNT(*) as gmail_users
FROM customers
WHERE email LIKE '%@gmail.com';
-- 企業メールユーザーを除外(フリーメール以外)
SELECT customer_name, email
FROM customers
WHERE email NOT LIKE '%@gmail.com'
AND email NOT LIKE '%@yahoo.co.jp'
AND email NOT LIKE '%@hotmail.com';
商品管理システム
商品名による検索
-- 「限定」商品の売上を集計
SELECT product_name, SUM(sales_amount) as total_sales
FROM sales
WHERE product_name LIKE '%限定%'
GROUP BY product_name;
-- 「iPhone」関連商品を検索
SELECT product_name, price, stock
FROM products
WHERE product_name LIKE '%iPhone%'
ORDER BY price;
商品コードによる分類
-- 家電製品(コードが「E」で始まる)
SELECT * FROM products WHERE product_code LIKE 'E%';
-- 衣類の春物(コードが「C」で始まり、「S」を含む)
SELECT * FROM products
WHERE product_code LIKE 'C%'
AND product_code LIKE '%S%';
ログ分析
エラーログの検索
-- エラーメッセージに「timeout」が含まれるログ
SELECT log_date, error_message
FROM error_logs
WHERE error_message LIKE '%timeout%';
-- 特定のIPアドレス範囲からのアクセス
SELECT access_date, ip_address, url
FROM access_logs
WHERE ip_address LIKE '192.168.1.%';
ユーザー管理
名前による検索
-- 「田」がつく名字の人
SELECT user_name, department
FROM employees
WHERE user_name LIKE '%田%';
-- 「太郎」で終わる名前の人
SELECT user_name, age
FROM users
WHERE user_name LIKE '%太郎';
よくある間違いと注意点

大文字・小文字の扱い
データベースによって、大文字と小文字の扱いが違います。
MySQLの場合(通常は区別しない)
-- これらは同じ結果になることが多い
SELECT * FROM users WHERE name LIKE 'YAMADA%';
SELECT * FROM users WHERE name LIKE 'yamada%';
PostgreSQLの場合(区別する)
-- これらは違う結果になる
SELECT * FROM users WHERE name LIKE 'YAMADA%'; -- 大文字のYAMADAのみ
SELECT * FROM users WHERE name LIKE 'yamada%'; -- 小文字のyamadaのみ
大文字・小文字を区別したい場合(MySQL)
SELECT * FROM users WHERE BINARY name LIKE 'Yamada%';
大文字・小文字を区別したくない場合(PostgreSQL)
SELECT * FROM users WHERE UPPER(name) LIKE UPPER('yamada%');
-- または
SELECT * FROM users WHERE name ILIKE 'yamada%';
パフォーマンスの問題
遅くなるパターン
-- 先頭に%があると、インデックスが使われにくい
SELECT * FROM users WHERE name LIKE '%田'; -- 遅い
早くなるパターン
-- 先頭に具体的な文字があると、インデックスが使いやすい
SELECT * FROM users WHERE name LIKE '田%'; -- 早い
改善方法
-- フルテキストインデックスを作成
CREATE FULLTEXT INDEX ft_name ON users(name);
-- MATCH AGAINST を使用(MySQL)
SELECT * FROM users WHERE MATCH(name) AGAINST('田');
ワイルドカード文字を文字として検索したい場合
%
や_
を実際の文字として検索したいときは、エスケープが必要です。
問題のある例
-- 商品コードに「_」が含まれるものを探したいが、
-- これだと「_」が任意の1文字として解釈される
SELECT * FROM products WHERE code LIKE '%_%';
正しい書き方
-- バックスラッシュでエスケープ
SELECT * FROM products WHERE code LIKE '%\_%' ESCAPE '\';
-- または異なるエスケープ文字を使用
SELECT * FROM products WHERE code LIKE '%#_%' ESCAPE '#';
実際の使用例
-- ファイル名に「.pdf」が含まれるものを検索
SELECT * FROM files WHERE filename LIKE '%.pdf'; -- これはOK
-- ファイル名に「100%」が含まれるものを検索
SELECT * FROM files WHERE filename LIKE '%100\%%' ESCAPE '\';
空文字とNULLの扱い
-- 空文字(長さ0の文字列)
SELECT * FROM users WHERE name LIKE ''; -- 空文字のみ
-- NULLは一致しない
SELECT * FROM users WHERE name LIKE '%'; -- NULLは含まれない
-- NULLも含めたい場合
SELECT * FROM users WHERE name LIKE '%' OR name IS NULL;
高度な使い方

複数パターンの組み合わせ
-- 名前が「田中」または「山田」で始まる人
SELECT * FROM users
WHERE name LIKE '田中%' OR name LIKE '山田%';
-- メールアドレスが「gmail」または「yahoo」の人
SELECT * FROM users
WHERE email LIKE '%@gmail.com' OR email LIKE '%@yahoo.co.jp';
否定パターン
-- 名前に「田」が含まれない人
SELECT * FROM users WHERE name NOT LIKE '%田%';
-- メールアドレスがフリーメール以外の人
SELECT * FROM users
WHERE email NOT LIKE '%@gmail.com'
AND email NOT LIKE '%@yahoo.co.jp'
AND email NOT LIKE '%@hotmail.com';
数値の文字列表現での検索
-- 価格が「1」で始まる商品(1000円台、10000円台など)
SELECT * FROM products WHERE CAST(price AS CHAR) LIKE '1%';
-- 電話番号の中間3桁が「123」の人
SELECT * FROM contacts WHERE phone LIKE '___-123-%';
日付の文字列での検索
-- 2025年のデータ
SELECT * FROM orders
WHERE CAST(order_date AS CHAR) LIKE '2025%';
-- 6月のデータ
SELECT * FROM orders
WHERE CAST(order_date AS CHAR) LIKE '%-06-%';
類似機能との比較
LIKE vs REGEXP(正規表現)
LIKE
-- 簡単なパターンマッチング
SELECT * FROM users WHERE name LIKE '山田%';
REGEXP(MySQL)
-- より複雑なパターンマッチング
SELECT * FROM users WHERE name REGEXP '^山田.*';
SELECT * FROM users WHERE phone REGEXP '^[0-9]{3}-[0-9]{4}-[0-9]{4}$';
LIKE vs フルテキスト検索
LIKE
-- 部分一致検索(シンプル)
SELECT * FROM articles WHERE content LIKE '%プログラミング%';
フルテキスト検索(MySQL)
-- より高度な文字列検索
SELECT * FROM articles
WHERE MATCH(content) AGAINST('プログラミング' IN NATURAL LANGUAGE MODE);
パフォーマンス最適化のコツ

インデックスを活用する
-- 名前の前方一致でよく検索する場合
CREATE INDEX idx_name ON users(name);
-- この検索は高速
SELECT * FROM users WHERE name LIKE '山田%';
検索範囲を絞る
-- 悪い例:全件から検索
SELECT * FROM users WHERE name LIKE '%田%';
-- 良い例:まず他の条件で絞ってから検索
SELECT * FROM users
WHERE age BETWEEN 20 AND 30 -- インデックスで高速絞り込み
AND name LIKE '%田%'; -- 絞られた結果から検索
適切なデータ型を使う
-- 文字列として格納された数値の検索は遅い
SELECT * FROM products WHERE CAST(price AS CHAR) LIKE '1%';
-- 数値として範囲検索の方が早い
SELECT * FROM products WHERE price >= 1000 AND price < 2000;
トラブルシューティング
期待した結果が返ってこない場合
データを確認
-- 実際のデータを見てみる
SELECT DISTINCT name FROM users LIMIT 10;
SELECT LENGTH(name), name FROM users LIMIT 5;
空白文字の問題
-- 前後に空白がある場合
SELECT * FROM users WHERE TRIM(name) LIKE '山田%';
文字化けの問題
-- 文字エンコーディングを確認
SHOW VARIABLES LIKE 'character_set%';
パフォーマンスが悪い場合
実行計画を確認
-- MySQL
EXPLAIN SELECT * FROM users WHERE name LIKE '山田%';
-- PostgreSQL
EXPLAIN ANALYZE SELECT * FROM users WHERE name LIKE '山田%';
インデックスの使用状況を確認
-- インデックスの一覧
SHOW INDEX FROM users;
まとめ
SQLのLIKE演算子は、文字列のパターンマッチングで非常に便利なツールです。%
と_
のワイルドカードを正しく使えば、柔軟で直感的な検索条件を設定できます。
重要なポイント
%
:0文字以上の任意の文字列_
:任意の1文字- 前方一致(
'山田%'
)、後方一致('%太郎'
)、部分一致('%田%'
)の使い分け - 大文字・小文字の扱いはデータベースによって異なる
- パフォーマンスに注意:先頭の
%
は遅くなりやすい - エスケープ:
%
や_
を文字として検索するときは必要
使い分けの目安
- シンプルな部分一致:LIKEを使う
- 複雑なパターン:正規表現を使う
- 大量テキストの検索:フルテキスト検索を使う
- 前方一致のみ:インデックスを活用できるのでLIKEが効率的
LIKEを正しく使いこなせば、データベースからの情報検索がとても便利になります。
最初は簡単なパターンから始めて、少しずつ複雑な検索にチャレンジしてみてください!
コメント