【初心者向け】SQLのLIKE演算子を完全マスター|あいまい検索の基本と応用テクニック

データベース・SQL

「名前が”山田”で始まる人を検索したい」
「メールアドレスに”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を正しく使いこなせば、データベースからの情報検索がとても便利になります。

最初は簡単なパターンから始めて、少しずつ複雑な検索にチャレンジしてみてください!

コメント

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