SQL:論理演算(AND / OR / NOT)
1学習の目的
- AND / OR / NOT で複数の条件を組み合わせられるようになる。「PCカテゴリ、かつ在庫が少ない」といった実務の条件が書けるようになる。
- AND と OR の優先順位を理解し、括弧で意図どおりに制御できるようになる。エラーにならず結果だけが間違うという、最も危険なバグを防げるようになる。
2基礎解説
前章では条件を1つだけ書きました。実務の条件はほぼ複数です。それをつなぐのが AND / OR / NOT です。
| 演算子 | 意味 | 結果 |
|---|---|---|
| A AND B | かつ | 両方満たす行だけ |
| A OR B | または | どちらか満たせば |
| NOT A | 〜でない | 条件を反転 |
| ( ) | 優先順位を指定 | 先に評価される |
- AND は OR より先に評価される。掛け算が足し算より先に計算されるのと同じ。この優先順位が、意図しない結果を生む最大の原因になる。
- OR を使うときは括弧を付けるのを習慣にする。A OR B AND C は A OR (B AND C) と解釈される。(A OR B) AND C にしたければ自分で括弧を書くしかない。
- AND が増えるほど結果は減る(条件が厳しくなる)。OR が増えるほど結果は増える(条件が緩くなる)。想定より多い・少ないときは、この感覚で見当をつける。
- NOT は条件の前に置く。NOT IN・NOT LIKE・NOT BETWEEN のように、他の条件と組み合わせて使うことが多い。
- 括弧を付けても動作は遅くならない。迷ったら付けておくほうが、読む人にも意図が伝わって安全。
現場使用例:「関東エリア かつ 今月の注文」「未入金 または 期限切れ」「退会済みを除いた全会員」。条件が3つ4つと重なるのが実務の常態。
-- AND:両方を満たす(1万円以上 かつ 在庫10未満) SELECT name FROM products WHERE price >= 10000 AND stock < 10; -- OR:どちらかを満たす(PCカテゴリ または 在庫100超) SELECT name FROM products WHERE category = 'PC' OR stock > 100; -- ⚠ 優先順位の罠:AND が先に評価される SELECT name FROM products WHERE category = 'PC' OR category = '周辺機器' AND price < 5000; -- → 「PC」 または 「周辺機器かつ5000円未満」= 4件 -- ✅ 括弧で意図どおりに SELECT name FROM products WHERE (category = 'PC' OR category = '周辺機器') AND price < 5000; -- → 「PCか周辺機器」 かつ 「5000円未満」= 2件 -- NOT:条件を反転 SELECT name FROM products WHERE id NOT IN (1, 2);
3基本ドリル(10問)
2行。ノートPC / モニター
WHERE 条件1 AND 条件2 の形。
SELECT name FROM products WHERE price >= 10000 AND stock < 10;
AND は両方を満たす行だけを残す。条件を足すほど結果は減っていく。
A. (A OR B) AND C B. A OR (B AND C) C. 書いた順に左から D. エラーになる 選択★☆☆無料
解答 == B
AND と OR、どちらが先に評価されるか。
B
AND が OR より優先される。掛け算が足し算より先なのと同じ。エラーにならず結果だけが変わるので、気づかないまま間違った数字を報告する事故が起きる。
3行。ノートPC / モニター / USBメモリ
WHERE 条件1 OR 条件2 の形。
SELECT name FROM products WHERE category = 'PC' OR stock > 100;
OR はどちらか一方でも満たせば残る。条件を足すほど結果は増えていく。AND と逆の性質。
SELECT name FROM products WHERE price > 3000 ____ price < 50000;
3行。マウス / キーボード / モニター
「かつ」を意味するキーワード。
AND
同じ列に対して2つの条件を付けることもできる。ただし範囲なら BETWEEN のほうが読みやすい場合もある(SQL02)。
A. 増える B. 減る C. 変わらない D. 決まっていない 選択★☆☆無料
解答 == B
条件が厳しくなるのか、緩くなるのか。
B
AND は条件を厳しくするので減り、OR は緩くするので増える。結果が想定と違うとき、この感覚があると原因を絞り込みやすい。
3行。キーボード / モニター / USBメモリ
WHERE id NOT IN (1, 2) と書く。
SELECT name FROM products WHERE id NOT IN (1, 2);
「これ以外」を指定する書き方。除外したいIDが決まっているとき、条件を1つずつ <> で並べるより簡潔。
SELECT name FROM products WHERE ____category = 'PC' OR category = '周辺機器') AND price < 5000;
2行。マウス / USBメモリ
OR の部分を先に評価させるための記号。開きカッコを補う。
(
括弧が無いと4件になる。AND が先に評価され「PC」または「周辺機器かつ5000円未満」という別の意味になってしまう。
A. price > 10000 B. price < 10000 C. price <= 10000 D. price = 10000 選択★★☆無料
解答 == B
「10000以上ではない」を言い換えると。
B
「以上ではない」=「未満」。NOT は分かりにくくなりがちなので、可能なら反対の演算子で直接書くほうが読みやすい。
2行。マウス / USBメモリ
NOT LIKE を使う。LIKE の前に NOT を置く。
SELECT name FROM products WHERE name NOT LIKE '%ー%';
NOT LIKE はあいまい検索の除外。「テスト」を含む商品を除く、といった実務の絞り込みで使う。
3列2行。キーボード / モニター
AND を2回使って3つの条件をつなぐ。
SELECT name, price, stock FROM products WHERE price > 3000 AND price < 50000 AND stock < 20;
AND はいくつでもつなげられる。条件ごとに改行してインデントを揃えると、5個6個になっても読める形を保てる。
4実践シナリオ(5問)
3列2行。ノートPC / モニター
OR で2つの条件をつなぐ。
SELECT name, price, stock FROM products WHERE stock < 10 OR price >= 100000;
「どちらかに当てはまれば要注意」という監視の条件は OR で書く。今回はたまたま両方ノートPCとモニターだが、条件が別々の商品を拾うこともある。
商品 / 在庫数。マウス 42 / USBメモリ 120
AND で2条件をつなぎ、SELECT で AS を使う。
SELECT name AS 商品, stock AS 在庫数 FROM products WHERE price < 10000 AND stock >= 20;
「安くて在庫が潤沢」=すぐ出荷できる商品。キャンペーン対象を選ぶときなど、こういう条件で商品を抽出する。
3列2行。マウス / USBメモリ
OR の部分を括弧で囲んでから AND でつなぐ。括弧を忘れると4件になる。
SELECT name, price, category FROM products WHERE (category = 'PC' OR category = '周辺機器') AND price < 5000;
括弧を外すと4件になり、しかもエラーは出ない。「なぜか件数が多い」と気づければまだよいが、そのまま報告してしまう事故が実務では起きる。
3列2行。マウス / キーボード
<> で「PCではない」を表し、AND で価格条件をつなぐ。
SELECT name, category, price FROM products WHERE category <> 'PC' AND price >= 2000;
除外と絞り込みの組み合わせは実務で頻出。「退会者を除いた、今月の購入者」のような条件がまさにこの形。
3列4行。ノートPC / キーボード / モニター / USBメモリ
WHERE の中でも計算式が使える(SQL02のS03)。OR で2条件をつなぐ。
SELECT name, price * stock AS stock_value, stock FROM products WHERE price * stock >= 150000 OR stock >= 100;
「金額が大きい」か「数量が多い」——どちらも棚卸しで注意すべき商品。OR で観点の違う2つの条件を並べるのは、リスク管理の抽出でよく使う。
5仕上げ課題
条件(重点確認の定義)
・PC カテゴリ または 在庫金額が 15万円 以上
・かつ、在庫が 100 個未満(大量在庫の消耗品は対象外)
⚠ 括弧の使い方に注意。1つ目は「または」の条件、2つ目は「かつ」の条件です。
表示する列
① name → 別名「商品名」
② category → 別名「分類」
③ price → 別名「単価」
④ stock → 別名「在庫」
⑤ 在庫金額(price × stock)→ 別名「在庫金額」
期待される結果(5列 × 3行)
商品名 | 分類 | 単価 | 在庫 | 在庫金額
ノートPC | PC | 128000 | 5 | 640000
キーボード | 周辺機器 | 8500 | 18 | 153000
モニター | PC | 45000 | 7 | 315000
5列 × 3行が完全一致
OR でつないだ2つの条件を括弧で囲み、そのあと AND で在庫条件をつなぐ。括弧を忘れると USBメモリ(在庫120)が混ざるか、逆に結果が変わる。在庫金額は WHERE の中でも SELECT の中でも計算できる。
SELECT name AS 商品名, category AS 分類, price AS 単価, stock AS 在庫, price * stock AS 在庫金額 FROM products WHERE (category = 'PC' OR price * stock >= 150000) AND stock < 100;
括弧の有無で結果が変わる、最も実務的な例だ。もし括弧を外すと category = 'PC' OR (price * stock >= 150000 AND stock < 100) と解釈され、意味がまったく変わってしまう。
恐ろしいのはどちらもエラーにならないことだ。SQLは文法的に正しければ実行され、結果を返す。間違っているのは「意図」だけで、機械にはそれが分からない。だから OR を書いたら括弧を付ける——この習慣だけで、報告した数字が間違っていたという事故の多くを防げる。
条件を改行して揃えている点にも注目してほしい。WHERE の下に AND を縦に並べると、条件のかたまりが視覚的に分かれる。SQLは長くなるほど、この書き方の差が効いてくる。
次章では ORDER BY と LIMIT を学ぶ。「売上トップ5」のような、順位を持つ抽出ができるようになる。