WHERE句で条件絞り込み

このレッスンで分かること

  • WHERE は行のフィルタ、条件が TRUE の行だけ結果に残ります
  • 文字列はシングルクォート、NULL 判定は必ず IS NULL / IS NOT NULL
  • 最小例は SELECT name FROM employees WHERE department = '開発部';

WHERE句で条件絞り込み とは

WHERE句を使って、特定の条件に合うデータだけを抽出する方法を学びます。本レッスンでは、WHERE句で条件絞り込み の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

テーブルに 100 万件のレコードが入っていても、ユーザーが画面に出したいのは「自分が買った商品」「今月の売上」「未読の通知」など、ほんのひと握りの行だけです。SELECT で列を選んだあとに、行を選ぶための仕組みが WHERE 句です。WHERE を使いこなせるかどうかで、検索画面・レポート画面・絞り込み機能・バッチ処理の精度すべてが決まります。WHERE 句を制した者はビジネスデータを制する、と言ってもよいくらいです。

アプリケーションのバグは「不要な行が混ざる」「必要な行が抜ける」のどちらかであることが多く、原因の九割が WHERE 句の論理ミスです。だからこそ、本レッスンでは比較演算子の使い分けと NULL の扱いまで踏み込んで学びます。

構文の全体像

SQL クエリ

SELECT <列リスト> FROM <テーブル> WHERE <条件式>;

条件式が真 (TRUE) になった行だけが結果に残ります。偽 (FALSE) や NULL (不明) の行は捨てられます。条件式には等号 =、不等号 <> (!= も可)、比較 < <= > >= などが書けます。

複数条件を組み合わせるには ANDORNOT を使いますが、それは後続のレッスンで扱います。本レッスンではまず「単一の条件で行を絞る」感覚を体に染み込ませます。

処理の流れ

diagram (will load when visible)

論理的には WHERE のほうが SELECT より先に処理されると考えると分かりやすいです。先に行を絞り込んでから、そのうえで列を選び出す、という流れです。物理的にはデータベースエンジンが最適化して順番を入れ替えますが、結果の理解にはこの順序で十分です。

比較演算子の早見表

演算子意味
=等しいWHERE category = '文具'
<> (!=)等しくないWHERE category <> '文具'
< <= > >=大小比較WHERE price >= 1000
IS NULLNULL 判定WHERE manager_id IS NULL
IS NOT NULL非 NULL 判定WHERE phone IS NOT NULL
BETWEEN a AND b範囲WHERE age BETWEEN 20 AND 39
IN (...)集合WHERE id IN (1, 2, 3)
LIKE 'A%'パターン一致WHERE name LIKE 'A%'

比較演算子は数値、文字列、日付の三つで共通して使えるのが SQL の良いところです。後のレッスンで学ぶ LIKEINBETWEEN は、いずれもこの基本比較を拡張したものに過ぎません。基本を押さえれば応用も自然に理解できます。

代表例

例 1 は、特定の部署のメンバーだけを取り出すケースです。

SQL クエリ

SELECT name, salary FROM employees WHERE department = '開発部';

文字列リテラルはシングルクォートで囲みます。ダブルクォートは識別子用に予約されているデータベースもあるため、文字列は必ず ' を使う癖を付けると安全です。

例 2 は、数値の比較で範囲を指定するケースです。

SQL クエリ

SELECT name, salary FROM employees WHERE salary >= 400000;

比較演算子は数値、文字列、日付すべてに使えます。文字列の場合は辞書順 (照合順序による)、日付の場合は時系列順で比較されます。

例 3 は、不等号で除外するケースです。

SQL クエリ

SELECT id, name, department FROM employees WHERE department <> '人事部';

<> は「等しくない」を意味します。!= でも同じ結果になりますが、SQL 標準は <> です。チーム内で揃えておくとレビューが楽になります。

NULL の扱いに注意

NULL は「値がない」という状態を表します。NULL は「等しくない」かというと、それすら不明 (UNKNOWN) になります。つまり WHERE col = NULL は何もヒットしません。NULL を判定したいときは IS NULL または IS NOT NULL を使います。

SQL クエリ

SELECT name FROM employees WHERE manager_id IS NULL;

この書き方で「上司がまだ割り当てられていない社員」を抽出できます。

よくある落とし穴

WHERE 句で書く列名は、原則テーブルに存在する列でなければなりません。SELECT で AS で付けた別名は、ほとんどの DBMS で WHERE では使えません。別名を条件にしたい場合はサブクエリにするか、同じ式を WHERE にもう一度書く必要があります。

大文字小文字の扱いも要注意です。MySQLTiDB のデフォルト照合順序は大文字小文字を区別しないため、'Tokyo''tokyo' は等しいと判定されます。PostgreSQL は区別する設定が多いので、移行時に挙動差が出やすいポイントです。

実務でよく書く形

社内アプリで「期限切れタスク」「在庫切れ商品」「未承認ユーザー」のように、状態を絞り込むクエリは毎日のように書きます。WHERE が一行入るだけでテーブル全体から目的の行が浮かび上がるのは、SQL の魅力のひとつです。

この章のポイント

ここまでの要点 WHERE は「行のフィルタ」、TRUE の行だけ残す。文字列はシングルクォート、NULL は IS NULL。SELECT の AS 別名は WHERE では使えない、大文字小文字は照合順序次第。

まとめ

  • WHERE は「行の選択 (selection)」を行う命令
  • 条件式は TRUE/FALSE/NULL のいずれかに評価され、TRUE の行だけが残る
  • 文字列リテラルはシングルクォート、列名はクォートしないかバッククォート
  • NULL の判定は IS NULL / IS NOT NULL を使う
  • WHERE で SELECT の AS 別名は使えないことが多い

次のレッスン

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

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

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

理解度チェック (30 秒)

Q. WHERE 句 とは何か、1 文で説明してください。

この章のポイント

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

関連レッスン

テーブル構造

schema.sql

CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, category VARCHAR(30) NOT NULL, price INT NOT NULL, stock INT NOT NULL ); INSERT INTO products (id, name, category, price, stock) VALUES (1, 'コーヒー豆 ブレンド', '食品', 1200, 50), (2, 'マグカップ 白', '雑貨', 800, 120), (3, 'ノート A5', '文具', 350, 200), (4, 'ボールペン 黒', '文具', 150, 500), (5, 'ドリッパー V60', '雑貨', 2500, 30), (6, 'コーヒー豆 シングル', '食品', 1800, 25), (7, 'ふせん 100枚', '文具', 220, 300);

期待される出力

idnamecategoryprice
1コーヒー豆 ブレンド食品1200
5ドリッパー V60雑貨2500
6コーヒー豆 シングル食品1800

ヒント

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