SQLのLIKE句とワイルドカードとは?あいまい検索を使いこなすための完全ガイド

データベース・SQL

「顧客の名前が『田中』で始まる人を検索したい」「メールアドレスに『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%';

改善策

  1. 前方一致に変更できないか検討
  2. 全文検索インデックスの利用
  3. 検索専用の列を追加
  4. 事前に範囲を絞ってから検索

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文を書いてください。

  1. 名前が「佐藤」で始まる顧客
  2. メールアドレスが「co.jp」で終わる顧客
  3. 住所に「東京」を含む顧客

解答例

-- 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文を書いてください。

  1. 商品コードが「A」で始まり、3文字目が「1」のもの
  2. 電話番号が「080」「090」「070」のいずれかで始まるもの
  3. ファイル名が「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句とワイルドカードを使いこなせば、データベース検索の幅が大きく広がります。

まずは前方一致や部分一致から練習して、徐々に複雑な検索パターンにも挑戦してみてください。

実務で必要な柔軟な検索を、効率的に実現できるようになりますよ!

コメント

タイトルとURLをコピーしました