WEHRE句にBETWEEN(数値、文字、日付)で条件指定する

[box class=”blue_box” title=”覚えるべきキーワード”]
・WHERE 列名 BETWEEN 値1 AND 値2 ※列名は文字型
・WHERE 列名 BETWEEN 値1 AND 値2 ※列名は数値型
・WHERE 列名 BETWEEN 値1 AND 値2 ※列名は日付型
[/box]

このサンプルテーブルを使って以下のSQLを解説します。

サンプルテーブル1

(テーブル名:employee、id:数値型、name:文字型、bd:日付(デフォルトはDD-MON-RR)、h_salary:数値型)

ID NAME BD H_SALARY
10 SATOU 01-Aug-10 1000
11 KATOU 12-Apr-98 2000
12 YAMADA 25-May-02 5500
13 ISHII 9-Jan-00 6000
14 YASUDA 20-Mar-11 7000

WHERE 列名 BETWEEN 値1 AND 値2

BETWEENを使うと値の範囲に該当するレコードを選択できます。具体的には値1以上であり、かつ値2以下に該当するレコードが取得できます。ポイントとしては境界値も対象になることと指定する列のデータ型は数値、文字、日付が対象となることです。数値だけではないので注意してください。では具体的にサンプルSQLで見てみましょう。

[box class=”white_box” title=”WHERE 列名 BETWEEN 値1 AND 値2 ※列名は数値型”]

SELECT id name,h_salary FROM employee WHERE h_salary BETWEEN 2000 AND 6000;
[/box]

列名h_salaryの値が2000以上、かつ6000以下のid、name、h_salaryを取得するSQLです。結果は以下になります。

(サンプルテーブル1を対象)

ID NAME H_SALARY
11 KATOU 2000
12 YAMADA 5500
13 ISHII 6000

h_salaryが2000、5500、6000のレコードを取得しています。ちなみに、WHERE列名 NOT BETWEEN 2000 AND 6000にすると、2000以上でなく、かつ6000以下でないid、name、h_salaryを取得するので、h_salaryが1000と7000のレコードを取得します。NOTは境界値を含みませんので、2000や6000のレコードは該当しません。

[box class=”white_box” title=”WHERE 列名 BETWEEN 値1 AND 値2 ※列名は文字型”]

SELECT id,name bd FROM employee WHERE name BETWEEN ‘KASAI’ AND ‘UCHIDA’;
[/box]

文字列の列をBETWEEN対象にする場合は、値を一重引用符で囲います。そして値の範囲はアルファベット順で考えます。サンプルSQLではKASAI以上、かつUCHIDA以下なので、’KASAI’について考えると’Jより早いアルファベットの値’は対象外ですが、’Lより遅いアルファベットの値’は対象です。また’UCHIDA’について考えると’Tより早いアルファベットの値’は対象ですが、’Vより遅いアルファベットの値’は対象外です。結果、この条件では’Lより遅いアルファベットの値、かつTより遅いアルファベットの値が対象となります。ちなみに、アルファベット2文字以降に関しても同じ考え方です。KASAI以上なので、KATOUは対象ですが、KASADAは対象外になります。

解説が長くなりましたが、先ほどのSQLを実行すると以下になります。

(サンプルテーブル1を対象)

ID NAME BD
10 SATOU 01-Aug-10
11 KATOU 12-Apr-98

取得できるレコードはnameがSATOUとKATOUのものになります。

[box class=”white_box” title=”WHERE 列名 BETWEEN 値1 AND 値2  ※列名は日付型”]

SELECT id,name,bd FROM employee WHERE bd BETWEEN ’11-APR-97’ AND ’10-May-03’;
[/box]

日付を指定したBETWEENです。日付の列をBETWEEN対象にする場合は、日付順で考えます。日付の場合は値を一重引用符で囲みます。

(サンプルテーブル1を対象)

ID NAME BD
11 KATOU 12-Apr-98
12 YAMADA 25-May-02
13 ISHII 9-Jan-00

1998年4月12日、2002年5月25日、2000年1月9日の日付はBETWEEN条件の1997年4月11日から2003年5月10日の範囲内ですね。この3つのレコードが取得できます。

このようにBETWEEN句は列名のデータ型により書き方や対象範囲の考え方を整理する必要があります。数値型は簡単だと思いますが、文字型はアルファベット順で考える必要がありますし、日付型は指定されている条件を一度変換して考えなければ分かりづらいです。(例えば、11-APR-97なら、1997年4月11日に変換して考える)
BETWEENはSQLでよく使いますし、またハマリ易いところなので気を付けてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です