実践で使えるSQL講座です
20年の実務経験を元に、机上でなく実践で役立つ知識を紹介します
範囲抽出ができます
項目名 BETWEEN 小さい値 AND 大きい値
で小さい値と大きい値の間の項目名を探すという意味です。
項目名 >= 小さい値 AND 項目名 <= 大きい値
と同じ意味です。
数字でも日付でも使えます。
履歴でデータをもっている場合はよく使います。
BETWEEN
があるのは、シンプルにわかりやすく書けるからです。
わかりやすく書くのはプログラムで一番重要です。
数字と日付に使います。文字列も使えますが、普通は使わないです。
以上と以下で指定した値を含むということに注意してください。
項目名 BETWEEN 小さい値 AND 大きい値
と書きましたが、項目名も値も区別なく使えます
値 BETWEEN 小さい項目名 AND 大きい項目名
としても大丈夫です。
時間別の履歴データを持つシステムでしたら、
この使い方の方が多いです。
サンプルは下にかいてありますので参照ください
日付を使う場合は時間に注意
履歴データを検索します。
このテーブルの意味は2019年はABC会社でしたが、
2020年にAAA会社と社名変更したというサンプルです
顧客名 | 開始日 | 終了日 |
---|---|---|
ABC会社 | 2019-01-01 | 2019-12-31 |
AAA会社 | 2020-01-01 | 2020-12-31 |
今日の2020年5月5日の会社名はこのSQLを使用します。
‘AAA会社’と結果が返ってきます
*Oracleのデータベースを使用した時のサンプルです。SYSDATEは今日の日時を返します
SELECT * FROM 顧客テーブル WHERE SYSDATE BETWEEN 有効開始日 AND 有効終了日
では2019年12月31日時点でこのSQLを実行したとします。
そしたら顧客名は何と帰ってくるでしょうか?
答えは結果が返ってこないです。
というのもSYSDATEは時間までデータを持っています。
10時10分に実行したらこうなります2010-12-31 10:10
わかりやすいように書くと
'2019-12-31 10:10' BETWEEN '2019-01-01 00:00' AND '2019-12-31 00:00'
となるので、抽出されないのです。
日付を使う場合は時間まで含まれているか注意しないといけません。
修正すると下のようになります。
TRUNCはOracleでは切り捨てをする関数で、
日付データに使うと時間が切り捨てられます
SELECT
*
FROM 顧客テーブル
WHERE
TRUNC(SYSDATE) BETWEEN 有効開始日 AND 有効終了日
(項目名 or 値) BETWEEN (項目名 or 値) AND (項目名 or 値)