SQL / LESSON 03 / SQL03

SQL:論理演算(AND / OR / NOT)

1学習の目的

2基礎解説

前章では条件を1つだけ書きました。実務の条件はほぼ複数です。それをつなぐのが AND / OR / NOT です。

演算子意味結果
A AND Bかつ両方満たす行だけ
A OR Bまたはどちらか満たせば
NOT A〜でない条件を反転
( )優先順位を指定先に評価される
✅ 覚えるべき重要ポイント
  1. AND は OR より先に評価される。掛け算が足し算より先に計算されるのと同じ。この優先順位が、意図しない結果を生む最大の原因になる。
  2. OR を使うときは括弧を付けるのを習慣にする。A OR B AND CA OR (B AND C) と解釈される。(A OR B) AND C にしたければ自分で括弧を書くしかない。
  3. AND が増えるほど結果は減る(条件が厳しくなる)。OR が増えるほど結果は増える(条件が緩くなる)。想定より多い・少ないときは、この感覚で見当をつける。
  4. NOT は条件の前に置く。NOT INNOT LIKENOT BETWEEN のように、他の条件と組み合わせて使うことが多い。
  5. 括弧を付けても動作は遅くならない。迷ったら付けておくほうが、読む人にも意図が伝わって安全。

現場使用例:「関東エリア かつ 今月の注文」「未入金 または 期限切れ」「退会済みを除いた全会員」。条件が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問)

SQL03-D01 価格が 10000円以上 かつ 在庫が 10個未満の商品の name を取り出すSQLを書け。 コーディング★☆☆無料
期待される結果

2行。ノートPC / モニター

ヒント

WHERE 条件1 AND 条件2 の形。

模範解答
SELECT name
FROM products
WHERE price >= 10000
  AND stock < 10;
解説

AND は両方を満たす行だけを残す。条件を足すほど結果は減っていく。

SQL03-D02 A OR B AND C はどう解釈されるか。
A. (A OR B) AND C B. A OR (B AND C) C. 書いた順に左から D. エラーになる
選択★☆☆無料
期待される結果

解答 == B

ヒント

AND と OR、どちらが先に評価されるか。

模範解答
B
解説

AND が OR より優先される。掛け算が足し算より先なのと同じ。エラーにならず結果だけが変わるので、気づかないまま間違った数字を報告する事故が起きる。

SQL03-D03 category が 'PC' または 在庫が 100個より多い商品の name を取り出すSQLを書け。 コーディング★☆☆無料
期待される結果

3行。ノートPC / モニター / USBメモリ

ヒント

WHERE 条件1 OR 条件2 の形。

模範解答
SELECT name
FROM products
WHERE category = 'PC'
   OR stock > 100;
解説

OR はどちらか一方でも満たせば残る。条件を足すほど結果は増えていく。AND と逆の性質。

SQL03-D04 価格が3000円より高く、かつ50000円未満の商品名を取り出すSQLを完成させよ。 穴埋め★☆☆無料
コード
SELECT name
FROM products
WHERE price > 3000
  ____ price < 50000;
期待される結果

3行。マウス / キーボード / モニター

ヒント

「かつ」を意味するキーワード。

模範解答
AND
解説

同じ列に対して2つの条件を付けることもできる。ただし範囲なら BETWEEN のほうが読みやすい場合もある(SQL02)。

SQL03-D05 AND を追加すると、結果の件数はどうなる傾向があるか。
A. 増える B. 減る C. 変わらない D. 決まっていない
選択★☆☆無料
期待される結果

解答 == B

ヒント

条件が厳しくなるのか、緩くなるのか。

模範解答
B
解説

AND は条件を厳しくするので減り、OR は緩くするので増える。結果が想定と違うとき、この感覚があると原因を絞り込みやすい。

SQL03-D06 id が 1・2 以外の商品の name を、NOT IN を使って取り出すSQLを書け。 コーディング★★☆無料
期待される結果

3行。キーボード / モニター / USBメモリ

ヒント

WHERE id NOT IN (1, 2) と書く。

模範解答
SELECT name
FROM products
WHERE id NOT IN (1, 2);
解説

「これ以外」を指定する書き方。除外したいIDが決まっているとき、条件を1つずつ <> で並べるより簡潔。

SQL03-D07 「PCまたは周辺機器」かつ「5000円未満」の商品を取り出すSQLを完成させよ。 穴埋め★★☆無料
コード
SELECT name
FROM products
WHERE ____category = 'PC' OR category = '周辺機器')
  AND price < 5000;
期待される結果

2行。マウス / USBメモリ

ヒント

OR の部分を先に評価させるための記号。開きカッコを補う。

模範解答
(
解説

括弧が無いと4件になる。AND が先に評価され「PC」または「周辺機器かつ5000円未満」という別の意味になってしまう。

SQL03-D08 WHERE NOT price >= 10000 はどの条件と同じか。
A. price > 10000 B. price < 10000 C. price <= 10000 D. price = 10000
選択★★☆無料
期待される結果

解答 == B

ヒント

「10000以上ではない」を言い換えると。

模範解答
B
解説

「以上ではない」=「未満」。NOT は分かりにくくなりがちなので、可能なら反対の演算子で直接書くほうが読みやすい。

SQL03-D09 商品名に「」を含まない商品の name を取り出すSQLを書け。 コーディング★★☆無料
期待される結果

2行。マウス / USBメモリ

ヒント

NOT LIKE を使う。LIKE の前に NOT を置く。

模範解答
SELECT name
FROM products
WHERE name NOT LIKE '%ー%';
解説

NOT LIKEあいまい検索の除外。「テスト」を含む商品を除く、といった実務の絞り込みで使う。

SQL03-D10 価格が 3000円より高く50000円未満で、さらに 在庫が20個未満の商品の name と price と stock を取り出すSQLを書け。 コーディング★★☆無料
期待される結果

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問)

SQL03-S01 【緊急発注リスト】在庫が10個未満または 単価が10万円以上の商品を、name・price・stock で取り出すSQLを書け。 コーディング★★☆無料
期待される結果

3列2行。ノートPC / モニター

ヒント

OR で2つの条件をつなぐ。

模範解答
SELECT name, price, stock
FROM products
WHERE stock < 10
   OR price >= 100000;
解説

「どちらかに当てはまれば要注意」という監視の条件は OR で書く。今回はたまたま両方ノートPCとモニターだが、条件が別々の商品を拾うこともある。

SQL03-S02 【安価な在庫豊富品】価格が10000円未満 かつ 在庫が20個以上の商品を、商品名(別名「商品」)と在庫(別名「在庫数」)で取り出すSQLを書け。 コーディング★★☆無料
期待される結果

商品 / 在庫数。マウス 42 / USBメモリ 120

ヒント

AND で2条件をつなぎ、SELECT で AS を使う。

模範解答
SELECT name AS 商品, stock AS 在庫数
FROM products
WHERE price < 10000
  AND stock >= 20;
解説

「安くて在庫が潤沢」=すぐ出荷できる商品。キャンペーン対象を選ぶときなど、こういう条件で商品を抽出する。

SQL03-S03 【括弧の効果を確かめる】「PC または 周辺機器」かつ「5000円未満」の商品の name と price と category を取り出すSQLを書け。括弧を正しく使うこと コーディング★★☆無料
期待される結果

3列2行。マウス / USBメモリ

ヒント

OR の部分を括弧で囲んでから AND でつなぐ。括弧を忘れると4件になる。

模範解答
SELECT name, price, category
FROM products
WHERE (category = 'PC' OR category = '周辺機器')
  AND price < 5000;
解説

括弧を外すと4件になり、しかもエラーは出ない。「なぜか件数が多い」と気づければまだよいが、そのまま報告してしまう事故が実務では起きる。

SQL03-S04 【除外条件つき検索】category が 'PC' ではない商品のうち、価格が2000円以上のものを、name・category・price で取り出すSQLを書け。 コーディング★★★無料
期待される結果

3列2行。マウス / キーボード

ヒント

<> で「PCではない」を表し、AND で価格条件をつなぐ。

模範解答
SELECT name, category, price
FROM products
WHERE category <> 'PC'
  AND price >= 2000;
解説

除外と絞り込みの組み合わせは実務で頻出。「退会者を除いた、今月の購入者」のような条件がまさにこの形。

SQL03-S05 【在庫金額での層別】在庫金額(price × stock)が15万円以上または 在庫が100個以上の商品を、name と在庫金額(別名 stock_value)と stock で取り出すSQLを書け。 コーディング★★★無料
期待される結果

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仕上げ課題

SQL03-FINAL 【棚卸し対象リストの作成】経理から「棚卸しで重点確認すべき商品を出してほしい」と依頼された。

条件(重点確認の定義)
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 BYLIMIT を学ぶ。「売上トップ5」のような、順位を持つ抽出ができるようになる。