SQL BETWEEN──なぜ抽出漏れやミスが起きる?実践サンプルで徹底解説
「BETWEENって“範囲指定”って聞いたけど、本当に両端も含まれる?
期間外のデータを除外したいとき、どう書けばミスがないの?」
そんな疑問や不安、私たちもよく現場で出会います。
実は日付や時刻、NULL値が絡むと、思わぬバグや抽出漏れが起こりがち。
焦って何度もクエリを書き直した経験、ありませんか?
本記事では、SQLのBETWEEN/NOT BETWEENの基本から、現場ですぐ役立つサンプル、
「やってしまいがち」な失敗例やデータ型の落とし穴まで、実務目線で整理します。
(SQLの基本的なSELECT文の書き方については『初心者向けSQL講座|SELECT文の書き方と実行順を完全解説』をご参照ください)
1. SQL BETWEENとは?──使い方と“両端含む”ルール
BETWEENは、指定したカラムが“ある範囲内”かどうか判定するSQLの条件式。
主に数値・日付・文字列の検索で活躍します。
用語解説:BETWEEN
SQLで指定した範囲(最小値~最大値)にデータが含まれるか判定する条件式。両端も含まれる。用語解説:カラム
データベースの表(テーブル)で、各項目(列)を指す。例:売上日、価格など。
SELECT * FROM テーブル名
WHERE カラム名 BETWEEN 最小値 AND 最大値;
- 両端(最小値・最大値)も含まれるのがポイント。
- 例えば「2025-10-01」〜「2025-10-31」なら、その2日もちゃんと範囲に入ります。
(SQLのサブクエリやJOINとの違いについては『SQLサブクエリは遅い?JOIN・CTEとの違いと高速化のベストプラクティス』をご参照ください)
SELECT * FROM sales
WHERE sale_date BETWEEN '2025-10-01' AND '2025-10-31';
サンプルで理解!数値・日付・文字列それぞれのBETWEEN
-
数値の場合
SELECT * FROM products WHERE price BETWEEN 1000 AND 3000; -
日付+時刻の場合
SELECT * FROM sales WHERE sale_datetime BETWEEN '2025-10-01 00:00:00' AND '2025-10-31 23:59:59'; -
文字列の場合(辞書順の範囲!)
SELECT * FROM members WHERE member_code BETWEEN 'A100' AND 'A199';
用語解説:DATE型 / DATETIME型
DATE型は「日付のみ」、DATETIME型は「日付+時刻」を扱うデータ型。範囲指定時の挙動が異なる。用語解説:文字コード順
文字列のBETWEENは、アルファベットや数字の並び順(コード順)で判定される。
注意:データ型による落とし穴
-
DATE型とDATETIME型で、範囲の意味合いが変わります。
- DATE型は日付だけ。
DATETIME型は“時刻まで一致”しないと最終日が含まれないことも。
- DATE型は日付だけ。
- 文字列のBETWEENは「文字コード順」。思わぬ範囲になるケースも多いので要注意です。
(SQLの型やNULL値の扱いについては『【SQL】CHARとVARCHARの違いとは?「空白が埋まる」「文字が切れる」よくあるつまずきを徹底解説』をご参照ください)
2. 期間外の除外──NOT BETWEENと比較演算子の使い分け
「その期間以外のデータを抜きたい…どうする?」
そんな時はNOT BETWEENの出番。
用語解説:NOT BETWEEN
指定した範囲外のデータだけを抽出するSQL条件式。両端も除外される。用語解説:比較演算子(>=, <=, <, >)
データの大小や範囲を判定する記号。BETWEENと同じ意味で使えるが、細かい制御が可能。
NOT BETWEENのサンプル
SELECT *
FROM sales
WHERE sale_datetime NOT BETWEEN '2025-10-01 00:00:00' AND '2025-10-31 23:59:59';
→ この場合、10月1日〜31日以外のデータだけ抽出されます。
>=, <= との違いと応用
BETWEENは「A以上B以下」と等価ですが、もっと細かく制御したいときは比較演算子の組み合わせも使えます。
-- 同じ意味
WHERE sale_date BETWEEN '2025-10-01' AND '2025-10-31'
-- これと等価
WHERE sale_date >= '2025-10-01' AND sale_date <= '2025-10-31'
-
「期間外」なら
WHERE sale_date < '2025-10-01' OR sale_date > '2025-10-31'
という書き方もOK。
まとめサンプル:コピペで迷わない
-- 期間内
SELECT * FROM sales
WHERE sale_datetime BETWEEN '2025-10-01 00:00:00' AND '2025-10-31 23:59:59';
-- 期間外
SELECT * FROM sales
WHERE sale_datetime NOT BETWEEN '2025-10-01 00:00:00' AND '2025-10-31 23:59:59';
3. BETWEENを使いこなすための5つの注意点
-
終了日の時刻指定に注意!
- DATETIME型では終了日の「23:59:59」まで明示しないと、その日のデータが漏れます。
- 例:
BETWEEN '2025-10-01 00:00:00' AND '2025-10-31 23:59:59'で全日カバー。
-
NULL値にはBETWEENは効かない
- BETWEENはNULL値を自動的に除外。
- NULLも含めたいなら
OR カラム IS NULLを追加。
-
順番・データ型ミス
- 最小値・最大値の順番逆だと、SQLによっては空結果やエラー。
- DATEとDATETIME、数値と文字列など異なる型は比較NG。
-
インデックス効率に注意
- WHERE句で関数や計算を使うとインデックスが効かず遅くなる場合がある。
- できるだけ“素直な比較”で書くのが鉄則。
-
DBごとの違いも要チェック
- MySQL/Oracle/PostgreSQLで「型やタイムゾーン」「NULLの扱い」が違う場合あり。
- 公式マニュアルで必ず仕様を確認しましょう。
用語解説:NULL値
データが未入力・未登録の状態を示す特殊な値。BETWEENでは自動的に除外される。用語解説:インデックス
データベースの検索速度を上げるための仕組み。WHERE句で関数や計算を使うと効率が落ちる。用語解説:タイムゾーン
世界各地の標準時刻。DBやシステムの設定によって日付・時刻の扱いが変わる場合がある。
4. すぐ使えるテンプレとワークフロー
よく使うテンプレート例
-
期間内抽出(DATETIME型)
SELECT * FROM sales WHERE sale_datetime BETWEEN '開始日 00:00:00' AND '終了日 23:59:59'; -
期間外抽出(NOT BETWEEN)
SELECT * FROM sales WHERE sale_datetime NOT BETWEEN '開始日 00:00:00' AND '終了日 23:59:59'; -
DATE型の場合
SELECT * FROM sales WHERE sale_date BETWEEN '2025-10-01' AND '2025-10-31'; -
NULL値を除外
SELECT * FROM sales WHERE sale_datetime IS NOT NULL AND sale_datetime BETWEEN '2025-10-01 00:00:00' AND '2025-10-31 23:59:59';
抽出条件の整理フロー
- カラムの型を確認(DATE/DATETIME/文字列?)
- 開始・終了値を決める
- NULLや例外データを洗い出す
- NOT BETWEENや比較演算子で応用パターンに対応
- 抽出結果の目視確認を忘れずに
用語解説:抽出条件
データベースから必要なデータだけを取り出すための条件設定。型やNULL値の扱いが重要。
ぜひコードをコピペして、まずは動かしてみてください。
5. FAQ──BETWEEN/NOT BETWEENで“よくある疑問”
- BETWEENで日付指定したら最終日が含まれないのはなぜ?
DATETIME型の場合、終了時刻まで指定しないと最終日全体が取れません。DATE型なら丸1日含まれます。 - NOT BETWEENで本当に“期間外”だけ取れる?
両端も除外します。確実に範囲外だけ欲しいときに有効。 - 文字列カラムでBETWEENを使うと何が起きる?
「文字コード順」なので、思わぬ範囲が拾われる場合あり。条件は慎重に。 - BETWEENでNULL値があるとどうなる?
NULLは除外。必要ならOR IS NULLで補完。 - BETWEENと >=/<=、どちらが速い?
概ね等価。WHERE句で計算・関数を使うとインデックス非活用になることも。 - タイムゾーンや時刻成分の注意点は?
DBやシステムのタイムゾーン設定で結果がズレる場合あり。必ず確認しましょう。 - 複数カラム・複合条件でBETWEENは使える?
SQL標準では直接不可。AND/ORやサブクエリで工夫が必要です。
まとめ
SQLのBETWEENは、範囲指定の心強い味方。でも、日付・時刻・文字列・NULL値・インデックスなど、“油断ポイント”も満載です。
「両端は本当に含まれる?」「期間外はどう書く?」「型やタイムゾーンの違いは?」
そんなモヤモヤをスッキリさせるには、一つずつ丁寧に試し、現場の仕様と照らし合わせるのが大事。
本記事で紹介したコードやワークフローを手元で動かして、ぜひ“自分の現場仕様”に合わせてみてください。
現場での迷いやミスがグッと減るはずです。