SQLのLIKE演算子をマスター!文字検索の基本から応用まで完全解説

データベース・SQL

「田中さんって名前の人、データベースに何人いるかな?」 「メールアドレスが@gmail.comで終わる人を全員抽出したい」

こんな時に大活躍するのが、SQLのLIKE演算子(ライク演算子)です。

例えるなら、LIKEは「あいまい検索ができる魔法の虫眼鏡」のようなもの。完全に一致しなくても、似ているデータを見つけ出してくれます。

この記事を読めば、あなたも今日からLIKE演算子を使いこなせるようになりますよ!


スポンサーリンク

そもそもLIKE演算子って何?基本をおさえよう

普通の検索(=)との違い

まず、普通の検索方法と比較してみましょう。

通常の検索(完全一致):

SELECT * FROM users WHERE name = '田中太郎'

これだと「田中太郎」さんしか見つかりません。

LIKE演算子を使った検索:

SELECT * FROM users WHERE name LIKE '田中%'

これなら「田中太郎」「田中花子」「田中一郎」全員が見つかります!

つまり、部分的に一致するデータを探せるのがLIKE演算子の特徴なんです。

LIKE演算子が活躍する場面

実際の仕事でよく使われる場面を見てみましょう。

こんな時に便利:

  • 名前の一部しか覚えていない顧客を探す
  • 特定のドメインのメールアドレスを抽出
  • 商品名に特定のキーワードが含まれる商品を検索
  • 電話番号が特定の市外局番で始まる人を探す
  • 住所が特定の都道府県の人だけを抽出

データベースを扱う仕事では、ほぼ毎日使うと言っても過言ではありません。


魔法の記号「ワイルドカード」を使いこなそう

%(パーセント):何文字でもOKの万能選手

**%は「0文字以上の任意の文字」**を表します。

分かりやすく言うと、「ここは何が来てもいいよ、なくてもいいよ」という意味です。

実例で理解しよう:

-- 「山」で始まる名前を全部探す
SELECT * FROM users WHERE name LIKE '山%'
-- 結果:山田、山本、山口、山川、山...
-- 「子」で終わる名前を全部探す
SELECT * FROM users WHERE name LIKE '%子'
-- 結果:花子、良子、美子、優子...
-- 「田」が含まれる名前を全部探す
SELECT * FROM users WHERE name LIKE '%田%'
-- 結果:田中、山田、前田、田村、吉田...

_(アンダースコア):1文字だけの指定席

**_は「任意の1文字」**を表します。

「ここは何でもいいけど、必ず1文字入れてね」という意味です。

実例で理解しよう:

-- 「田□」の2文字の名前を探す(□は任意の1文字)
SELECT * FROM users WHERE name LIKE '田_'
-- 結果:田中、田村、田口...(田だけではヒットしない)
-- 電話番号が「03-1234-56□□」の形式を探す
SELECT * FROM users WHERE phone LIKE '03-1234-56__'
-- 結果:03-1234-5678、03-1234-5600、03-1234-5611...

組み合わせ技で検索の幅を広げる

ワイルドカードは組み合わせて使うこともできます。

-- 2文字目が「田」の3文字の名前
SELECT * FROM users WHERE name LIKE '_田_'
-- 結果:前田勇、小田切、太田原...
-- 「株式会社」で始まり「商事」で終わる会社名
SELECT * FROM companies WHERE name LIKE '株式会社%商事'
-- 結果:株式会社三井商事、株式会社伊藤商事...

実践!よく使うLIKEパターン集

パターン1:メールアドレスのドメイン検索

特定のメールサービスを使っている人を探したい時の定番パターンです。

-- Gmailユーザーを探す
SELECT * FROM users WHERE email LIKE '%@gmail.com'

-- 会社のメールアドレス(co.jp)を使っている人
SELECT * FROM users WHERE email LIKE '%@%.co.jp'

パターン2:電話番号の地域検索

市外局番で地域を絞り込む時に便利です。

-- 東京(03)の電話番号
SELECT * FROM customers WHERE phone LIKE '03-%'

-- 携帯電話(090、080、070)
SELECT * FROM customers 
WHERE phone LIKE '090-%' 
   OR phone LIKE '080-%' 
   OR phone LIKE '070-%'

パターン3:商品名・カテゴリ検索

ECサイトなどでよく使われるパターンです。

-- 「ゲーミング」という言葉が入った商品
SELECT * FROM products WHERE name LIKE '%ゲーミング%'

-- 型番が「A」で始まり「2024」で終わる商品
SELECT * FROM products WHERE model LIKE 'A%2024'

パターン4:日付の部分検索

特定の年や月のデータを抽出する時に使えます。

-- 2024年のデータ(日付が文字列の場合)
SELECT * FROM orders WHERE order_date LIKE '2024-%'

-- 12月のデータ(どの年でも)
SELECT * FROM orders WHERE order_date LIKE '%-12-%'

大文字小文字の扱い:データベースによって違うので注意!

基本ルール(でも例外あり)

実は、大文字小文字の扱いは使っているデータベースによって違います

主なデータベースの違い:

MySQL(デフォルト):

-- これらは同じ結果になる(大文字小文字を区別しない)
SELECT * FROM users WHERE name LIKE 'yamada%'
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のみ

-- 区別したくない場合はILIKEを使う
SELECT * FROM users WHERE name ILIKE 'yamada%'  -- 全部ヒット

確実に検索するためのテクニック

大文字小文字を気にせず検索したい場合の対処法です。

-- 方法1:LOWER関数で小文字に統一
SELECT * FROM users 
WHERE LOWER(name) LIKE LOWER('Yamada%')

-- 方法2:UPPER関数で大文字に統一  
SELECT * FROM users 
WHERE UPPER(name) LIKE UPPER('Yamada%')

よくある間違いと解決方法

間違い1:ワイルドカードを付け忘れる

-- ❌ これだと完全一致検索になってしまう
SELECT * FROM users WHERE name LIKE '田中'

-- ⭕ 部分一致にするなら%を付ける
SELECT * FROM users WHERE name LIKE '%田中%'

間違い2:特殊文字をそのまま検索

メールアドレスの「_」や「%」を検索したい時は要注意!

-- ❌ test_userというメールを探したいのに...
SELECT * FROM users WHERE email LIKE 'test_user@%'
-- これだと「test」+任意の1文字+「user」になってしまう

-- ⭕ エスケープ文字を使う
SELECT * FROM users WHERE email LIKE 'test\_user@%' ESCAPE '\'

間違い3:NULLデータの扱い

LIKEではNULL(空っぽ)のデータは検索できません。

-- ❌ これではNULLは見つからない
SELECT * FROM users WHERE memo LIKE '%'

-- ⭕ NULLを探すには専用の方法を使う
SELECT * FROM users WHERE memo IS NULL

-- ⭕ NULLも含めて全部見たい場合
SELECT * FROM users WHERE memo LIKE '%' OR memo IS NULL

間違い4:パフォーマンスを考えない検索

-- ❌ 前方一致以外は処理が遅い
SELECT * FROM users WHERE name LIKE '%田中%'  -- 遅い

-- ⭕ できれば前方一致で検索
SELECT * FROM users WHERE name LIKE '田中%'  -- 速い

応用テクニック:もっと便利に使う方法

NOT LIKEで除外検索

「〜以外」を探したい時に使います。

-- Gmail以外のメールアドレス
SELECT * FROM users WHERE email NOT LIKE '%@gmail.com'

-- 「株式会社」が付かない会社名
SELECT * FROM companies WHERE name NOT LIKE '株式会社%'

複数条件の組み合わせ

ORやANDと組み合わせて、より細かい検索ができます。

-- 東京または大阪在住
SELECT * FROM users 
WHERE address LIKE '%東京都%' 
   OR address LIKE '%大阪府%'

-- 名前に「田」が入っていて、かつGmailユーザー
SELECT * FROM users 
WHERE name LIKE '%田%' 
  AND email LIKE '%@gmail.com'

CASE文と組み合わせて分類

検索結果を分類する時に便利です。

SELECT name,
  CASE 
    WHEN email LIKE '%@gmail.com' THEN 'Gmail'
    WHEN email LIKE '%@yahoo.co.jp' THEN 'Yahoo'
    WHEN email LIKE '%@%.co.jp' THEN '企業メール'
    ELSE 'その他'
  END AS mail_type
FROM users

正規表現が使える場合(MySQL、PostgreSQL)

もっと複雑なパターンを検索したい時は正規表現も選択肢です。

-- MySQLの場合(REGEXP)
SELECT * FROM users WHERE phone REGEXP '^0[789]0-'

-- PostgreSQLの場合(~)
SELECT * FROM users WHERE phone ~ '^0[789]0-'

パフォーマンスを意識した使い方

インデックスが効く条件・効かない条件

データベースの検索速度に大きく影響する重要なポイントです。

インデックスが効く(速い):

-- 前方一致検索
SELECT * FROM users WHERE name LIKE '田中%'

インデックスが効かない(遅い):

-- 中間一致・後方一致検索
SELECT * FROM users WHERE name LIKE '%田中%'
SELECT * FROM users WHERE name LIKE '%田中'

大量データを扱う時の工夫

データが多い時は、こんな工夫をしてみましょう。

工夫1:検索範囲を絞る

-- 期間を限定してから検索
SELECT * FROM logs 
WHERE created_at >= '2024-01-01'
  AND message LIKE '%ERROR%'

工夫2:全文検索機能を使う

-- MySQLのFULLTEXT検索(事前設定が必要)
SELECT * FROM articles 
WHERE MATCH(content) AGAINST('検索キーワード')

まとめ:今日から使えるLIKE演算子

ここまで読んでいただき、ありがとうございます!

LIKE演算子の基本から応用まで、たくさんのパターンを見てきました。

覚えておきたい3つのポイント:

  1. %は0文字以上、_は1文字という基本を押さえる
  2. 前方一致検索(’文字%’)が最も高速
  3. データベースによって大文字小文字の扱いが違う

最初は簡単な検索から始めて、徐々に複雑な条件にチャレンジしていきましょう。

実践のコツ: まずは自分が普段使っているデータで、簡単な名前検索から試してみてください。慣れてきたら、メールアドレスや電話番号の検索にも挑戦してみましょう。

SQLのLIKE演算子は、データベースを扱う上で必須のスキル。この記事で学んだことを実際のデータベースで試して、ぜひマスターしてくださいね!

何度も使っているうちに、自然と手が動くようになりますよ。頑張ってください!

コメント

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