1. はじめに
MySQLで日付範囲を指定する際に使用される BETWEEN
演算子は、シンプルなクエリで特定の期間内のデータを取得できる便利な機能です。例えば、売上データを月ごとに取得したり、ユーザーの登録日が特定の期間内であるかを検索する際に役立ちます。
しかし、BETWEEN
を使う際には、データ型(DATE
、DATETIME
)の扱い方やパフォーマンスの問題に注意する必要があります。本記事では、基本的な使い方から応用テクニックまで詳しく解説していきます。
2. MySQLのBETWEEN演算子の基本
2.1 BETWEENの基本構文
BETWEEN
演算子は、指定した範囲内の値を取得するために使用されます。以下のような基本構文を持ちます。
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
このクエリは、order_date
が 2024年1月1日から2024年1月31日まで のデータを取得します。BETWEEN
は 開始日と終了日を含む ことがポイントです。
2.2 BETWEEN vs. 比較演算子 (>= AND <=
)
同じ結果を得るには、>=
と <=
を組み合わせた比較演算子を使うこともできます。
SELECT * FROM orders
WHERE order_date >= '2024-01-01' AND order_date <= '2024-01-31';
BETWEEN
のメリット:
- シンプルな記述で可読性が高い
>= AND <=
のメリット:
- 範囲指定をより細かく調整できる(例:時刻を除外する場合)
例えば、DATETIME
型のカラムに BETWEEN
を使用すると、時間情報が含まれるため、意図しないデータが取得されることがあります。この点については次のセクションで詳しく解説します。
3. BETWEEN演算子を使う際の注意点
3.1 時間情報を含むカラムの扱い
BETWEEN
を DATETIME
型のカラムで使用すると、予期しない結果になることがあります。
SELECT * FROM users
WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';
このクエリでは 2024-01-31 00:00:00
までのデータしか取得されず、1月31日のデータのうち、午前0時以降のデータが除外されてしまう という問題が発生します。
3.2 正しい範囲指定方法
この問題を解決するには、終了日を翌日未満にする 方法が有効です。
SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
このように >=
と <
を使うことで、1月31日いっぱいのデータを確実に取得することができます。

4. BETWEENとパフォーマンス最適化
4.1 インデックスとBETWEENの関係
BETWEEN
演算子は適切にインデックスを設定することで高速に動作します。しかし、DATE()
関数を使うとインデックスが効かなくなるため注意が必要です。
-- インデックスが効かなくなる(非推奨)
SELECT * FROM users
WHERE DATE(created_at) BETWEEN '2024-01-01' AND '2024-01-31';
推奨されるクエリ:
SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
4.2 EXPLAINを使ったクエリ最適化
パフォーマンスを確認するには、EXPLAIN
コマンドを使用すると便利です。
EXPLAIN SELECT * FROM users WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';
これにより、使用されるインデックスや実行計画を確認 できます。
5. よくある間違いとその対処法
5.1 BETWEENで意図しない範囲が取得される
BETWEEN
を使用したつもりでも、時刻情報を考慮していないと意図しないデータが含まれたり除外されたりすることがあります。正しい方法として >=
と <
を組み合わせる ことを推奨します。
5.2 インデックスが無効になるクエリ
DATE()
関数や CAST()
を用いた条件は、インデックスを無効化する可能性があります。可能な限り そのまま比較する形に修正 するのがベストです。
6. よくある質問(FAQ)
Q1: BETWEENは開始日と終了日を含みますか?
→ はい、BETWEEN
は 指定した範囲の両端を含みます。
Q2: BETWEEN
と >= AND <=
はどちらを使うべき?
→ シンプルな範囲指定なら BETWEEN
、時刻情報を考慮する場合は >= AND <
を推奨。
Q3: BETWEEN
を使うとクエリが遅くなることはある?
→ DATE()
関数や CAST()
を使うと インデックスが効かなくなる ため、直接比較する方法を推奨。
7. 実務で使えるサンプルクエリ集
7.1 特定の年月のデータを取得
WHERE created_at BETWEEN '2024-02-01' AND '2024-02-28';
7.2 今日のデータを取得
WHERE created_at BETWEEN CURDATE() AND CURDATE() + INTERVAL 1 DAY;
7.3 過去30日間のデータを取得
WHERE created_at BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE();
8. まとめ
BETWEEN
演算子は 日付範囲をシンプルに指定できる が、DATETIME
型を扱う際は注意が必要。BETWEEN
は 開始日と終了日を含む ため、正しい範囲指定をする必要がある。- パフォーマンス最適化にはインデックスの活用が重要 であり、
DATE()
関数の使用は避けるべき。 >= AND <
を使うことで より確実な範囲指定が可能。
以上、MySQLで BETWEEN
演算子を使う際のポイントを解説しました。実務での活用に役立ててください!