【SQL入門3】between演算子で抽出する範囲を指定する

  • 2024.02.07
       
【SQL解説】between演算子で抽出する範囲を指定する

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;

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単60秒で無料お問い合わせから≪

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句の使い方やサブクエリの活用方法を解説
     

Programmingカテゴリの最新記事