between演算子とは
between には「~の間」という意味がありますが、between演算子も同じ意味合いの機能を有しており、SQL の where句でbetween演算子を使えば、抽出条件に「A から B の間」といった範囲を指定することができます。
この between演算子では数値のほかにも日付や文字列に対して条件指定ができます。
between演算子の使い方
between構文
select * from テーブル名
where カラム名 between 開始値 and 終了値
以下のサンプルを用いて詳しく説明していきます。
usersテーブル
id | first_name | last_name | registration date |
1 | Takumi | Satou | 2022-01-01 10:00:00 |
2 | Rina | Suzuki | 2022-01-02 00:00:00 |
3 | Kanta | Takahashi | 2022-01-02 00:10:00 |
4 | Miku | Tanaka | 2022-01-03 00:00:00 |
5 | Ken | Itou | 2022-01-03 15:00:00 |
6 | Eri | Watanabe | 2022-01-04 00:10:00 |
実行命令
SELECT * FROM users WHERE id BETWEEN 2 AND 4;
実行結果
id | first_name | last_name | registration date |
2 | Rina | Suzuki | 2022-01-02 00:00:00 |
3 | Kanta | Takahashi | 2022-01-02 00:10:00 |
4 | Miku | Tanaka | 2022-01-03 00:00:00 |
between演算子では、必ず指定された値が含まれます。つまり、「A以上B以下」と同じ役割を持っているということで、「<=」、「>=」といった演算子でも表すことができます。
そのため、以下の 2つは同じ結果を返します。
SELECT * FROM users WHERE id BETWEEN 2 AND 4;
SELECT * FROM users WHERE id >= 2 AND id <= 4;
between演算子で日付の範囲を指定する
実行命令
SELECT * FROM users WHERE registration date BETWEEN 2022-01-02 00:00:00 AND 2022-01-03;
実行結果
id | first_name | last_name | registration date |
2 | Rina | Suzuki | 2022-01-02 00:00:00 |
3 | Kanta | Takahashi | 2022-01-02 00:10:00 |
4 | Miku | Tanaka | 2022-01-03 00:00:00 |
ここで、問題が発生したことにお気づきでしょうか。
3日にユーザ登録をした Kenさんが表示されていませんよね。
between演算子で日付の範囲を指定する上で気を付けなければならないことがあります。
カラムが時間を含める日付の場合、[開始値] と [終了値] に日付のみを指定してしまうと、[終了値] の日付はその日の 0時ちょうど以外含まれないという事象が起きてしまいます。
先ほど発生した問題はこれが原因です。
「2022/01/03」は「2022/01/03 00:00:00」という意味になるのです。
こういった場合は次のように指定することで解決できます。
実行命令
SELECT * FROM users WHERE registration date BETWEEN 2022-01-02 00:00:00 AND 2022-01-03 23:59:59;
実行結果
id | first_name | last_name | registration date |
2 | Rina | Suzuki | 2022-01-02 00:00:00 |
3 | Kanta | Takahashi | 2022-01-02 00:10:00 |
4 | Miku | Tanaka | 2022-01-03 00:00:00 |
5 | Ken | Itou | 2022-01-03 15:00:00 |
between演算子で文字列の範囲を指定する
between演算子は文字列を指定することもできます。
実行命令
SELECT * FROM users WHERE last_name BETWEEN 'a' AND 's';
実行結果
id | first_name | last_name | registration date |
1 | Takumi | Satou | 2022-01-01 10:00:00 |
2 | Rina | Suzuki | 2022-01-02 00:00:00 |
5 | Ken | Itou | 2022-01-03 15:00:00 |
ただ、わかりにくく、不具合も誘発しやすいため、between演算子ので文字列の指定はおすすめしません。
between演算子の否定形
範囲外の値を表示するには、次を使用します先述した構文の「BETWEEN」の前に「NOT」を付けます。
たとえば、先ほどの例文に NOT をつけて実行すると、id が 2 より小さいレコードと 5 より大きいレコードが抽出できます。
実行命令
SELECT * FROM users WHERE id NOT BETWEEN 2 AND 4;
実行結果
id | first_name | last_name | registration date |
1 | Takumi | Satou | 2022-01-01 10:00:00 |
5 | Ken | Itou | 2022-01-03 15:00:00 |
6 | Eri | Watanabe | 2022-01-04 00:10:00 |
ちなみに、以下に示す命令でも同じ結果を返します。
SELECT * FROM users WHERE id < 2 OR id > 5;
BETWEEN で NULL が絡むとどうなる?
項目のうち、一つでも NULL になると、結果は UNKNOWN となり、FALSE と同じ扱いになってしまいます。
特に [開始値] または [終了値] が NULL になる可能性がある場合は、結果が全て UNKNOWN になってしまうので、注意が必要です。
あらかじめ NULL があるかチェックして値を置き換えるなどの対策が必要です。
まとめ
本記事では between演算子について解説しました。WHEREのコード量を減らし、可読性を上げるのに役立つ命令なので、ぜひ覚えておきましょう。
▼WHERE句で検索条件を指定する方法について知りたい方はこちら
【SQL入門1】WHEREで検索条件を指定する方法を解説
▼IN句の使い方について知りたい方はこちら
【SQL入門】IN句の使い方やサブクエリの活用方法を解説