比較演算子とLIKEパターン
比較演算子とLIKEパターン とは
SQLでのデータ抽出に使う比較演算子と、LIKEパターンによるあいまい検索をSQLで実践的にマスターします。
なぜ重要か
アプリの検索機能を作るとき、完全一致だけでは要件を満たせません。「名前に『田』を含むユーザー」「メールアドレスが gmail.com で終わる人」「電話番号が 090 で始まる顧客」、こうした「部分一致」「前方一致」「後方一致」を実現するのが LIKE 句です。範囲条件には BETWEEN、複数候補には IN を使います。三つの演算子を覚えると、ほとんどの検索 UI を SQL 一行で実装できます。
また、現場では「未完了タスクで、かつ期限が今週中」のような複合条件をパッと書く力が問われます。本レッスンでは LIKE、BETWEEN、IN を中心に、行を選ぶための強力な演算子を一気に学びます。
構文の全体像
SQL クエリ
-- 部分一致
WHERE name LIKE '%田%'
-- 範囲指定
WHERE price BETWEEN 1000 AND 2000
-- 候補リスト
WHERE category IN ('文具', '雑貨')LIKE のワイルドカードは二つです。% は「0 文字以上の任意の文字列」、_ (アンダースコア) は「ちょうど 1 文字」です。BETWEEN は両端を含む「以上以下」、IN はカンマ区切りで OR の代わりに使えます。
処理の流れ
どの演算子も、最終的には行ごとに 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 b は a <= 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 つができることを確認しましょう。
- 比較・LIKE の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (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);期待される出力
| id | name | |
|---|---|---|
| 2 | 山田 花子 | yamada@gmail.com |
| 3 | 佐藤 一郎 | sato@gmail.com |
| 6 | 高橋 美咲 | takahashi@gmail.com |