【Oracle】WHERE句の実践テクニック大全:AND/OR/IN/BETWEEN/IS NULL の使い分けと最適化ガイド

IT技術情報

1. はじめに:WHERE句は「SQL品質の半分」を決める

OracleのSQLで最も多く書かれる句が WHERE です。
単なる条件指定に見えて、パフォーマンス・正確性・保守性を大きく左右します。

本記事では、基本構文から“現場で使える条件指定のテクニック”まで、
体系的に理解できるようにまとめました。


2. WHERE句の基本構文と評価順序

Oracleのクエリ処理順序では

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

の順に評価されます。
つまり、WHERE句は最初の絞り込み段階で最も重要です。


3. AND/OR の正しい使い方と注意点

■ 基本構文

👉 AND は「すべての条件を満たす」、
 OR は「いずれかを満たす」。


■ ORを多用すると遅くなる理由

ORを多用するとインデックスが効きにくくなります。
パフォーマンスを上げるなら、以下のように書き換え可能です。


4. IN/EXISTS の使い分け

■ IN句:小規模データに最適

サブクエリが少数(100件未満)なら IN が高速です。


■ EXISTS句:大規模データ向け

EXISTS はマッチした瞬間に評価を終了するため、
大規模サブクエリでは IN より効率的です。


5. NULL比較の落とし穴と対策

Oracleでは NULL は値が「存在しない」状態であり、
比較演算子(=!=)では一致しません。

■ NG例(常にFALSE)

■ 正しい書き方


■ NVL関数でNULLを明示的に処理

👉 削除フラグがNULLの行も“未削除”として扱いたいときに便利です。


6. BETWEEN・LIKE の最適な使い方

■ 範囲検索(BETWEEN)

BETWEEN両端を含む(Inclusive) ので注意。
上記例では 10/31 23:59:59 まで含まれます。


■ 部分一致検索(LIKE)

  • %:任意の文字列
  • _:任意の1文字

■ LIKE+インデックス活用のコツ

前方一致(LIKE 'A%')はインデックス有効。
しかし後方一致(LIKE '%A')は全件スキャンになるため注意。

改善策として INSTR 関数を使う方法もあります👇


7. CASE式とWHERE句の組み合わせ応用

条件が動的に変わる場合は、CASE式を使って柔軟に制御可能です。

👉 業務システムで検索条件を可変にしたい場合に便利です。


8. 実務で役立つWHERE句テクニック集

シーンSQL例ポイント
NULLを含む比較WHERE NVL(flag, 'N') = 'N'削除フラグや状態判定で便利
曜日判定WHERE TO_CHAR(SYSDATE, 'DY') = '月'営業日抽出に応用
日付範囲WHERE TRUNC(order_date) BETWEEN ...時刻部分を除いて比較
部分一致WHERE INSTR(name, '株式会社') > 0LIKEより高速な場合あり
指定除外WHERE code NOT IN ('A','B','C')INの反転条件
優先条件WHERE (status = '1' AND flag = 'N') OR priority = 'Y'括弧で評価順を明確化

9. パフォーマンス改善のヒント

問題対策
複雑なOR条件で遅いUNIONまたはINに書き換える
WHEREで関数使用が多い関数索引(Function-Based Index)を検討
NULL比較でINDEX無効化NVLで明示的に比較値を補完
フラグ列が多いビットマスク管理 or ENUMテーブル化を検討

10. まとめ:WHERE句を制す者がOracleを制す

分類キーワード特徴
論理条件AND/OR/IN/EXISTS検索効率の基本
NULL処理IS NULL/NVL正確な条件分岐
範囲・曖昧BETWEEN/LIKE/INSTR現場で頻出
最適化関数索引/UNION化パフォーマンス改善

OracleのWHERE句は、「ただ条件を絞る句」ではなく、
SQL全体の性能と信頼性を決定づける中核ロジックです。
構文の正確さと実行計画の理解、両方を意識して使いこなしましょう。

コメント

タイトルとURLをコピーしました