🕵️ 「WHERE句」完全ガイド
皆さん、こんにちは!
前回のレッスンで、SELECTとFROMを使ってテーブルのデータを取り出す方法を学びましたね。しかし、大きなテーブルからすべてのデータを取り出すのは非効率的です。
今回は、特定の条件に合う行だけを取り出すための強力なツール、「WHERE句」を紹介します。これを使えば、あなたが必要な情報だけを素早く見つけ出せるようになります!
🔍 第1章:WHERE句の基本と構文
1-1. WHERE句の役割
WHERE句は、「どの列(SELECT)を」「どのテーブル(FROM)から」「どんな条件の行だけ(WHERE)取り出すか」を指定します。
1-2. 基本の構文
SELECT
[カラム名1], [カラム名2], ...
FROM
[スキーマ名].[テーブル名]
WHERE
[絞り込みたいカラム名] [比較演算子] [値]; -- ★ここに条件を書く
1-3. 💡 実践例:価格が10より大きい製品を探す
Production.Productテーブルから、ListPrice(定価)が10より大きい製品だけを抽出してみましょう。
SELECT
* -- 全ての列
FROM
Production.Product
WHERE
ListPrice > 10; -- ListPrice が 10 より大きい
👉 結果: 元々504行あったデータが、条件を満たす291行に絞り込まれます!
⚖️ 第2章:データを比較する「比較演算子」一覧
WHERE句で条件を指定する際には、「〇〇と等しい」「〇〇より大きい」といった比較演算子を使います。
2-1. 文字列(TEXT)のフィルタリング
文字列を比較する場合も、数値と同じように比較演算子を使います。
【例】ファーストネームが「Chris」の従業員を抽出
SELECT *
FROM HumanResources.vEmployee
WHERE FirstName = 'Chris';
【例】ファーストネームが「Chris」ではない従業員を抽出
SELECT *
FROM HumanResources.vEmployee
WHERE FirstName <> 'Chris'; -- <> は「等しくない」
2-2. 日付(Date)のフィルタリング
日付も文字列と同じようにシングルクォーテーションで囲みます。SQLが日付として自動で解釈してくれます。
【例】1980年1月1日以降(当日含む)に生まれた従業員
SELECT *
FROM HumanResources.Employee -- ※ここではビューではなくテーブルを使います
WHERE BirthDate >= '1980-01-01'; -- 「以上」なので >= を使う
⛓️ 第3章:複数の条件を組み合わせる「論理演算子」
複数の条件を同時に満たしたい場合や、どちらかの条件を満たせばよい場合に、「AND」や「OR」という論理演算子を使います。
3-1. AND(かつ)
すべての条件を満たした行だけを返します。一つでも満たさない条件があれば、その行は除外されます。
【例】1980年1月1日以降生まれ かつ 女性(Gender='F') の従業員
SELECT *
FROM HumanResources.Employee
WHERE BirthDate >= '1980-01-01' -- 条件1: 1980/01/01以降生まれ
AND Gender = 'F'; -- 条件2: かつ、女性
3-2. OR(または)
いずれか一つの条件を満たした行を返します。
【例】MaritalStatus(配偶者ステータス)が 'S' または Gender(性別)が 'M' の従業員
SELECT *
FROM HumanResources.Employee
WHERE MaritalStatus = 'S' -- 条件1: 配偶者ステータスがS
OR Gender = 'M'; -- 条件2: または、男性
👉 ポイント: ORを使うと、両方の条件を満たさない行(例:MaritalStatus='M'かつGender='F')以外のすべての行が返されます。
🧠 第4章:ANDとORの優先順位と「括弧」の力
ANDとORを両方使う場合、SQLには「ANDがORよりも優先される」というルール(演算の優先順位)があります。
数学で掛け算が足し算より優先されるのと同じです。
4-1. 優先順位の理解
以下のクエリを見てください。
-- どちらが先に評価される?
WHERE MaritalStatus = 'S' AND Gender = 'M' OR OrganizationLevel = 4
SQLは、まずANDで繋がれた部分を一つと見なして評価します。
(MaritalStatus = 'S' AND Gender = 'M')を先に評価上記の結果 OR (OrganizationLevel = 4)を評価
つまり、「『未婚かつ男性』である」か、「『組織レベルが4である』」のどちらかを満たせば行が返されます。
4-2. 括弧 () で意図を明確にする
もし、私たちが「MaritalStatus = 'S' でなければならない」という条件を全体に適用し、かつ「Gender = 'M' または OrganizationLevel = 4」のどちらかを満たしてほしい場合は、括弧を使って評価の順序を強制します。
SELECT *
FROM HumanResources.Employee
WHERE MaritalStatus = 'S' -- 条件1: 未婚であること
AND (Gender = 'M' OR OrganizationLevel = 4); -- 条件2: かつ、この括弧の中のどちらかを満たすこと
これにより、「未婚 (S)」の行しか返されなくなります。
👉 重要: 複雑なWHERE句を書く際は、括弧を積極的に使うことで、SQLがあなたの意図した通りにデータを絞り込むように強制できます。意図しない結果を防ぐための最も重要なテクニックです!
🧠 第5章:評価順序を強制する「括弧 ()」の力
前回のレッスンで、ANDはORよりも優先されると学びました。しかし、括弧 () を使うと、その優先順位を上書きし、私たちが意図した通りに条件を評価させることができます。
5-1. 評価順序の例(括弧なし vs. 括弧あり)
【例題】 「定価が100超かつ色が赤」または「標準原価が30超」の製品を抽出したい。
【SQL実行例:評価順序を強制する】
SELECT *
FROM Production.Product
WHERE ListPrice > 100 -- 条件1: 定価が100より大きい
AND (Color = 'Red' OR StandardCost > 30); -- 条件2: かつ、(色が赤 または 原価30超)
👉 結果: この「括弧あり」のパターンでは、必ず定価が100を超えている必要があります。もし定価が100以下なら、括弧の中がTrueでも、全体のAND条件がFalseになり、行は返されません。
5-2. 複数の括弧を組み合わせる
括弧はいくつでも組み合わせられます。内側の括弧から順に評価されます。
-- 複雑な条件を括弧で整理する例
WHERE (AnnualSales > 1000000 AND BusinessType = 'OS') -- 条件A
OR (YearOpened < 1990 AND SquareFeet > 40000 AND NumberOfEmployees > 10); -- 条件B
-- 実行結果は、条件A または 条件B のどちらかを満たした行が返される。
🧩 第6章:便利で簡潔な特殊演算子(IN, BETWEEN, LIKE)
長いWHERE条件を、より短く、読みやすくするための便利な演算子を紹介します。
6-1. IN 演算子(リストから選択)
ORを何度も繰り返す代わりに使います。
SELECT *
FROM HumanResources.vEmployee
WHERE FirstName IN ('Chris', 'Steve', 'Michael', 'Thomas');
-- FirstNameがリスト内のいずれかに一致する行を返す。
6-2. BETWEEN 演算子(範囲指定)
ある範囲内の値を探すときに、>= と AND と <= を使う代わりに使います。
👉 ポイント: BETWEENは、両端の値(例では100万と200万)を含みます(以上・以下)。
6-3. LIKE 演算子とワイルドカード(あいまい検索)
文字列の一部しか分からないとき、ワイルドカード文字と組み合わせて使います。
【SQL実行例】
-- 名前に「H」が含まれる全従業員を検索
SELECT *
FROM HumanResources.vEmployee
WHERE FirstName LIKE '%H%';
6-3-1. 💡 応用:ブラケット [] を使った範囲指定
ブラケット [] を使うと、ワイルドカードを特定の文字や範囲に限定できます。
[AO]:A または O のいずれかの文字[A-F]:AからFまでのいずれかの文字[^A]:A ではない 任意の文字(^は否定)
-- Dで始まり、2文字目がAまたはO、3文字目がNの名前を検索
WHERE FirstName LIKE 'D[AO]N'; -- 結果: Dan, Don
👻 第7章:NULL値のフィルタリング(IS NULL)
NULL(ヌル)値は、データベースにおける「データがない」状態を意味します。
7-1. NULLと空白の違い
7-2. ⚠️ NULLを比較する方法
NULLは「何もデータがない」ため、通常の比較演算子 (=, <>) ではフィルタリングできません。
❌ 間違い:
WHERE MiddleName = NULL✅ 正解:
WHERE MiddleName IS NULL
同様に、「NULLではない」行を抽出するには、IS NOT NULLを使います。
-- MiddleName(ミドルネーム)がNULLの行を抽出
SELECT *
FROM Person.Person
WHERE MiddleName IS NULL;
-- MiddleNameに何らかの値が入っている(NULLではない)行を抽出
SELECT *
FROM Person.Person
WHERE MiddleName IS NOT NULL;
👉 ポイント: IS NULL / IS NOT NULL の構文は、他のANDやORの条件と自由に組み合わせることができます。
