MySQL の BETWEEN
ここでは MySQL の BETWEEN と NOT BETWEEN 演算子についてご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の BETWEEN 演算子
MySQL の BETWEEN 演算子は次のような構文で使用し、[A] が [B] と [C] の範囲内にある場合は 1 (TRUE) を、そうでなければ 0 (FALSE) を返す演算子です。
[A] BETWEEN [B] AND [C]
意味的には [B] <= [A] AND [A] <= [C] と同じで、範囲は [B] と [C] を含みます。
WHERE 句 や CASE WHEN の条件文など、boolean(ブーリアン)を返す式が必要な箇所で使えます。
BETWEEN 演算子を使ってテーブルからデータを取得してみましょう。
例えば、次のような students テーブルがあります。
この students テーブルから student_id が 2 ~ 5 の学生のデータのみを取得したい時は次のようにできます。
SELECT *
FROM students
WHERE student_id BETWEEN 2 AND 5;
[実行結果]
student_id が 2 ~ 5 の学生のデータのみが取得できていますね。
MySQL の NOT BETWEEN 演算子
MySQL の NOT BETWEEN 演算子は次のような構文で使用し、[A] が [B] ~ [C] の範囲に入っていなければ、1 (TRUE) を、そうでなければ 0 (FALSE) を返す演算子です。
[A] NOT BETWEEN [B] AND [C]
BETWEEN を反対にしたもので、意味的には [A] < [B] OR [C] < [A] と同じです。
ですので、[A] が [B] や [C] の時は 0 (FALSE) になります。
NOT BETWEEN 演算子を使ってテーブルからデータを取得してみましょう。
先ほどとは反対に students テーブルから student_id が 2 ~ 5 ではない学生のデータのみを取得したい時は次のようにできます。
SELECT *
FROM students
WHERE student_id NOT BETWEEN 2 AND 5;
[実行結果]
student_id が 2 ~ 5 ではない学生のデータが取得できていますね。
BETWEEN を使う時は NULL に注意!
BETWEEN 演算子を使う時は、[B] か [C] が NULL になると、評価の結果が全部 UNKNOWN となり、True になることはないので注意が必要です。
具体的な例をあげてご説明します。
例えば、@student_id_from と @student_id_to をクライアントプログラムから受け取って、次のクエリーを実行するとします。
@student_id_from が 2 でも @student_id_to が NULL の場合は、student_id が 2 以上のレコードを返すのではなく、結果セットは何も返ってきません。
SET @student_id_from = 2, @student_id_to = NULL;
SELECT *
FROM students
WHERE student_id BETWEEN @student_id_from AND @student_id_to;
[実行結果]
これは、2 <= student_id AND student_id <= NULL と同等なためで、student_id <= NULL が UNKNOWN になり、UNKNOWN との AND は UNKNOWN となるためです。
NOT BETWEEN になると少し状況が違って、2 より小さい student_id を持つ学生のレコードが取得できます。
SET @student_id_from = 2, @student_id_to = NULL;
SELECT *
FROM students
WHERE student_id NOT BETWEEN @student_id_from AND @student_id_to;
[実行結果]
これは、student_id < 2 OR NULL < student_id と同等なためで、NULL < student_id の評価結果が UNKNOWN でも、OR 演算子なので student_id < 2 の評価結果は 1 (TRUE) となるためです。
以上、MySQL の BETWEEN と NOT BETWEEN 演算子についてご説明しました。