VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
BETWEEN は値が範囲に入るかどうかをテストします。1 組の比較の省略形であり、
日付に対して、気付きにくい間違いを人がもっともよくする句です。
始める前に mysql -u root -p sakila でクライアントを開いてください。
BETWEEN の仕組み
LOW_BOUND と HIGH_BOUND を範囲の両端に置き換えます。
x BETWEEN a AND b は x >= a AND x <= b を意味します。範囲は両端を含み、
下限を先に書きます。
例
- 数値の範囲
- 同じことを書き下したもの
BETWEEN が省いてくれるのは列名を 2 回書く手間だけで、それ以外は
何もありません。
- 範囲の外
NOT BETWEEN は下限より下と上限より上の行を残します。46 分はカタログで最も
短い映画です。
下限を先に書かなければならない
BETWEEN は両端を並べ替えてくれません。大きい値を先に渡すと、70 以上かつ 60
以下の数値を求めることになり、そのような数値はありません。
日付に対する BETWEEN は午前 0 時で止まる
これは人が実際に時間を失うもので、列の型から始まります。payment_date は datetime なので、すべての値が時刻を持ちます。時刻なしで
書いた日付は、その日の始まりの午前 0 時を意味します。
'2005-05-26' は 2005-05-26 00:00:00 になりました。26 日中に行われた
支払いはすべてその瞬間より後なので、BETWEEN はそのすべてを除外しました。137
行は 25 日だけのものであり、ちょうど午前 0 時の瞬間に発生した支払いがあれば、それも
含まれていたはずです。
日付範囲は >= start AND < the day after the end (開始日以上、終了日の翌日未満) と書いてください。この形なら列が時刻を
持つかどうかを考える必要がなく、後から列に時刻が加わっても正しいままです。
まとめ
- 範囲には
BETWEENを使い、両端が含まれると考えてください。 - 逆向きの範囲は何にも一致せず、エラーも警告も出さないため、下限を先に書きます。
x BETWEEN a AND bはx >= a AND x <= bと読んでください。- 日付には
BETWEENではなく>= start AND < day_after_endを使います。
関連項目
- WHERE — BETWEEN を置く句
- 演算子 — BETWEEN が省略形となっている比較
- IN — 範囲ではなく値のリストをテストする
- MySQL の日付と時刻の関数 — 範囲の両端を組み立てる