LESSON 30分

ストーリー

あなた
開発部で、かつ給料が35万以上の社員ってどうやって調べるんですか?
先輩
いい質問だね。条件を組み合わせるには AND と OR を使うよ
あなた
ANDは”かつ”、ORは”または”ですか?
先輩
そのとおり!さらに IN を使うと、複数の値をスッキリ書けるんだ

AND(かつ)

両方の条件を満たすデータだけを取り出します。

構文

SELECT * FROM テーブル WHERE 条件1 AND 条件2;

開発部で、かつ給料が35万以上の社員

SELECT * FROM employees WHERE department = '開発部' AND salary >= 350000;

実行結果:

id | name     | department | salary
---+----------+------------+-------
1  | 田中太郎 | 開発部     | 350000
3  | 鈴木一郎 | 開発部     | 400000

開発部だけど給料35万未満の人は除外されます。両方の条件を満たす行だけが返ります。

ANDのイメージ

graph TD
    A["全社員(5人)"] --> B["条件1: department = '開発部'<br/>→ 田中、鈴木"]
    A --> C["条件2: salary >= 350000<br/>→ 田中、佐藤、鈴木"]
    B --> D["AND = 両方を満たす"]
    C --> D
    D --> E["結果(2人)→ 田中、鈴木"]

    style A fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e40af
    style B fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e
    style C fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e
    style D fill:#e0e7ff,stroke:#4f46e5,color:#312e81
    style E fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b

OR(または)

どちらかの条件を満たすデータを取り出します。

構文

SELECT * FROM テーブル WHERE 条件1 OR 条件2;

開発部または営業部の社員

SELECT * FROM employees WHERE department = '開発部' OR department = '営業部';

実行結果:

id | name     | department | salary
---+----------+------------+-------
1  | 田中太郎 | 開発部     | 350000
2  | 佐藤花子 | 営業部     | 320000
3  | 鈴木一郎 | 開発部     | 400000
5  | 伊藤健太 | 営業部     | 280000

ORのイメージ

graph TD
    A["全社員(5人)"] --> B["条件1: department = '開発部'<br/>→ 田中、鈴木"]
    A --> C["条件2: department = '営業部'<br/>→ 佐藤、伊藤"]
    B --> D["OR = どちらかを満たす"]
    C --> D
    D --> E["結果(4人)→ 田中、佐藤、鈴木、伊藤"]

    style A fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e40af
    style B fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e
    style C fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e
    style D fill:#e0e7ff,stroke:#4f46e5,color:#312e81
    style E fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b

NOT(否定)

条件を 反転 させます。

構文

SELECT * FROM テーブル WHERE NOT 条件;

人事部以外の社員

SELECT * FROM employees WHERE NOT department = '人事部';

実行結果:

id | name     | department | salary
---+----------+------------+-------
1  | 田中太郎 | 開発部     | 350000
2  | 佐藤花子 | 営業部     | 320000
3  | 鈴木一郎 | 開発部     | 400000
5  | 伊藤健太 | 営業部     | 280000

NOT department = '人事部'department != '人事部' と同じ結果です。


ANDとORの組み合わせ(括弧の重要性)

注意: ANDはORより優先される

-- 意図しない結果になるかも!
SELECT * FROM employees
WHERE department = '開発部' OR department = '営業部' AND salary >= 350000;

この場合、SQLは以下のように解釈します:

department = '開発部'
  OR
(department = '営業部' AND salary >= 350000)

つまり「開発部の全員」または「営業部で35万以上の人」という意味になります。

括弧で意図を明確にする

-- 「開発部または営業部」で、かつ「給料35万以上」
SELECT * FROM employees
WHERE (department = '開発部' OR department = '営業部') AND salary >= 350000;

実行結果:

id | name     | department | salary
---+----------+------------+-------
1  | 田中太郎 | 開発部     | 350000
3  | 鈴木一郎 | 開発部     | 400000

優先順位のまとめ

優先度演算子意味
高いNOT否定
ANDかつ
低いORまたは

迷ったら 括弧 () を使う のが安全です。可読性も上がります。


IN演算子(ORの省略形)

複数の値と一致するかを調べるとき、OR を何度も書く代わりに IN が使えます。

構文

SELECT * FROM テーブル WHERE カラム IN (値1, 値2, 値3);

ORで書いた場合

SELECT * FROM employees
WHERE department = '開発部' OR department = '営業部';

INで書いた場合(同じ結果)

SELECT * FROM employees
WHERE department IN ('開発部', '営業部');

実行結果(どちらも同じ):

id | name     | department | salary
---+----------+------------+-------
1  | 田中太郎 | 開発部     | 350000
2  | 佐藤花子 | 営業部     | 320000
3  | 鈴木一郎 | 開発部     | 400000
5  | 伊藤健太 | 営業部     | 280000

INのメリット

  • コードが短く読みやすい
  • 値が増えても IN (値1, 値2, 値3, 値4) と追加するだけ
  • NOT IN で「含まれない」も表現可能

NOT IN

-- 開発部と営業部以外の社員
SELECT * FROM employees
WHERE department NOT IN ('開発部', '営業部');

実行結果:

id | name     | department | salary
---+----------+------------+-------
4  | 高橋美咲 | 人事部     | 300000

ハンズオン

練習1: AND を使う

-- 電子機器カテゴリで価格が1万円以上の商品
SELECT * FROM products WHERE category = '電子機器' AND price >= 10000;

練習2: OR を使う

-- 価格が5万円以上、または在庫が50以上の商品
SELECT * FROM products WHERE price >= 50000 OR stock >= 50;

練習3: IN を使う

-- 開発部・営業部の社員の名前と部署を表示
SELECT name, department FROM employees
WHERE department IN ('開発部', '営業部');

練習4: 括弧を使う

-- 電子機器または家具で、かつ価格が3万円以上の商品
SELECT * FROM products
WHERE (category = '電子機器' OR category = '家具') AND price >= 30000;
練習4の期待される結果
id | name     | category | price | stock
---+----------+----------+-------+------
1  | ノートPC | 電子機器 | 89000 | 15
3  | デスク   | 家具     | 35000 | 8
4  | チェア   | 家具     | 45000 | 12
5  | モニター | 電子機器 | 32000 | 20

練習5: NOT IN を使う

-- 電子機器以外の商品
SELECT name, category, price FROM products
WHERE category NOT IN ('電子機器');

まとめ

演算子意味使用例
ANDかつ(両方満たす)WHERE dept = '開発部' AND salary >= 350000
ORまたは(どちらか)WHERE dept = '開発部' OR dept = '営業部'
NOT否定(条件を反転)WHERE NOT dept = '人事部'
INいずれかに一致WHERE dept IN ('開発部', '営業部')
NOT INいずれにも一致しないWHERE dept NOT IN ('人事部')
()優先順位を明示WHERE (A OR B) AND C

チェックリスト

  • ANDで複数条件を組み合わせられた
  • ORでどちらかの条件を指定できた
  • ANDがORより優先されることを理解した
  • 括弧で優先順位を制御できた
  • IN演算子で複数の値を簡潔に書けた

次のステップへ

ANDとORの組み合わせはマスターできましたか?

次のセクションでは、LIKE でパターン検索、BETWEEN で範囲指定を学びます。 「名前に”藤”がつく社員」や「価格が1万円から5万円の商品」を検索できるようになりますよ!


推定読了時間: 30分