比較演算子とLIKEパターン
「コーヒー」で検索しても、1 件も出てこない
検索窓に「コーヒー」と入れた人が探しているのは、コーヒー豆 ブレンド や コーヒー豆 シングル です。ところが WHERE name = 'コーヒー' と書くと、結果は 0 件になります。= は、文字列がまるごと一致した行しか返さないからです。
一部だけ一致すればよい、という比べ方をするのが LIKE です。
SQL クエリ
SELECT id, name
FROM products
WHERE name LIKE 'コーヒー%';% は「ここに 0 文字以上の何かが入ってよい」という記号です。'コーヒー%' なら前方一致、'%セット' なら後方一致、'%豆%' なら前後どこにあってもよい部分一致になります。もう 1 つ _ があり、こちらは「ちょうど 1 文字」を表します。'A_00' は A100 に一致し、A1000 には一致しません。
範囲は BETWEEN、候補が複数なら IN
「500 円から 1500 円まで」のような範囲は >= と <= を 2 つ書いても表せますが、BETWEEN のほうが境界の扱いがはっきりします。
SQL クエリ
SELECT id, name, price
FROM products
WHERE price BETWEEN 500 AND 1500;BETWEEN a AND b は両端を含みます。500 円ちょうどの商品も、1500 円ちょうどの商品も結果に入ります。
候補がいくつかある場合は IN です。
SQL クエリ
SELECT id, name, category
FROM products
WHERE category IN ('文具', '雑貨');候補が 5 つ 10 個と増えても 1 行のままなので、読みやすさが変わりません。LIKE も BETWEEN も IN も、前に NOT を置けば否定になります。
記号として打たれた % を、記号のまま渡さない
検索窓の入力をそのまま LIKE に渡すと、利用者が % と打った瞬間に全件が一致します。_ も同じです。アプリ側で打ち消してから渡すか、ESCAPE で「次の 1 文字は記号ではなく文字として読む」と指定します。
SQL クエリ
SELECT name
FROM products
WHERE name LIKE '20#%OFF%' ESCAPE '#';# の直後に来た % は文字としての %、末尾の % はワイルドカードとして解釈されます。
演習では customers から、メールアドレスの末尾で顧客を絞り込みます。
テーブル構造
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 |