WHERE句とは?基本構文とその役割
WHERE句は、データベースから特定の条件に合うレコードだけを抽出するためのフィルター機能です。
例えば、「動物園の管理システムで年齢が5歳以上の動物だけを表示したい」ときや「特定の種類の動物の情報のみを取得したい」といった場面で使います。
この句が便利なのは、大量のデータの中から必要な条件に合う情報だけを効率的に取り出せるという点です。
WHERE句の特徴を確認しておきましょう。
WHERE句の特徴
- 大量のデータから条件に合致するもののみを抽出できる
- さまざまな比較演算子や条件指定キーワードを使って柔軟な検索ができる
- 論理演算子を使って複雑な条件設定も実現できる
- SELECT文だけでなく、UPDATE、DELETE文でも使用できる
実際の開発では、ユーザー管理、商品検索、売上分析など、さまざまな場面で条件に基づいたデータ抽出が必要になります。
このような場面で活躍するのがWHERE句です。
WHERE句の基本構文と使用目的とは
以降の解説では、次の動物園管理データベースを例として使用します。
animalsテーブル
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
3 |
ペンギン |
魚食動物 |
3 |
25.2 |
極地 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
5 |
サル |
雑食動物 |
2 |
15.8 |
森林 |
例で使用するデータベースを作成したい方は、次のSQLスクリプトを参考にしてください。
WHERE句の基本的な構文は「WHERE 列名 演算子 値」という形式です。条件に一致しないデータは結果から除外されます。
それでは、実際にWHERE句の使用例を見てみましょう。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
※使用するDBMS(データベース管理システム)によって表示結果が異なる場合があります。以後のコードも同様です
WHERE age >= 5で年齢が5歳以上の動物のみを絞り込んでいます。結果として、条件を満たす3匹の動物(ライオン、ゾウ、キリン)のデータが表示されます。
条件に合わない動物(ペンギンとサル)は結果から除外され、必要な情報だけが効率的に抽出されています。
SELECT文におけるWHERE句の位置と実行順序
WHERE句をSELECT文で使う場合、書く順番が決まっています。
「SELECT → FROM → WHERE」の順序です。
また、SQLの処理の順序も決まっています。
「FROM(どのテーブルから) → WHERE(どんな条件で絞り込むか) → SELECT(指定した列を抽出)」の順番です。
この処理の流れを理解することで、「なぜこの結果になるのか」がわかりやすくなります。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
AND演算子を使って2つの条件を組み合わせています。「年齢が3歳より上」かつ「体重が1000kg未満」の両方を満たす動物だけが抽出されます。
結果として、ライオンとキリンの2匹が条件に合致し、表示されています。
このように、WHERE句を使いこなすことで、非常に柔軟なデータ検索が実現できます。
WHERE句で使える主な比較演算子と条件指定
WHERE句では、さまざまな比較演算子を使ってデータを絞り込むことができます。
「○○と等しい」「○○より大きい」といった基本的な比較から、「値が存在しない(NULL)」の扱い、「AかつB」「AまたはB」といった複数条件の組み合わせまで、さまざまな指定方法があります。
適切に使い分けることで、欲しいデータをピンポイントで見つけることができるので、ぜひマスターしましょう。
数値・文字列・日付での比較の具体例
データの種類によって、比較の方法は少し違います。
数値の比較では「=(等しい)」「>(より大きい)」「<(より小さい)」などの記号を使います。
文字列の比較では、大文字と小文字が区別され、完全に一致する必要があります。
日付の比較では、古い・新しいの判定ができ、「○月○日以降のデータ」といった条件指定が可能です。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
2つの異なるデータ型での条件指定を行っています。weight > 100で数値の比較を、habitat = 'サバンナ'で文字列の完全一致を指定しています。
AND演算子により、両方の条件を満たす動物(体重が100kg以上で、かつサバンナに住む動物)が抽出されます。
NULL値を扱うときの注意点(IS NULL / IS NOT NULL)
データベースには「値が入っていない」状態を表すNULLという特別な値があります。
このNULL値は普通の比較方法(= や <>)では正しく判定できません。
NULL値かどうかを調べるときは「IS NULL」を、NULL値以外を調べるときは「IS NOT NULL」を使う必要があります。
この特徴を知っておかないと、期待した結果が得られないため注意が必要です。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
3 |
ペンギン |
魚食動物 |
3 |
25.2 |
極地 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
5 |
サル |
雑食動物 |
2 |
15.8 |
森林 |
habitat IS NOT NULLを使ってhabitat列にNULL値以外の値が入っているレコードを抽出しています。
この例では全ての動物にhabitat情報が存在するため、全レコードが表示されています。もしNULL値が含まれていた場合、該当するレコードは結果から除外されます。
複数条件の組み合わせ(AND / OR / NOT)
WHERE句では、複数の条件を組み合わせて、より詳細な絞り込みができます。
「AND」は「AかつB」(両方とも満たす必要がある)
「OR」は「AまたはB」(どちらか一方でもOK)
「NOT」は「Aではない」(条件を逆にする)
という意味です。
複数の条件を組み合わせることで、「年齢が5歳以上で、かつ体重が100kg以下の草食動物」といった複雑な条件も簡単に指定できます。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
3 |
ペンギン |
魚食動物 |
3 |
25.2 |
極地 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
5 |
サル |
雑食動物 |
2 |
15.8 |
森林 |
括弧内の条件「年齢が5歳未満または体重が500kg以上」のいずれかを満たし、かつ「肉食動物ではない」動物を抽出しています。
<> は、 「小さくも大きくもない」→「等しくない」→「ではない」という意味です。
同じ意味として、次のような表記方法があります。この機会に覚えてしまいましょう。
WHERE句と一緒によく使われる条件指定キーワード
WHERE句には、さらに便利な機能を追加するキーワードがいくつかあります。
「複数の値から選ぶ」「範囲を指定する」「曖昧な検索をする」といった、より実用的な検索ができるようになります。
実際の開発現場でもよく使われる便利な機能です。
IN:複数の値にマッチさせる
「AまたはBまたはC...」といった条件を簡単に書ける便利な機能です。
複数の条件を適用したいとき、OR演算子を何度も書く代わりに、IN句を使って括弧の中にカンマ区切りで値を並べるだけで済みます。リストに含まれている値のいずれかと一致すれば、そのデータが結果に表示されるという形です。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
3 |
ペンギン |
魚食動物 |
3 |
25.2 |
極地 |
BETWEEN:範囲を指定して抽出する
「○○以上△△以下」といった範囲指定を簡単にできる機能です。
「BETWEEN 最小値 AND 最大値」と書くだけで、その範囲内の値を持つデータを取得できます。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
3 |
ペンギン |
魚食動物 |
3 |
25.2 |
極地 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
両端の値も含まれるので「BETWEEN 3 AND 8」の場合、3と8も対象です。
これはage >= 3 AND age <= 8と同じ意味ですが、BETWEEN句を使うことで、より直感的で読みやすい条件指定になっています。
LIKE:あいまい検索で部分一致を実現
LIKE句は「正確な文字列はわからないけど、○○を含む」といった曖昧な検索をしたいときに使います。
「%」や「_」といった特別な記号を使います。
例えば「%ナ」と書けば「○○ナ」で終わる文字列、「%ナ%」と書けば「ナ」を含む文字列を検索できます。「動物の名前にライが含まれるデータを探したい」といった場面でも使うことができます。
生息地に「ナ」を含む動物を検索する例:
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
habitat LIKE '%ナ'を使って、habitat列の値が「ナ」で終わる動物を検索しています。
「%」は任意の文字列を表すワイルドカードなので、「ナ」の前に何文字あっても一致します。結果として、「サバンナ」に住む2匹の動物が抽出されています。「○○で終わる」「○○で始まる」「○○を含む」といった柔軟な検索ができます。
もしどういう文字列が検索されるのかイメージできない方は、下記もあわせて確認しておきましょう。
- 「%」:何文字でも置き換え可能(「ライ%」→「ライオン」「ライト」など)
- 「_」:1文字だけ置き換え可能(「ラ_オン」→「ライオン」「ラボオン」など)
EXISTS:サブクエリを使った条件指定
より高度な条件指定ができる機能で、「別の条件を満たすデータが存在する場合」という判定ができます。
例えば、「体重500kg以上の動物と同じ生息地に住む動物を全て表示したい」といった複雑な条件も設定できます。
メインの検索に対して、追加の検索条件(サブクエリ)を組み合わせることで、関連性のある情報を効率的に取得したいときに便利です。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
少し複雑に見えるので、分解して理解しましょう。
外側のクエリ:SELECT * FROM animals a1 WHERE EXISTS (...);
- SELECT * FROM animals a1では、animalsテーブルにa1という別名を付けて全ての動物を対象にしています
- 「EXISTSの条件を満たす動物を全て表示」という意味です
内側のクエリ(EXISTSの中):SELECT 1 FROM animals a2 WHERE a2.weight >= 500 AND a2.habitat = a1.habitat
- 同じanimalsテーブルにa2という別名を付けています
- 「体重500kg以上で、a1と同じ生息地の動物が存在するか」を調べています
各動物は次のように判定されます。
- ライオン(サバンナ)→ サバンナで体重500kg以上の動物は存在するか? → ◯(キリン800kg)
- ゾウ(草原)→ 草原で体重500kg以上の動物は存在するか?→ ◯(ゾウ自身3500kg)
- ペンギン(極地)→ 極地で体重500kg以上の動物は存在するか? → ×
- キリン(サバンナ)→ サバンナで体重500kg以上の動物は存在するか? → ◯(キリン自身800kg)
- サル(森林)→ 森林で体重500kg以上の動物は存在するか? → ×
結果として、条件を満たすライオン、ゾウ、キリンの3匹が表示されています。
「関連するデータがある場合のみ表示したい」といった複雑な条件も、EXISTS句を使えば実現できます。
WHERE句の注意点とよくあるエラー例
WHERE句を使うときに、やりがちな間違いがいくつかあります。
「データの種類が違うために比較できない」
「条件の優先順位を間違える」
「NULL値の扱いで失敗する」
といった問題が起こりやすいポイントです。
あらかじめこのような落とし穴を知っておくことで、「なぜ思った通りの結果にならないのか」を理解し、正しく使えるようになりましょう。
データ型の違いによる比較エラー
データの種類(数値、文字列、日付など)が違うと、思わぬエラーが起こることがあります。
例えば、数値の「5」と文字列の「5」は、見た目は同じでも実はデータベース内では別物として扱われます。文字列として保存された数値は「1、10、2、3」という順番(辞書順)でソートされ、数値の大小関係(1、2、3、10)とは異なる結果になります。
このような場合は、型変換という方法で統一してから比較する必要があります。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
CAST(age AS CHAR)を使って数値型のage列を文字列型に変換してから、文字列の '5' と比較しています。
このような型変換により、異なるデータ型間でも正確な比較を行うことができます。データ型を意識した条件指定は、正確な結果を得るために重要です。「なぜ期待した結果にならないのか」の原因として、データ型の違いを疑うのは基本です。
論理演算子の優先順序に注意
AND、OR、NOTには処理される順番があり、「NOT → AND → OR」の順で処理されます。
複数の条件を組み合わせるとき、この順番を間違えると全く違う結果になってしまいます。数学の計算と同じです。
例えば「A OR B AND C」と書くと、「A OR (B AND C)」として処理され、「(A OR B) AND C」とは異なります。思った通りの条件にするには、括弧()を使って明確に順序を指定することが大切です。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
まず「年齢が5歳より上または体重が50kg未満」のいずれかを満たすという条件を先にチェックします。
その条件と「草食動物である」という条件の両方を満たす動物を抽出しています。
NULLを含む条件指定の落とし穴
NULL値が含まれる項目で条件を指定するとき、思わぬ落とし穴があります。
NULL値は「何とも比較できない特別な値」なので、一般的な比較(= や <>)では必ず「判定不能」という結果になります。
また、NULL値を含む計算(足し算や引き算など)の結果も必ずNULLです。NULL値を正しく扱うには、「IS NULL」や「IS NOT NULL」を使う必要があります。
出力結果
id |
name |
species |
age |
weight |
habitat |
---|---|---|---|---|---|
1 |
ライオン |
肉食動物 |
5 |
180.5 |
サバンナ |
2 |
ゾウ |
草食動物 |
12 |
3500.0 |
草原 |
3 |
ペンギン |
魚食動物 |
3 |
25.2 |
極地 |
4 |
キリン |
草食動物 |
8 |
800.0 |
サバンナ |
5 |
サル |
雑食動物 |
2 |
15.8 |
森林 |
habitat IS NOT NULLでhabitat列にNULL値が含まれていないレコードを確実に抽出し、さらにage > 0で年齢が0より大きいレコードに絞り込んでいます。
NULL値を適切に処理することで、予期しない結果を防ぎ、正確なデータ抽出が実現できます。
「値が入っているかどうかわからない項目」を扱う場合は、必ずNULL値のチェックを忘れないようにしましょう。
よくある質問(Q&A)
Q: WHERE文で文字列を検索する時の注意点は?
A: 文字列検索では必ずシングルクォート(')で値を囲む必要があります。また、大文字小文字や全角半角の違いも区別されるため、正確な文字列を指定することが重要です。部分一致検索にはLIKE演算子を使用しましょう。
Q: BETWEEN演算子は境界値を含む?
A: BETWEEN演算子は両端の境界値を含みます。「A BETWEEN 1 AND 5」の場合、1と5も結果に含まれます。境界値を含まない場合は、「>」と「<」を組み合わせて使用してください。
Q: WHERE文なしでSELECTするとどうなる?
A: WHERE文を指定しない場合、テーブル内のすべてのレコードが取得されます。大量のデータがあるテーブルでは処理時間が長くなり、システムに負荷をかける可能性があるため注意が必要です。
まとめ
SQL WHERE句は、データベースから必要なデータだけを効率的に抽出するための重要な機能です。
この記事では、WHERE句の基本構文から実用的な応用例まで解説しました。WHERE句の活用場面について確認しておきましょう。
WHERE句が活躍する場面
- 大量のデータから特定の条件に合致するレコードのみを抽出したいとき
- 数値、文字列、日付などさまざまなデータ型での比較検索を行いたいとき
- 複数の条件を組み合わせて、より細かい条件設定を行いたいとき
WHERE句を使う上で押さえておきたいポイントは次の通りです。
重要なポイント
- WHERE句の基本構文と実行順序
- 比較演算子と論理演算子の適切な使い分け
- IN、LIKE、BETWEENなどの特性
- NULL値の特性
- 括弧を使った論理演算子の優先順位
初めてSQLを学ぶ方も、この記事で紹介したWHERE句の基本的な使い方と実用例を参考に、実際にSQL文を書いてみてください。
データベースから適切に情報を絞り込めるようになれば、より実用的なシステムを構築することができるようになります。
実際の開発で重宝するスキルです。
ぜひWHERE句を活用して、より効率的で実用的なデータベース操作ができるようになりましょう。