SQLのWHERE句で複数条件を指定する方法|AND・OR・INを解説
CONTENTS
- 1 WHERE句とは?必要な行だけを取り出すための基本
- 2 SQLで複数条件を指定する基本|ANDとOR
- 3 ORは「AまたはB」を指定する
- 4 ANDとORを併用するときは括弧で優先順位を明示する
- 5 INで複数のOR条件をまとめる
- 6 BETWEENで範囲条件を指定する
- 7 LIKEで部分一致検索をする
- 8 NULLを条件に含める方法|IS NULL / IS NOT NULL
- 9 実務でよく使うWHERE句の複数条件パターン
- 10 WHERE句を書くときの可読性を高めるコツ
- 11 WHERE句の複数条件でよくある間違い
- 12 WHERE句のデバッグ方法
- 13 データベースごとの差異にも注意する
- 14 まとめ|WHERE句の複数条件は正確さと読みやすさが重要
SQLでデータを抽出するとき、「年齢が30歳以上のユーザーだけ」「東京または大阪の顧客だけ」「在庫があり、かつ公開中の商品だけ」のように、複数の条件で絞り込みたい場面は非常に多くあります。
そのときに使うのが、WHERE句とAND、OR、INなどの条件指定です。
ただし、WHERE句は一見シンプルに見えて、実務では次のようなミスが起こりやすい部分でもあります。
「ANDとORの優先順位を間違えて、想定より多くのデータが出てしまった」
「NULLを=で比較してしまい、データが取得できなかった」
「OR条件が増えすぎて、SQLが読みにくくなった」
「日付や文字列の条件で、境界値のデータを取りこぼした」
この記事では、SQLのWHERE句で複数条件を指定する方法を、基本構文から実務での考え方、よくある失敗、デバッグ方法まで体系的に解説します。
SQL初心者の方は「条件指定の基本」を理解でき、実務でSQLを書く方は「安全で読みやすく、保守しやすいWHERE句の書き方」を確認できます。
WHERE句とは?必要な行だけを取り出すための基本
WHERE句は、テーブルの中から条件に一致する行だけを抽出するためのSQL構文です。
たとえば、社員テーブルから年齢が30歳以上の社員だけを取得したい場合は、次のように書きます。
SELECT
employee_id,
employee_name,
age
FROM
employees
WHERE
age >= 30;
このSQLでは、employeesテーブルの中から、ageが30以上の行だけが結果として返されます。
PostgreSQLの公式ドキュメントでも、WHERE句が指定された場合、条件を満たさない行は出力から除外されると説明されています。WHERE句の基本的な役割を確認したい場合は、公式情報としてPostgreSQLのSELECT文ドキュメントも参考になります。
https://www.postgresql.org/docs/current/sql-select.html
WHERE句の基本構文
WHERE句の基本形は次のとおりです。
SELECT
列名
FROM
テーブル名
WHERE
条件;
条件部分には、比較演算子を使って「どの行を残すか」を指定します。
よく使う比較演算子は次のとおりです。
| 演算子 | 意味 | 例 |
|---|---|---|
= |
等しい | status = 'active' |
<> / != |
等しくない | status <> 'deleted' |
> |
より大きい | price > 1000 |
>= |
以上 | age >= 30 |
< |
より小さい | price < 5000 |
<= |
以下 | created_at <= '2026-05-31' |
WHERE句は、SQLの中でも非常に基本的な構文ですが、実務では単一条件よりも複数条件で使われることの方が多いです。
たとえば、次のような条件です。
WHERE
status = 'active'
AND age >= 30
AND prefecture = '東京都';
このように、複数の条件を組み合わせることで、より目的に合ったデータを正確に取り出せます。
SQLで複数条件を指定する基本|ANDとOR
WHERE句で複数条件を指定するときに中心となるのが、ANDとORです。
ANDは「すべての条件を満たす」場合に使います。
ORは「いずれかの条件を満たす」場合に使います。
MySQLの公式ドキュメントでは、SQLの論理演算子はTRUE、FALSE、NULL、つまりUNKNOWNを評価すると説明されています。SQLの条件式では単純な真偽だけでなく、NULLが絡むことで結果が変わる点も重要です。
https://dev.mysql.com/doc/refman/8.4/en/logical-operators.html
ANDは「AかつB」を指定する
ANDは、複数の条件をすべて満たす行だけを取得したいときに使います。
たとえば、次のような要件を考えます。
「部署IDが20で、職種がMANAGERの社員を取得したい」
この場合、SQLは次のようになります。
SELECT
employee_id,
employee_name,
deptno,
job
FROM
employees
WHERE
deptno = 20
AND job = 'MANAGER';
このSQLでは、次の2つの条件をどちらも満たす行だけが返されます。
deptno = 20
job = 'MANAGER'
つまり、部署IDが20でも職種がMANAGERでなければ対象外です。
逆に、職種がMANAGERでも部署IDが20でなければ対象外です。
AND条件は増えるほど結果が絞り込まれる
ANDは条件を追加するほど、取得される行数が少なくなります。
WHERE
status = 'active'
AND age >= 30
AND prefecture = '東京都'
AND registered_at >= '2026-01-01';
この場合、すべての条件を満たす行だけが取得されます。
そのため、検索結果が想定より少ない場合は、次の点を確認しましょう。
- 条件を厳しくしすぎていないか
- 文字列に全角・半角の表記ゆれがないか
- 余分な空白が入っていないか
- 日付の範囲指定が正しいか
- NULLのデータを除外していないか
実務では、最初から条件をすべて書くのではなく、1つずつ条件を追加しながら件数の変化を見ると原因を特定しやすくなります。
ORは「AまたはB」を指定する
ORは、複数の条件のうち、どれか1つでも満たす行を取得したいときに使います。
たとえば、次のような要件です。
「部署IDが20、または職種がMANAGERの社員を取得したい」
SQLは次のようになります。
SELECT
employee_id,
employee_name,
deptno,
job
FROM
employees
WHERE
deptno = 20
OR job = 'MANAGER';
このSQLでは、次のいずれかに該当する行が取得されます。
- 部署IDが20の社員
- 職種がMANAGERの社員
- 部署IDが20で、かつ職種もMANAGERの社員
ORは「どちらか一方だけ」ではありません。
両方の条件を満たす行も結果に含まれます。
OR条件は増えるほど結果が広がる
ORは条件を追加するほど、取得される行数が増えやすくなります。
WHERE
prefecture = '東京都'
OR prefecture = '大阪府'
OR prefecture = '愛知県';
このSQLでは、東京都・大阪府・愛知県のいずれかに該当するデータが取得されます。
ORを使うときに注意したいのは、条件が広がりすぎることです。
たとえば、次のSQLを見てください。
WHERE
status = 'active'
OR role = 'admin';
この条件では、statusがactiveであれば、管理者でなくても取得されます。
また、roleがadminであれば、statusがactiveでなくても取得されます。
もし意図が「有効な管理者だけを取得したい」であれば、正しくは次のようにANDを使います。
WHERE
status = 'active'
AND role = 'admin';
このように、ANDとORは似ているようで、抽出結果に大きな違いがあります。
ANDとORを併用するときは括弧で優先順位を明示する
WHERE句で複数条件を書くとき、特に注意が必要なのがANDとORの併用です。
SQLでは、一般的にANDの方がORよりも先に評価されます。
そのため、括弧を付けずに書くと、書いた人の意図と違う条件として解釈されることがあります。
SQL Serverの公式ドキュメントでも、複雑な式では演算子の優先順位が評価順序を決め、結果に大きく影響する可能性があると説明されています。ANDとORを混在させる場合は、公式情報としてSQL Serverの演算子優先順位の資料も確認しておくと安全です。
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-ver17
括弧なしのSQLは意図がずれやすい
たとえば、次のSQLを見てください。
SELECT
*
FROM
users
WHERE
prefecture = '東京都'
OR prefecture = '大阪府'
AND age >= 30;
一見すると、次のように見えるかもしれません。
東京都または大阪府のユーザーで、30歳以上
しかし、SQLではANDが先に評価されるため、実際には次のように解釈されます。
WHERE
prefecture = '東京都'
OR (
prefecture = '大阪府'
AND age >= 30
);
つまり、東京都のユーザーは年齢に関係なく取得されます。
大阪府のユーザーだけが30歳以上に絞られます。
これは、実務で非常によくあるミスです。
意図した条件は括弧で明確にする
もし意図が「東京都または大阪府のユーザーで、30歳以上」を取得することであれば、次のように書くべきです。
SELECT
*
FROM
users
WHERE
(
prefecture = '東京都'
OR prefecture = '大阪府'
)
AND age >= 30;
このように括弧を付けることで、条件のまとまりが明確になります。
WHERE句では、SQLが動くことだけでなく、後から読んだ人が誤解しないことも重要です。
特に、チーム開発や保守運用では、次のように条件をグループ化して書くと安全です。
WHERE
(
prefecture = '東京都'
OR prefecture = '大阪府'
)
AND (
status = 'active'
OR status = 'pending'
)
AND deleted_at IS NULL;
このように書けば、条件のまとまりが視覚的にも分かりやすくなります。
INで複数のOR条件をまとめる
同じ列に対して複数の値を指定する場合は、ORを何度も書くよりもINを使うと読みやすくなります。
たとえば、次のSQLを見てください。
WHERE
deptno = 10
OR deptno = 20
OR deptno = 30;
このSQLは間違いではありません。
しかし、同じ列deptnoに対して複数の値を指定しているため、INを使うとより簡潔に書けます。
WHERE
deptno IN (10, 20, 30);
意味は同じです。
INを使うメリット
INを使う主なメリットは、可読性と保守性です。
たとえば、部署IDの条件が増えた場合でも、INなら値を追加するだけで済みます。
WHERE
deptno IN (10, 20, 30, 40, 50);
ORで書く場合と比べて、条件の意図が一目で分かります。
WHERE
deptno = 10
OR deptno = 20
OR deptno = 30
OR deptno = 40
OR deptno = 50;
このように、同じ列に対する複数候補は、原則としてINで整理するとよいでしょう。
文字列でもINは使える
INは数値だけでなく、文字列にも使えます。
SELECT
*
FROM
products
WHERE
category IN ('book', 'magazine', 'ebook');
このSQLでは、カテゴリーがbook、magazine、ebookのいずれかに該当する商品を取得します。
文字列を指定する場合は、値をシングルクォートで囲む必要があります。
WHERE
status IN ('active', 'pending');
数値の場合はクォートなしで書くのが一般的です。
WHERE
user_id IN (101, 102, 103);
NOT INを使うときの注意点
INの反対として、指定した値に含まれない行を取得するNOT INもあります。
WHERE
status NOT IN ('deleted', 'banned');
このSQLでは、statusがdeletedでもbannedでもない行を取得します。
ただし、NOT INを使うときはNULLに注意が必要です。
条件値や対象列にNULLが含まれると、想定どおりに結果が返らないことがあります。
NULLが絡む可能性がある場合は、次のようにIS NULLやIS NOT NULLを明示的に組み合わせることを検討しましょう。
WHERE
status NOT IN ('deleted', 'banned')
OR status IS NULL;
または、NULLを除外したい場合は次のように書きます。
WHERE
status IS NOT NULL
AND status NOT IN ('deleted', 'banned');
BETWEENで範囲条件を指定する
数値や日付の範囲を指定したい場合は、BETWEENが便利です。
たとえば、年齢が20歳以上29歳以下のユーザーを取得する場合、次のように書けます。
SELECT
*
FROM
users
WHERE
age BETWEEN 20 AND 29;
これは、次の条件とほぼ同じ意味です。
WHERE
age >= 20
AND age <= 29;
BETWEENは境界値を含む
BETWEENを使うときに重要なのは、開始値と終了値を含むという点です。
WHERE
age BETWEEN 20 AND 29;
この場合、20歳も29歳も対象に含まれます。
そのため、境界値を含めたくない場合は、>や<を使って明示的に書く必要があります。
WHERE
age > 20
AND age < 29;
日付のBETWEENには注意が必要
BETWEENは日付条件でも使えます。
WHERE
created_at BETWEEN '2026-05-01' AND '2026-05-31';
ただし、created_atに時刻まで入っている場合は注意が必要です。
たとえば、created_atが2026-05-31 15:30:00のような日時型の場合、データベースによっては'2026-05-31'が2026-05-31 00:00:00として扱われ、5月31日の昼以降のデータが含まれない可能性があります。
実務では、日付範囲は次のように書く方が安全です。
WHERE
created_at >= '2026-05-01'
AND created_at < '2026-06-01';
この書き方なら、5月1日0時以降から6月1日0時未満までを対象にできます。
月末日や時刻の取りこぼしを防ぎやすく、実務ではよく使われる書き方です。
LIKEで部分一致検索をする
文字列の一部に一致するデータを探したい場合は、LIKEを使います。
たとえば、名前が「田中」で始まるユーザーを探す場合は次のように書きます。
SELECT
*
FROM
users
WHERE
user_name LIKE '田中%';
%は任意の文字列を表します。
LIKEの主な使い方
LIKEでは、%の位置によって検索の意味が変わります。
| 書き方 | 意味 | 例 |
|---|---|---|
'田中%' |
前方一致 | 田中で始まる |
'%商事' |
後方一致 | 商事で終わる |
'%東京%' |
部分一致 | 東京を含む |
たとえば、会社名に「商事」を含むデータを探す場合は次のように書きます。
WHERE
company_name LIKE '%商事%';
先頭に%を付ける検索は重くなりやすい
LIKEを使うと柔軟な検索ができますが、'%キーワード%'のように先頭に%を付ける検索は、データ量が多いとパフォーマンスに影響しやすくなります。
WHERE
description LIKE '%キャンペーン%';
このような部分一致検索は、インデックスが効きにくくなる場合があります。
そのため、実務では次のように検討します。
- 完全一致で要件を満たせないか
- 前方一致で検索できないか
- 検索専用のインデックスや全文検索機能を使うべきか
- LIKE検索が必要な画面かどうか
LIKEは便利ですが、検索対象が多いテーブルでは安易に多用しないことが大切です。
NULLを条件に含める方法|IS NULL / IS NOT NULL
SQLで特に間違いやすいのが、NULLの扱いです。
NULLは「値がない」ことを表します。
0や空文字とは異なります。
たとえば、電話番号が未登録のユーザーを探したい場合、次のように書いてはいけません。
WHERE
phone = NULL;
この書き方では、期待どおりにNULLの行を取得できません。
NULLを判定する場合は、IS NULLを使います。
WHERE
phone IS NULL;
逆に、NULLではない行を取得したい場合は、IS NOT NULLを使います。
WHERE
phone IS NOT NULL;
SQLiteの公式ドキュメントでも、多くの演算子はNULLを含むとNULLを返すと説明されています。NULLは通常の値と同じように=で比較できないため、SQLを書くうえで必ず理解しておきたいポイントです。
https://sqlite.org/lang_expr.html
NULLと空文字は別物
NULLと空文字は混同されがちですが、別物です。
-- NULLのデータ
WHERE
phone IS NULL;
-- 空文字のデータ
WHERE
phone = '';
たとえば、電話番号が未入力のデータを探す場合、システムによってはNULLで保存されていることもあれば、空文字で保存されていることもあります。
そのため、両方を対象にしたい場合は次のように書きます。
WHERE
phone IS NULL
OR phone = '';
実務では、テーブル設計や入力処理の仕様として、未入力をNULLで扱うのか、空文字で扱うのかを明確にしておくことが重要です。
複数条件の中でNULLを扱う例
たとえば、退会していないユーザーを取得したい場合、deleted_atがNULLであることを条件にするケースがあります。
SELECT
*
FROM
users
WHERE
status = 'active'
AND deleted_at IS NULL;
このSQLでは、ステータスが有効で、かつ削除日時が入っていないユーザーを取得します。
Webアプリケーションや業務システムでは、論理削除の判定としてdeleted_at IS NULLを使うことがよくあります。
実務でよく使うWHERE句の複数条件パターン
ここからは、実務でよく使われるWHERE句の書き方をパターン別に紹介します。
有効なデータだけを取得する
SELECT
*
FROM
users
WHERE
status = 'active'
AND deleted_at IS NULL;
有効なユーザーだけを取得する基本的な条件です。
statusで状態を確認し、deleted_at IS NULLで論理削除されていないことを確認しています。
特定のカテゴリーに属する商品を取得する
SELECT
*
FROM
products
WHERE
category_id IN (1, 2, 3)
AND is_published = true;
カテゴリーIDが1、2、3のいずれかで、公開中の商品だけを取得しています。
同じ列に対する複数候補なので、ORではなくINを使うと読みやすくなります。
期間内の注文データを取得する
SELECT
*
FROM
orders
WHERE
ordered_at >= '2026-05-01'
AND ordered_at < '2026-06-01';
2026年5月中の注文データを取得する例です。
日付の範囲指定では、終了日を「翌日の0時未満」または「翌月の1日未満」にする書き方が安全です。
管理者または承認済みユーザーを取得する
SELECT
*
FROM
users
WHERE
role = 'admin'
OR status = 'approved';
管理者、または承認済みユーザーを取得する例です。
ただし、この条件では、管理者であればステータスに関係なく取得されます。
もし「有効なユーザーのうち、管理者または承認済みユーザー」を取得したい場合は、次のように括弧を使います。
SELECT
*
FROM
users
WHERE
status = 'active'
AND (
role = 'admin'
OR approval_status = 'approved'
);
このように、ANDとORが混在する場合は、括弧で意図を明示しましょう。
WHERE句を書くときの可読性を高めるコツ
SQLは、正しく動けばよいというものではありません。
実務では、後から自分や他の開発者が見ても理解しやすいことが重要です。
特にWHERE句は、検索条件や業務ルールが集まりやすい場所です。
可読性が低いWHERE句は、仕様変更や不具合調査のときに大きな負担になります。
条件ごとに改行する
複数条件を1行に詰め込むと、読みづらくなります。
WHERE status = 'active' AND deleted_at IS NULL AND age >= 30 AND prefecture = '東京都';
実務では、次のように条件ごとに改行すると読みやすくなります。
WHERE
status = 'active'
AND deleted_at IS NULL
AND age >= 30
AND prefecture = '東京都';
条件が増えたときにも、差分が分かりやすくなります。
条件のまとまりを括弧で表す
OR条件がある場合は、括弧でグループ化しましょう。
WHERE
status = 'active'
AND (
prefecture = '東京都'
OR prefecture = '大阪府'
);
さらに、同じ列に対するORであれば、INに置き換えます。
WHERE
status = 'active'
AND prefecture IN ('東京都', '大阪府');
この方が意図が明確です。
業務ルールごとに条件を並べる
WHERE句の条件は、業務ルールごとに並べると読みやすくなります。
WHERE
-- 公開状態
is_published = true
AND deleted_at IS NULL
-- 対象カテゴリー
AND category_id IN (1, 2, 3)
-- 掲載期間
AND publish_start_at <= CURRENT_TIMESTAMP
AND (
publish_end_at IS NULL
OR publish_end_at > CURRENT_TIMESTAMP
);
コメントを使える環境であれば、条件の意味を補足するのも有効です。
ただし、コメントを書きすぎると逆に読みにくくなるため、「なぜその条件が必要か」が分かりにくい部分だけに絞るとよいでしょう。
WHERE句の複数条件でよくある間違い
WHERE句のミスは、SQLエラーとしてすぐに気づけるものばかりではありません。
むしろ、SQLは正常に動いているのに、抽出結果が間違っているケースが厄介です。
ここでは、実務でよくある失敗を紹介します。
ANDとORの優先順位を誤解する
最も多いミスの一つが、ANDとORの優先順位です。
WHERE
role = 'admin'
OR role = 'manager'
AND status = 'active';
このSQLは、次のように解釈されます。
WHERE
role = 'admin'
OR (
role = 'manager'
AND status = 'active'
);
つまり、adminはstatusに関係なく取得されます。
もし意図が「adminまたはmanagerで、かつactive」であれば、次のように書く必要があります。
WHERE
(
role = 'admin'
OR role = 'manager'
)
AND status = 'active';
または、同じ列に対する条件なので、INを使って次のように書けます。
WHERE
role IN ('admin', 'manager')
AND status = 'active';
文字列にクォートを付け忘れる
文字列を比較するときは、シングルクォートで囲みます。
WHERE
status = 'active';
次のような書き方は避けましょう。
WHERE
status = active;
データベースによっては、activeを列名として解釈しようとしてエラーになることがあります。
NULLを=で比較してしまう
NULL判定では、=ではなくIS NULLを使います。
誤りの例です。
WHERE
deleted_at = NULL;
正しくは次のように書きます。
WHERE
deleted_at IS NULL;
NULLではない行を取得する場合は、次のように書きます。
WHERE
deleted_at IS NOT NULL;
日付の終了条件でデータを取りこぼす
日付条件でよくあるのが、月末や当日分のデータを取りこぼすミスです。
WHERE
created_at BETWEEN '2026-05-01' AND '2026-05-31';
created_atに時刻が含まれている場合、5月31日の一部データが対象外になる可能性があります。
安全な書き方は次のとおりです。
WHERE
created_at >= '2026-05-01'
AND created_at < '2026-06-01';
この書き方なら、5月31日23時59分59秒のデータも自然に含められます。
条件を追加しすぎて意図が分からなくなる
実務では、機能追加や仕様変更を重ねるうちにWHERE句が長くなることがあります。
WHERE
status = 'active'
AND deleted_at IS NULL
AND category_id IN (1, 2, 3)
AND publish_start_at <= CURRENT_TIMESTAMP
AND (
publish_end_at IS NULL
OR publish_end_at > CURRENT_TIMESTAMP
)
AND user_type <> 'guest'
AND region IN ('east', 'west');
条件が多いこと自体は問題ではありません。
問題は、なぜその条件が必要なのか分からなくなることです。
このような場合は、次の観点で整理しましょう。
- 業務ルールごとに条件を並べる
- 同じ列に対するORはINにまとめる
- ANDとORの混在部分には必ず括弧を付ける
- 必要に応じてコメントを入れる
- 複雑すぎる場合はビューや共通テーブル式の利用を検討する
WHERE句のデバッグ方法
WHERE句で想定どおりの結果が出ない場合は、感覚で修正するのではなく、段階的に切り分けることが重要です。
まずWHEREなしで全体件数を確認する
最初に、条件を付けない状態でデータ件数を確認します。
SELECT
COUNT(*)
FROM
users;
これにより、対象テーブルにそもそもデータが存在するかを確認できます。
条件を1つずつ追加する
次に、条件を1つずつ追加して件数の変化を見ます。
SELECT
COUNT(*)
FROM
users
WHERE
status = 'active';
次に条件を増やします。
SELECT
COUNT(*)
FROM
users
WHERE
status = 'active'
AND deleted_at IS NULL;
さらに条件を追加します。
SELECT
COUNT(*)
FROM
users
WHERE
status = 'active'
AND deleted_at IS NULL
AND prefecture = '東京都';
このように確認すると、どの条件を追加したタイミングで件数が大きく変わったのかが分かります。
期待するデータを直接確認する
件数だけでは分からない場合は、実際のデータを確認します。
SELECT
user_id,
status,
deleted_at,
prefecture,
created_at
FROM
users
WHERE
user_id = 123;
想定しているデータが条件を満たしているかを1件ずつ確認すると、原因が見つかりやすくなります。
境界値のテストデータを確認する
WHERE句では、境界値の確認が重要です。
たとえば、次のようなデータです。
- 年齢がちょうど30歳
- 日付が月初
- 日付が月末
- NULLのデータ
- 空文字のデータ
- 大文字・小文字が異なるデータ
- 前後に空白が入っているデータ
条件式は、境界値で間違いが起きやすいです。
WHERE
age >= 30;
この条件では30歳を含みます。
WHERE
age > 30;
この条件では30歳を含みません。
この違いを理解しないままSQLを書くと、必要なデータを取りこぼす可能性があります。
データベースごとの差異にも注意する
SQLの基本的な考え方は多くのデータベースで共通していますが、細かい挙動はデータベース製品によって異なる場合があります。
たとえば、次のような点です。
- 文字列比較の大文字・小文字の扱い
- 日付型・日時型の扱い
- TRUE/FALSEの扱い
- NULLの扱い
- LIKE検索の挙動
- 暗黙的な型変換
- 使用できる関数や演算子
SQL Serverの公式ドキュメントでは、論理演算子は条件の真偽を評価し、TRUE、FALSE、UNKNOWNを返すと説明されています。MySQLやPostgreSQL、SQLiteなどでも基本概念は共通しますが、細部は利用しているDBMSの公式ドキュメントで確認するのが安全です。
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql?view=sql-server-ver17
参考情報として、代表的な公式ドキュメントを確認しておくとよいでしょう。
- PostgreSQL公式ドキュメント
https://www.postgresql.org/docs/current/sql-select.html - MySQL公式ドキュメント
https://dev.mysql.com/doc/refman/8.4/en/logical-operators.html - SQL Server公式ドキュメント
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-ver17 - SQLite公式ドキュメント
https://sqlite.org/lang_expr.html
実務では、「SQLとして一般的に正しい」だけでなく、「自社システムで使っているデータベースでどう動くか」まで確認することが重要です。
まとめ|WHERE句の複数条件は正確さと読みやすさが重要
SQLのWHERE句は、必要な行だけを取り出すための基本構文です。
複数条件を指定する場合は、AND、OR、IN、BETWEEN、LIKE、IS NULLなどを正しく組み合わせる必要があります。
特に重要なポイントは次のとおりです。
ANDはすべての条件を満たす行を取得するORはどれか1つでも条件を満たす行を取得するANDとORを併用するときは括弧で優先順位を明示する- 同じ列に対する複数候補は
INでまとめると読みやすい - 範囲条件には
BETWEENや比較演算子を使う - 日付条件では時刻の取りこぼしに注意する
- NULL判定では
=ではなくIS NULL/IS NOT NULLを使う - 条件は1つずつ追加してデバッグすると原因を特定しやすい
- データベース製品ごとの細かい仕様は公式ドキュメントで確認する
WHERE句の複数条件は、SQLの基礎でありながら、実務では品質に直結する重要な部分です。
条件を正しく書けるようになると、データ抽出、画面検索、集計、レポート作成、障害調査など、さまざまな業務で役立ちます。
もしSQLやデータベースの仕組みに興味を持ち、「ただ動くSQL」ではなく「正確で読みやすく、保守しやすいSQL」を書けるエンジニアを目指したい方は、実務の中で条件設計やデータ構造への理解を深めていくことが大切です。
当社では、データベースや業務システム開発に関心を持ち、技術を一つひとつ確実に身につけながら成長したい方と一緒に働きたいと考えています。SQLのような基礎技術を大切にしながら、実務で価値を発揮できるエンジニアを目指したい方は、ぜひ当社の求人情報もご覧ください。
学んだSQLを、実務で使えるスキルにしたい方へ
本記事ではSQLの基本的な考え方や使い方を解説しましたが、
「実務で使えるレベルまで身につけたい」と感じた方も多いのではないでしょうか。
SQLは、文法を理解するだけでなく、
- どんなデータ構造で使われるのか
- どんなクエリが現場で求められるのか
を意識して学ぶことで、実践力が大きく変わります。
そうした「実務を見据えたSQL学習」を進めたい方には、
完全無料で学べるプログラミングスクール ZeroCode PLUS という選択肢もあります。
- SQLを含むWeb・データベース系スキルを体系的に学べる
- 未経験者でも実務を意識したカリキュラム
- 受講料・教材費がかからない完全無料の学習環境
- 完全オンラインでスキマ学習
※学習内容や進め方を確認するだけでもOKです