#05 MySQLデータベースを使ってみよう
WHERE で絞り込む
WHERE句をマスターする
WHERE句? SELECT・UPDATE・DELETE文で行を絞り込む条件を指定する部分。`WHERE age >= 20 AND status = 'active'` のように複数条件を AND / OR で組み合わせられる。 句はSQLの中でも最も使用頻度が高い構文のひとつです。条件指定の精度が上がると、必要なデータだけを効率よく取得・操作できます。今回は様々な演算子と組み合わせを学びます。
比較演算子
最も基本的な条件指定です。
-- 等しい
SELECT * FROM users WHERE age = 30;
-- 等しくない
SELECT * FROM users WHERE age != 30;
-- または
SELECT * FROM users WHERE age <> 30;
-- より大きい / 以上
SELECT * FROM users WHERE age > 30;
SELECT * FROM users WHERE age >= 30;
-- より小さい / 以下
SELECT * FROM users WHERE age < 30;
SELECT * FROM users WHERE age <= 30;
AND / OR / NOT
複数の条件を組み合わせる論理演算子です。
-- AND: 両方の条件を満たす
SELECT * FROM users
WHERE age >= 20 AND is_active = TRUE;
-- OR: どちらかの条件を満たす
SELECT * FROM users
WHERE age < 20 OR age > 60;
-- NOT: 条件を反転
SELECT * FROM users
WHERE NOT is_active = TRUE;
-- ↑これは is_active = FALSE と同じ
AND・OR の優先順位に注意
AND は OR より優先順位が高いです。意図通りに動かすために括弧を使うことを推奨します。
-- ❌ 意図と違う可能性がある書き方
SELECT * FROM users
WHERE age < 20 OR age > 60 AND is_active = TRUE;
-- → AND が先に評価される: age < 20 OR (age > 60 AND is_active = TRUE)
-- ✅ 括弧で明示する
SELECT * FROM users
WHERE (age < 20 OR age > 60) AND is_active = TRUE;
BETWEEN … AND …
数値・日付の範囲指定に使います。両端の値を含む(以上・以下)ことに注意してください。
-- 年齢が20〜35歳(20と35を含む)
SELECT * FROM users
WHERE age BETWEEN 20 AND 35;
-- 上記は以下と同じ意味
SELECT * FROM users
WHERE age >= 20 AND age <= 35;
-- 日付の範囲(特定期間の注文を取得)
SELECT * FROM orders
WHERE created_at BETWEEN '2026-01-01' AND '2026-03-31';
-- NOT BETWEEN で範囲外を取得
SELECT * FROM products
WHERE price NOT BETWEEN 1000 AND 5000;
IN (…) / NOT IN
複数の値のどれかに一致するかを調べます。OR で並べるより簡潔に書けます。
-- 特定のカテゴリの商品を取得
SELECT * FROM products
WHERE category IN ('電子機器', '家電', 'PC周辺機器');
-- 上記はOR を使った以下と同じ意味
SELECT * FROM products
WHERE category = '電子機器'
OR category = '家電'
OR category = 'PC周辺機器';
-- IN に含まれないものを取得
SELECT * FROM products
WHERE category NOT IN ('食品', '飲料');
-- サブクエリと組み合わせる
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE total > 10000
);
LIKE / NOT LIKE
文字列のパターンマッチングに使います(Ep.03でも触れましたが、ここで詳しく解説します)。
-- % : 0文字以上の任意の文字列
SELECT * FROM users WHERE email LIKE '%@gmail.com'; -- gmail.comで終わる
SELECT * FROM users WHERE name LIKE '田%'; -- 「田」で始まる
SELECT * FROM users WHERE name LIKE '%田%'; -- 「田」を含む
-- _ : 任意の1文字
SELECT * FROM products WHERE code LIKE 'A_001'; -- A〇001 の形式
SELECT * FROM users WHERE name LIKE '__ __'; -- 姓2文字+スペース+名2文字
-- NOT LIKE: パターンに一致しないもの
SELECT * FROM users
WHERE email NOT LIKE '%test%';
パフォーマンス注意:
LIKE '%文字列'のように先頭が%のパターンはインデックスが使われず遅くなります。大量データでは全文検索(FULLTEXT INDEX)の利用を検討してください。
IS NULL / IS NOT NULL
NULL 値の確認には = ではなく IS NULL / IS NOT NULL を使います。
-- ageがNULLのユーザーを取得
SELECT * FROM users WHERE age IS NULL;
-- ageに値が入っているユーザーを取得
SELECT * FROM users WHERE age IS NOT NULL;
NULL の扱いに注意
NULL は「値が存在しない」状態です。NULL = NULL は TRUE にならないことに注意してください。
-- ❌ これはNULLのレコードを取得できない
SELECT * FROM users WHERE age = NULL; -- 常に0件
-- ✅ 正しい書き方
SELECT * FROM users WHERE age IS NULL;
-- NULLを比較演算子で使うと NULL(不明)になる
-- age が NULL のとき:
-- NULL = 30 → NULL(FALSEではなくNULL)
-- NULL != 30 → NULL(TRUEにもならない)
実践: 複合WHERE句
-- アクティブで、メールがgmail、年齢が25〜40歳のユーザー
SELECT id, name, email, age
FROM users
WHERE is_active = TRUE
AND email LIKE '%@gmail.com'
AND age BETWEEN 25 AND 40
ORDER BY age ASC;
-- 在庫あり、価格が1000〜50000円、特定カテゴリの商品を価格順で
SELECT name, price, stock, category
FROM products
WHERE stock > 0
AND price BETWEEN 1000 AND 50000
AND category IN ('電子機器', 'PC周辺機器')
ORDER BY price ASC
LIMIT 10;
まとめ
- 比較演算子(
=,!=,<,>,<=,>=)で値を比較する AND/ORで条件を組み合わせる。優先順位が不明なら括弧を使うBETWEEN a AND bで範囲指定(両端含む)IN (...)で複数値のどれかに一致するかを確認LIKEでパターンマッチ(先頭%は遅くなるので注意)- NULL の比較は
IS NULL/IS NOT NULLを使う
次回は複数テーブルを結合する JOIN を学びます。