比較演算子とLIKEパターン

比較演算子とLIKEパターン とは

SQLでのデータ抽出に使う比較演算子と、LIKEパターンによるあいまい検索をSQLで実践的にマスターします。

なぜ重要か

アプリの検索機能を作るとき、完全一致だけでは要件を満たせません。「名前に『田』を含むユーザー」「メールアドレスが gmail.com で終わる人」「電話番号が 090 で始まる顧客」、こうした「部分一致」「前方一致」「後方一致」を実現するのが LIKE 句です。範囲条件には BETWEEN、複数候補には IN を使います。三つの演算子を覚えると、ほとんどの検索 UI を SQL 一行で実装できます。

また、現場では「未完了タスクで、かつ期限が今週中」のような複合条件をパッと書く力が問われます。本レッスンでは LIKEBETWEENIN を中心に、行を選ぶための強力な演算子を一気に学びます。

構文の全体像

SQL クエリ

-- 部分一致 WHERE name LIKE '%田%' -- 範囲指定 WHERE price BETWEEN 1000 AND 2000 -- 候補リスト WHERE category IN ('文具', '雑貨')

LIKEワイルドカードは二つです。% は「0 文字以上の任意の文字列」、_ (アンダースコア) は「ちょうど 1 文字」です。BETWEEN は両端を含む「以上以下」、IN はカンマ区切りで OR の代わりに使えます。

処理の流れ

diagram (will load when visible)

どの演算子も、最終的には行ごとに TRUE / FALSE / NULL を返すという点で WHERE と同じです。比較関数のバリエーションが増えただけ、と捉えると整理しやすいです。

代表例

例 1 は、名前に特定の文字列を含む行を取り出すケースです。

SQL クエリ

SELECT id, name FROM customers WHERE name LIKE '%田%';

'%田%' は「『田』の前後に何文字あってもよい」という意味です。'田%' なら前方一致 (『田』で始まる)、'%田' なら後方一致 (『田』で終わる) になります。検索ボックスのオートコンプリートは前方一致が定番です。

例 2 は、価格帯で絞り込むケースです。

SQL クエリ

SELECT id, name, price FROM products WHERE price BETWEEN 500 AND 1500;

BETWEEN a AND ba <= x AND x <= b と同じ意味です。境界値の扱いに迷ったときは BETWEEN を使うと両端を含むことが明確になります。

例 3 は、複数のカテゴリを一気に指定するケースです。

SQL クエリ

SELECT id, name, category FROM products WHERE category IN ('文具', '雑貨');

これは category = '文具' OR category = '雑貨' と同じです。候補が増えれば増えるほど IN のほうが読みやすく、SQL のレビュー効率も上がります。

ワイルドカードのエスケープ

ユーザーが入力した検索キーワードをそのまま LIKE に渡すと、%_ を入力されたときに意図しないマッチが起きます。\%\_ のように ESCAPE 句でエスケープするか、アプリ側で事前にサニタイズするのが鉄則です。SQL インジェクションの一種として扱うべきリスクです。

SQL クエリ

SELECT name FROM products WHERE name LIKE '20\%OFF%' ESCAPE '\\';

この例では \% を「文字としての %」と解釈させています。

NOT との組み合わせ

LIKE, BETWEEN, IN はそれぞれ NOT を前に付けて否定形にできます。WHERE category NOT IN ('文具', '雑貨') のように書けば、文具と雑貨以外を抽出できます。慣れるまでは括弧で囲んで WHERE NOT (category IN ('文具', '雑貨')) と書いても構いません。

パフォーマンスへの影響

LIKE は強力ですが、'%キーワード' のように先頭に % が来る後方一致は B-tree インデックスが効きません。先頭一致 'キーワード%' ならインデックスが効くため、検索画面では「前方一致」を選ぶのがパフォーマンス上のセオリーです。全文検索が必要なら FULLTEXT インデックスや専用の検索エンジン (OpenSearch、Meilisearch、Algolia など) の導入を検討します。

SQL クエリ

-- インデックスが効きやすい (前方一致) WHERE name LIKE '田%' -- インデックスが効きにくい (中間・後方一致) WHERE name LIKE '%田%' WHERE name LIKE '%郎'

小規模なテーブルなら気にする必要はありませんが、本番運用では検索 UI を設計する段階でこの制約を意識しておくと、後々の負荷対策がしやすくなります。

まとめ

  • LIKE で部分一致・前方一致・後方一致を表現できる
  • BETWEEN は両端を含む範囲指定。境界値が明確で読みやすい
  • IN は複数候補を OR の代わりに簡潔に書ける
  • ユーザー入力を LIKE に渡すときはワイルドカードのエスケープを忘れない
  • どれも NOT を前置すれば否定形になる
  • 後方一致や中間一致はインデックスが効きにくい。検索 UI の設計時に意識する

次のレッスン

次は AND/OR/NOTで複合条件 です。AND/OR/NOTを組み合わせて、複雑な条件でデータを絞り込みます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 比較・LIKE の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 比較・LIKE とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, city VARCHAR(30) NOT NULL, age INT NOT NULL ); INSERT INTO customers (id, name, email, city, age) VALUES (1, '田中 太郎', 'tanaka@example.com', '東京', 28), (2, '山田 花子', 'yamada@gmail.com', '大阪', 35), (3, '佐藤 一郎', 'sato@gmail.com', '東京', 42), (4, '鈴木 次郎', 'suzuki@example.com', '名古屋', 31), (5, '田村 三郎', 'tamura@yahoo.co.jp', '東京', 25), (6, '高橋 美咲', 'takahashi@gmail.com', '福岡', 38), (7, '伊藤 健太', 'ito@example.com', '札幌', 29);

期待される出力

idnameemail
2山田 花子yamada@gmail.com
3佐藤 一郎sato@gmail.com
6高橋 美咲takahashi@gmail.com

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...