WHERE句で条件絞り込み
100 万行を受け取ってから、アプリで捨てている
社員テーブルに 100 万行あるとします。開発部の名簿を出したいだけなのに、全行を取り出してからアプリ側で部署を見て捨てる、という書き方をすると、毎回 100 万行ぶんの転送とメモリを使います。ほしいのは 300 行です。
行を選ぶ仕事は、データベース側にやらせます。そのための句が WHERE です。
SQL クエリ
SELECT id, name
FROM employees
WHERE department = '開発部';前回の SELECT が列を決める句だったのに対して、WHERE は行を決める句です。縦に切るのが SELECT、横に切るのが WHERE と持っておくと、2 つの役割が混ざりません。
残るのは、条件が真になった行だけ
WHERE に書いた式は、行ごとに 1 回ずつ評価されます。結果が真になった行だけが残り、偽になった行は結果に入りません。
SQL クエリ
SELECT id, name, salary
FROM employees
WHERE salary >= 400000;比較に使える記号は、等しい =、等しくない <>、大小の < <= > >= です。<> は != と書いても同じ結果になりますが、標準は <> のほうなので、チーム内ではどちらかに揃えておきます。
文字列を書くときはシングルクォートで囲みます。ダブルクォートを列名の記号として扱うデータベースがあるため、文字列は必ず ' にしておくと移し替えるときに困りません。
同じ記号は、数値以外にも使えます。文字列なら辞書の並び順で、日付なら時系列で比べられるので、WHERE hired_on >= '2026-04-01' と書けば今年度に入社した人が残ります。列の型さえ合っていれば、比べ方は 1 種類しか覚えなくて済みます。
SELECT で付けた別名は、WHERE では使えない
WHERE でつまずくのは、たいていここです。
SQL クエリ
-- エラーになる
SELECT name, salary AS 月給
FROM employees
WHERE 月給 >= 400000;WHERE が動くのは行を絞る段階で、結果の列名が決まるより前です。まだ存在しない 月給 は参照できません。この場合は WHERE salary >= 400000 と、元の列名でもう一度書きます。
演習では products から、価格が一定以上の商品だけを取り出します。
テーブル構造
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);期待される出力
| id | name | category | price |
|---|---|---|---|
| 1 | コーヒー豆 ブレンド | 食品 | 1200 |
| 5 | ドリッパー V60 | 雑貨 | 2500 |
| 6 | コーヒー豆 シングル | 食品 | 1800 |