SQLのBETWEEN句:範囲指定でデータを効率的に抽出する方法
「ある期間内のデータだけ見たい」「この価格帯の商品だけリストアップしたい」
そんな時、SQLでどうやって条件を指定すれば良いか、迷ったことはありませんか?
WHERE句で >= や <= を複数使うのも一つの手ですが、もっとスマートに、そして分かりやすく範囲を指定できる方法があります。
それが、今回ご紹介する BETWEEN 句です。
この句を使えば、開始値と終了値の間のデータを、まるで定規で測るかのように、すっきりと抽出できます。
しかし、その便利さゆえに、意図しない結果を招いてしまうことも…?
この記事では、SQLの BETWEEN 句の基本的な使い方から、具体的な例、そして注意点までを、初心者の方にも分かりやすく解説していきます。
BETWEEN句の基本構文と使い方
BETWEEN 句は、WHERE 句の中で使用され、指定した2つの値の範囲内にあるレコードを抽出します。
基本的な構文は以下の通りです。
SELECT column1, column2, ...
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
ここで、
column_name: 検索対象となる列名value1: 範囲の開始値value2: 範囲の終了値
となります。
重要なのは、BETWEEN 句は 両端の値を含む という点です。
つまり、WHERE column_name BETWEEN value1 AND value2 は、WHERE column_name >= value1 AND column_name <= value2 と同じ意味になります。
この「両端を含む」という性質を理解しておくと、後述する応用的な使い方や注意点がより分かりやすくなります。
数値での利用例
例えば、products テーブルに price という列があり、価格が1000円以上2000円以下の商品を抽出したい場合、BETWEEN 句は以下のように使えます。
SELECT product_name, price
FROM products
WHERE price BETWEEN 1000 AND 2000;
このクエリは、price が1000、2000、そしてその間のすべての値を持つレコードを返します。
もし、price がちょうど1000円や2000円の商品も取得したいのであれば、BETWEEN 句は非常に便利です。
もし BETWEEN を使わなかった場合、WHERE price >= 1000 AND price <= 2000 のように書く必要があり、少し冗長になります。
日付での利用例
日付の範囲指定にも BETWEEN 句はよく使われます。
例えば、orders テーブルに order_date という列があり、2023年1月1日から2023年1月31日までの注文を抽出したい場合、以下のように記述できます。
SELECT order_id, customer_id, order_date
FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';
日付のフォーマットはデータベースシステムによって異なる場合がありますが、一般的には 'YYYY-MM-DD' の形式が広く使われています。
このクエリは、指定した期間内のすべての注文を取得します。
「1月まるまる」のデータを取得したい場合に、order_date >= '2023-01-01' AND order_date <= '2023-01-31' と書くよりも、BETWEEN を使った方が、コードがすっきりして読みやすくなります。
文字列での利用例
文字列に対しても BETWEEN 句は利用可能です。
例えば、users テーブルに last_name という列があり、姓が「Sato」から「Suzuki」までのユーザーを抽出したい場合、以下のように記述できます。
SELECT user_id, first_name, last_name
FROM users
WHERE last_name BETWEEN 'Sato' AND 'Suzuki';
この場合、文字列は辞書順(アルファベット順)で比較されます。
'Sato' から 'Suzuki' までの範囲に含まれる姓を持つユーザーが抽出されます。
'Sato' や 'Suzuki' も含まれます。
ただし、文字列の比較は、大文字・小文字の区別や、全角・半角、スペースの有無などによって結果が変わる可能性があるため、注意が必要です。
BETWEEN句の応用と注意点
BETWEEN 句は便利ですが、いくつか注意しておきたい点があります。
NULL値の扱い
BETWEEN 句は、比較対象の列に NULL が含まれている場合、どのように動作するでしょうか?
NULL は、未知の値や欠損値を表します。
SQLの比較演算子(=, >, <, BETWEEN など)は、NULL との比較では、一般的に UNKNOWN という結果を返します。
これは、NULL がどんな値とも等しくなく、また大小関係も定義できないためです。
したがって、WHERE column_name BETWEEN value1 AND value2 という条件で、column_name が NULL のレコードは、条件を満たさない と判断され、結果に含まれません。
もし、NULL 値も範囲に含めたい、あるいは NULL 値を特別に扱いたい場合は、別途 OR column_name IS NULL のような条件を追加する必要があります。
SELECT *
FROM my_table
WHERE (my_column BETWEEN 10 AND 20) OR my_column IS NULL;
このクエリは、my_column が10から20の間にあるレコード、または my_column が NULL であるレコードをすべて取得します。
BETWEEN句の否定(NOT BETWEEN)
BETWEEN 句の反対、つまり範囲外のデータを抽出したい場合は、NOT BETWEEN を使用します。
SELECT column1, column2, ...
FROM table_name
WHERE column_name NOT BETWEEN value1 AND value2;
これは、WHERE column_name < value1 OR column_name > value2 と同義です。
例えば、価格が1000円未満、または2000円より大きい商品を抽出したい場合は、以下のように記述できます。
SELECT product_name, price
FROM products
WHERE price NOT BETWEEN 1000 AND 2000;
NOT BETWEEN も、NULL 値に対しては UNKNOWN を返すため、NULL 値は結果に含まれません。
BETWEEN句と不等号の使い分け
BETWEEN 句は、範囲指定を簡潔に記述できるため非常に便利ですが、常に最適とは限りません。
例えば、ある値 以上 のデータをすべて取得したい場合、WHERE column_name >= value と書くのが最も直接的で分かりやすいでしょう。
BETWEEN 句は、「〜から〜まで」という明確な開始点と終了点がある場合に特に真価を発揮します。
また、データベースによっては、BETWEEN 句よりも、個別の不等号 (>=, <=) を組み合わせた方が、パフォーマンスが良い場合があるという話も聞きます。
しかし、SQL初学者の方にとっては、まずは BETWEEN 句の「両端を含む範囲指定」という概念をしっかり理解することが重要です。
コードの可読性を高めるために、BETWEEN 句を積極的に活用していきましょう。
まとめ
SQLの BETWEEN 句は、指定した2つの値の範囲内にあるデータを抽出するための強力かつ便利なツールです。
WHERE column_name BETWEEN value1 AND value2は、WHERE column_name >= value1 AND column_name <= value2と同義で、両端の値を含みます。- 数値、日付、文字列など、様々なデータ型に対して使用できます。
NULL値とは比較されず、結果に含まれません。- 範囲外のデータを抽出するには
NOT BETWEENを使用します。
BETWEEN 句を使いこなすことで、より効率的で可読性の高いSQLクエリを作成できるようになります。
「ある期間内のデータ」や「特定の価格帯の商品」などを抽出する際に、ぜひ BETWEEN 句を思い出してみてください。