#05 MySQLデータベースを使ってみよう

WHERE で絞り込む

WHERE句をマスターする

WHERE句? SELECT・UPDATE・DELETE文で行を絞り込む条件を指定する部分。`WHERE age >= 20 AND status = 'active'` のように複数条件を AND / OR で組み合わせられる。 句はSQLの中でも最も使用頻度が高い構文のひとつです。条件指定の精度が上がると、必要なデータだけを効率よく取得・操作できます。今回は様々な演算子と組み合わせを学びます。

WHERE 句で使える演算子一覧 比較演算子 = 等しい != / <> 等しくない < / > 小さい / 大きい <= / >= 以下 / 以上 IS NULL NULLである IS NOT NULL NULLでない 論理演算子 AND 両方の条件を満たす OR どちらかを満たす NOT 条件を反転する 優先順位 AND が OR より先に評価される 括弧()で明示的に指定推奨 範囲・リスト・パターン BETWEEN a AND b 範囲(両端含む) NOT BETWEEN a AND b 範囲外 IN (v1, v2, ...) いずれかに一致 LIKE 'パターン' パターン一致 NOT LIKE 'パターン' 不一致 組み合わせの例 WHERE age BETWEEN 20 AND 30 AND is_active = TRUE → 20〜30歳のアクティブユーザー WHERE category IN ('電子機器', '家電') AND price < 10000 → 指定カテゴリで1万円未満 WHERE email LIKE '%@gmail.com' AND age IS NOT NULL → gmailで年齢登録済みのユーザー WHERE (age < 20 OR age > 65) AND is_active = TRUE → 20歳未満または65歳超のアクティブユーザー
図1: WHERE句で使える演算子の一覧と使い分け

比較演算子

最も基本的な条件指定です。

-- 等しい
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 …

数値・日付の範囲指定に使います。両端の値を含む(以上・以下)ことに注意してください。

BETWEEN / IN / LIKE の動作イメージ BETWEEN age BETWEEN 25 AND 35 20 25 30 35 40 一致範囲(両端含む) age=22 → 除外 age=25 → 含まれる ✓ age=30 → 含まれる ✓ age=35 → 含まれる ✓ age=40 → 除外 IN category IN ('A', 'B', 'C') 検索対象リスト '電子機器' '家電' 'PC' '電子機器' → 含まれる ✓ '食品' → 除外 '家電' → 含まれる ✓ 'スポーツ' → 除外 'PC' → 含まれる ✓ LIKE email LIKE '%@gmail.com' ワイルドカード % = 0文字以上の任意の文字列 _ = 任意の1文字 taro@gmail.com → 一致 ✓ taro@yahoo.co.jp → 不一致 x@gmail.com → 一致 ✓ name LIKE '田_%' 田中太郎 → 一致 ✓(田+1文字+任意) 田 → 不一致(_が必要) 先頭が % のパターン(例: '%文字')はインデックスが効かないため大量データでは注意
図2: BETWEEN/IN/LIKEの動作イメージ
-- 年齢が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 = NULLTRUE にならないことに注意してください。

-- ❌ これは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 を学びます。