2. MS SQL 「WHERE句」完全ガイド

 


🕵️ 「WHERE句」完全ガイド

皆さん、こんにちは!

前回のレッスンで、SELECTFROMを使ってテーブルのデータを取り出す方法を学びましたね。しかし、大きなテーブルからすべてのデータを取り出すのは非効率的です。

今回は、特定の条件に合う行だけを取り出すための強力なツール、「WHERE句」を紹介します。これを使えば、あなたが必要な情報だけを素早く見つけ出せるようになります!


🔍 第1章:WHERE句の基本と構文

1-1. WHERE句の役割

役割行 (Row) のデータをフィルタリング(絞り込む)すること
場所FROM句の直後に記述する

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句で条件を指定する際には、「〇〇と等しい」「〇〇より大きい」といった比較演算子を使います。

演算子意味
=等しいListPrice = 10
>より大きいListPrice > 10
<より小さいListPrice < 10
>=以上(より大きい、または等しい)ListPrice >= 10
<=以下(より小さい、または等しい)ListPrice <= 10
<>等しくない(ノットイコール)ListPrice <> 10

2-1. 文字列(TEXT)のフィルタリング

文字列を比較する場合も、数値と同じように比較演算子を使います。

項目注意点
囲み方フィルターしたい文字列は、必ずシングルクォーテーション ' ' で囲む。
大文字/小文字⚠️ ほとんどのSQLデータベースは、標準設定では大文字・小文字を区別しない(Case Insensitive)'Chris''CHRIS' は同じと見なされます。

【例】ファーストネームが「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で繋がれた部分を一つと見なして評価します。

  1. (MaritalStatus = 'S' AND Gender = 'M') を先に評価

  2. 上記の結果 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: かつ、この括弧の中のどちらかを満たすこと
評価の順序詳細
1. 括弧の中Gender = 'M' または OrganizationLevel = 4 が先に評価される。
2. AND演算その結果と、MaritalStatus = 'S' の条件が AND で結合される。

これにより、「未婚 (S)」の行しか返されなくなります。

👉 重要: 複雑なWHERE句を書く際は、括弧を積極的に使うことで、SQLがあなたの意図した通りにデータを絞り込むように強制できます。意図しない結果を防ぐための最も重要なテクニックです!


🧠 第5章:評価順序を強制する「括弧 ()」の力

前回のレッスンで、ANDORよりも優先されると学びました。しかし、括弧 () を使うと、その優先順位を上書きし、私たちが意図した通りに条件を評価させることができます。

5-1. 評価順序の例(括弧なし vs. 括弧あり)

【例題】 「定価が100超かつ色が赤」または「標準原価が30超」の製品を抽出したい。

構文評価順序意味
括弧なし(AND)が先に評価 OR「定価100超 かつ 色が赤」 または 「標準原価30超」
括弧ありORが先に評価 AND「定価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を何度も繰り返す代わりに使います。

従来のOR構文簡潔なIN構文
WHERE FirstName = 'Chris' OR FirstName = 'Steve' OR ...WHERE FirstName IN ('Chris', 'Steve', 'Michael', 'Thomas')
SELECT *
FROM HumanResources.vEmployee
WHERE FirstName IN ('Chris', 'Steve', 'Michael', 'Thomas');
-- FirstNameがリスト内のいずれかに一致する行を返す。

6-2. BETWEEN 演算子(範囲指定)

ある範囲内の値を探すときに、>=AND<= を使う代わりに使います。

従来のAND構文簡潔なBETWEEN構文
WHERE AnnualSales >= 1000000 AND AnnualSales <= 2000000WHERE AnnualSales BETWEEN 1000000 AND 2000000

👉 ポイント: BETWEENは、両端の値(例では100万と200万)を含みます(以上・以下)。

6-3. LIKE 演算子とワイルドカード(あいまい検索)

文字列の一部しか分からないとき、ワイルドカード文字と組み合わせて使います。

ワイルドカード意味
% (パーセント)0文字以上の任意の文字列WHERE Name LIKE 'M%' Mで始まる名前 (Mike, Max, Mary...)
WHERE Name LIKE '%s' sで終わる名前 (James, Chris)
WHERE Name LIKE '%h%' hを含む名前 (Michael, Sharon)
_ (アンダースコア)1文字の任意の文字WHERE Name LIKE 'M_n' 3文字で、Mで始まりnで終わる名前 (Man, Men)

【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と空白の違い

項目NULL値空白(' ')
意味データが存在しない(「無」)。未知、未適用、情報なし。1文字の空白というデータが存在している。
比較他の値やNULL自身と比較しても、結果は常に不明(TrueにもFalseにもならない)。文字列として比較できる。

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 の構文は、他のANDORの条件と自由に組み合わせることができます。