【SQL】IN・BETWEENで複数条件・範囲を指定する

SQL

こんにちは、かつコーチです。
「東京・大阪・愛知に住んでいる人」「価格が1,000円〜3,000円の商品」のように、複数の候補や範囲を指定したい場面はとても多いです。
ORを何個も並べると読みにくくなりますが、INBETWEENを使えばすっきり書けます。
今回はこの2つの演算子を解説します。

IN・BETWEENとは?

INは「複数の候補のどれかに一致」を表す

INは、指定したリストの中のいずれかの値に一致する行を取得する演算子です。
ORを複数つなげたときと同じ結果になりますが、書き方が簡潔になります。

BETWEENは「範囲内かどうか」を表す

BETWEENは、指定した範囲(以上〜以下)に含まれる値を取得する演算子です。
比較演算子の>=<=を組み合わせたのと同じ意味を、1つの構文で表現できます。

基本の書き方

INで複数の値を指定する

都道府県が「東京都」「大阪府」「愛知県」のいずれかに一致する行を取得します。

❌ Before(ORを並べる書き方。候補が増えると冗長)

SELECT name, prefecture
FROM users
WHERE prefecture = '東京都' OR prefecture = '大阪府' OR prefecture = '愛知県';

✅ After(INでまとめる書き方。読みやすく、候補追加も簡単)

SELECT name, prefecture
FROM users
WHERE prefecture IN ('東京都', '大阪府', '愛知県');

候補が3つ程度ならORでもさほど問題ありませんが、5つ、10つと増えるとINのほうが圧倒的に見やすくなります。

BETWEENで範囲を指定する

価格が1,000円以上3,000円以下の商品を取得します。

❌ Before(比較演算子を2つ並べる書き方)

SELECT name, price
FROM products
WHERE price >= 1000 AND price <= 3000;

✅ After(BETWEENでまとめる書き方)

SELECT name, price
FROM products
WHERE price BETWEEN 1000 AND 3000;

BETWEENは「以上・以下」、つまり指定した両端の値を含む点がポイントです。

日付範囲でもBETWEENは便利

注文日が2026年1月1日から2026年1月31日までのデータを取得する例です。

SELECT order_id, order_date
FROM orders
WHERE order_date BETWEEN '2026-01-01' AND '2026-01-31';

月次レポートを作るときなど、期間指定のクエリで頻繁に使う書き方です。

つまずきやすい設定・注意点

BETWEENは日時型だと「境界の抜け」に注意する

order_dateカラムがDATE型(日付のみ)ではなく、DATETIME型(日時まで含む)の場合、BETWEEN '2026-01-01' AND '2026-01-31'と書くと、1月31日の0時0分0秒しか含まれず、1月31日の日中のデータが抜け落ちてしまいます。

私も月次売上の集計クエリを作っていたとき、31日分の注文が数件しか集計されず「なぜ少ないんだろう」と半日悩んだことがあります。
原因は、DATETIME型のカラムに対して日付だけのBETWEENを使っていたことでした。

❌ Before(DATETIME型で境界日のデータが抜け落ちる)

SELECT * FROM orders
WHERE created_at BETWEEN '2026-01-01' AND '2026-01-31';

✅ After(境界を意識して範囲を明示する)

SELECT * FROM orders
WHERE created_at >= '2026-01-01 00:00:00'
  AND created_at < '2026-02-01 00:00:00';

日時型のカラムを扱う場合は、BETWEENよりも「翌日の0時未満」と明示するほうが事故が起きにくく、私はこちらを基本の書き方としておすすめしています。

INのリストにNULLを入れても一致しない

INのリストにNULLを含めても、NULLの行はヒットしません。
NULLの扱いは=INでは判定できず、IS NULLという専用の構文が必要です(次の記事で詳しく解説します)。

-- NULLの行は取得できない
SELECT * FROM users WHERE prefecture IN ('東京都', NULL);

応用・一歩先の使い方

サブクエリの結果をINで受け取る

INは、固定のリストだけでなく、サブクエリ(別のSELECT文の結果)を候補として使うこともできます。

SELECT name
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE status = 'completed');

「注文が完了しているユーザー」だけを抽出する、といった応用ができます。
サブクエリの詳しい使い方は、後の記事で改めて解説します。

NOT INとNOT BETWEENで除外条件を作る

前回学んだNOTと組み合わせれば、除外条件も簡潔に書けます。

SELECT name, prefecture FROM users WHERE prefecture NOT IN ('東京都', '大阪府');
SELECT name, price FROM products WHERE price NOT BETWEEN 1000 AND 3000;

まとめ

この記事のポイント

  • INは複数の値のいずれかに一致する行を、ORより簡潔に書ける
  • BETWEENは範囲(両端を含む)を指定でき、比較演算子2つ分の意味を1つで表現できる
  • DATETIME型に対するBETWEENは境界のデータが抜け落ちやすいので注意する
  • INのリストにNULLを含めても、NULLの行はヒットしない

次に読むべき記事

  • SQL NULL・IS NULLでハマらないために
  • SQL 比較演算子とAND・OR・NOTの使い方
  • SQL サブクエリの基本

タグ: SQL, 初心者向け, 基本文法

タイトルとURLをコピーしました