SQL:WHERE で絞り込む
1学習の目的
- WHERE で条件を指定し、必要な行だけを取り出せるようになる。1万件のテーブルから欲しい数件だけを引ける状態になる。
- 比較演算子・BETWEEN・IN・LIKE を使い分けられるようになる。ここからSQLが「探す道具」として使えるようになる。
2基礎解説
前章では常に全件が返ってきました。WHERE を付けると「条件に合う行だけ」に絞り込めます。
| やりたいこと | 書き方 | 意味 |
|---|---|---|
| 一致する行 | WHERE category = 'PC' | 文字列はシングルクォート |
| 数値で比較 | WHERE price >= 10000 | > < >= <= = |
| 範囲で絞る | WHERE price BETWEEN 3000 AND 50000 | 両端を含む |
| 複数の候補 | WHERE id IN (1, 3, 5) | どれかに一致 |
- 文字列はシングルクォート ' で囲む。数値は囲まない。ダブルクォートは環境によって意味が変わるので、文字列には必ずシングルを使う。
- 命令は大文字小文字を区別しないが、データの中身は区別する。SELECT でも select でも動くが、'PC' と 'pc' は別物で、後者は0件になる。
- 「等しくない」は <> または !=。どちらも同じ意味で、<> のほうが古くからある正式な書き方。
- BETWEEN a AND b はa も b も含む。「3000円以上5万円以下」がそのまま書ける。
- LIKE であいまい検索ができる。% は任意の文字列、_ は任意の1文字。'%マウス%' で「マウスを含む」。
現場使用例:特定の顧客の注文だけ抽出、今月の売上だけ集計、在庫切れ商品の一覧、キーワードを含む商品の検索。実務のSQLはほぼすべて WHERE が付く。
-- 1万円以上の商品だけ SELECT name, price FROM products WHERE price >= 10000; -- カテゴリが PC のものだけ(文字列はシングルクォート) SELECT * FROM products WHERE category = 'PC'; -- 範囲で絞る(3000円以上 50000円以下) SELECT name, price FROM products WHERE price BETWEEN 3000 AND 50000; -- 複数の候補から(id が 1 か 3 か 5) SELECT name FROM products WHERE id IN (1, 3, 5); -- あいまい検索(名前に「ー」を含む) SELECT name FROM products WHERE name LIKE '%ー%';
3基本ドリル(10問)
name / price の2列。ノートPC と モニター
WHERE price >= 10000 を FROM の後ろに付ける。
SELECT name, price FROM products WHERE price >= 10000;
SELECT(何を)→ FROM(どこから)→ WHERE(どんな条件で)という語順。この3つがSQLの基本構造になる。
A. 正しく動く B. エラーになる C. 全件返る D. 0件返る 選択★☆☆無料
解答 == B
クォートが無いと、SQLはそれを何だと解釈するか。
B
クォートが無いと「pc という名前の列」だと解釈される。そんな列は存在しないのでエラーになる。文字列は必ずシングルクォートで囲む。
5列。ノートPC と モニターの2行
WHERE category = 'PC' と書く。文字列はシングルクォート。
SELECT * FROM products WHERE category = 'PC';
文字列の一致は = で判定する。プログラミング言語では == と書くことが多いが、SQLは1つでよい。
SELECT name FROM products ____ stock < 10;
name に ノートPC と モニター
「〜という条件で」を意味するキーワード。
WHERE
WHERE は行を絞り込むための句。これが無いと全件が対象になる。
A. PC の2件が返る B. 0件になる C. 全件返る D. エラーになる 選択★☆☆無料
解答 == B
命令と、データの中身。どちらが大文字小文字を区別するか。
B
命令は区別しないが、データの中身は区別する。エラーにならず静かに0件が返るので、「なぜかヒットしない」の原因になりやすい。
3行。マウス / キーボード / モニター
WHERE price BETWEEN 3000 AND 50000 と書く。両端を含む。
SELECT name, price FROM products WHERE price BETWEEN 3000 AND 50000;
price >= 3000 AND price <= 50000 と同じ意味だが、BETWEEN のほうが意図が明確で読みやすい。
SELECT name FROM products WHERE id ____ (1, 3, 5);
3行。ノートPC / キーボード / USBメモリ
「〜の中に」を意味する2文字のキーワード。
IN
id = 1 OR id = 3 OR id = 5 と書くより短い。候補が10個20個になっても IN なら1行で済む。
A. マウスで始まる B. マウスで終わる C. マウスを含む D. マウスと完全一致 選択★★☆無料
解答 == B
% は「任意の文字列」。それが前に付いている。
B
% の位置で意味が変わる。'マウス%' は前方一致、'%マウス' は後方一致、'%マウス%' は部分一致。
3行。マウス / キーボード / USBメモリ
「等しくない」は <> または != を使う。
SELECT name FROM products WHERE category <> 'PC';
<> と != はどちらも同じ。SQLの正式な書き方は <> だが、実務ではどちらも見かける。
3行。ノートPC / キーボード / モニター
WHERE name LIKE '%ー%' と書く。前後に % を付けると部分一致。
SELECT name FROM products WHERE name LIKE '%ー%';
検索機能の実装はこの形。ユーザーが入力したキーワードを % で挟めば、あいまい検索になる。
4実践シナリオ(5問)
商品 / 残り の2列。ノートPC 5 と モニター 7
WHERE で絞り、SELECT で AS を使う(SQL01)。
SELECT name AS 商品, stock AS 残り FROM products WHERE stock < 10;
絞り込みと別名は組み合わせられる。実務のレポートは「条件に合う行を、読みやすい列名で」というこの形がほとんど。
3行。マウス / キーボード / USBメモリ
「以下」は <= を使う。< だと10000円ちょうどが漏れる。
SELECT name, price FROM products WHERE price <= 10000;
「以下」と「未満」の取り違えは実務でも起きる。< と <= の1文字違いで、境界の1件が結果から消える。
2行。ノートPC 640000 / モニター 315000
WHERE の中でも計算式が使える。WHERE price * stock >= 200000 と書く。
SELECT name, price * stock AS stock_value FROM products WHERE price * stock >= 200000;
WHERE の中で計算できるのがポイント。保存されていない値でも条件にできるので、「粗利が◯円以上」といった絞り込みが可能になる。
3列3行。マウス / キーボード / USBメモリ
日本語の値も条件に使える。シングルクォートで囲むのは同じ。
SELECT name AS 商品名, price AS 価格, stock AS 在庫 FROM products WHERE category = '周辺機器';
日本語のデータもそのまま条件にできる。ただし全角・半角や表記ゆれ(「周辺機器」と「周辺機器 」)があると一致しないので、実務ではデータの整理が重要になる。
3列2行。マウス 3200 3520 / モニター 45000 49500
WHERE id IN (2, 4) で絞り、SELECT で CAST を使う(SQL01のS04)。
SELECT name, price, CAST(price * 1.1 AS INTEGER) AS tax_price FROM products WHERE id IN (2, 4);
IDを指定して複数件を引くのは、システム間の連携でよく使う形。「この注文に含まれる商品を全部取ってきて」という処理はまさにこれ。
5仕上げ課題
条件
・価格が 10000 円以上
・かつ、在庫が 10 個未満
※ 2つの条件は AND でつなぐ(詳しくは次章で扱うが、ここでは「かつ」の意味で使ってよい)
表示する列
① name → 別名「商品名」
② price → 別名「単価」
③ stock → 別名「在庫」
④ 在庫金額(price × stock)→ 別名「在庫金額」
期待される結果(4列 × 2行)
商品名 | 単価 | 在庫 | 在庫金額
ノートPC | 128000 | 5 | 640000
モニター | 45000 | 7 | 315000
4列 × 2行が完全一致
WHERE price >= 10000 AND stock < 10 と2つの条件をつなぐ。SELECT では4つの列を AS で別名を付けて並べる。在庫金額は price * stock。
SELECT name AS 商品名, price AS 単価, stock AS 在庫, price * stock AS 在庫金額 FROM products WHERE price >= 10000 AND stock < 10;
5件のテーブルから、条件に合う2件だけを取り出せた。これが1万件でも10万件でも、SQLは同じ1本で済む——ここがExcelのフィルタと決定的に違う点だ。
注目してほしいのはWHERE の書き方だ。条件を改行してインデントすると、「価格が1万円以上」「かつ在庫が10未満」という2つの条件が視覚的に分かれて読める。条件が5個6個と増えていくと、この書き方の差が効いてくる。
そしてこの結果は「発注すべき商品」そのものだ。単価が高い商品の在庫が切れると売上への影響が大きい。SQLはデータを取り出す道具だが、取り出し方を考えることは、そのまま業務の課題を考えることでもある。
次章では AND / OR / NOT を本格的に扱う。「PCカテゴリ、または在庫切れ間近」のような複雑な条件を、正確に組み立てられるようになる。