構文解説2026/8/26

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_nameNULL のレコードは、条件を満たさない と判断され、結果に含まれません。

もし、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_columnNULL であるレコードをすべて取得します。

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 句を思い出してみてください。


QSQL Quest