メインコンテンツにスキップ
モジュール 4 · レッスン 1 / 4コース内の 13/57~8 min
モジュールのレッスン (1/4)

リストと範囲: IN と BETWEEN

前のモジュールでは、等式を使用して WHERE でフィルタリングしました。 比較: salary > 30000、department_id = 1、hired_on >= '2020-01-01'。 しかし、条件が 「値はこれら 5 つのうちの 1 つである必要があります」 になると、 連鎖した OR が積み重なる:

SQL
-- Heavy and fragile: adding a department means touching the query
SELECT first_name, last_name
FROM   employees
WHERE  department_id = 1
   OR  department_id = 2
   OR  department_id = 3;

SQL には、これを読みやすくするための 2 つのショートカットが用意されています。

IN — 「これらの 1 つ」

IN (...) 演算子は値のリストを受け取り、次の場合は true を返します。 列はそれらのいずれかに等しい:

SQL
SELECT first_name, last_name, department_id
FROM   employees
WHERE  department_id IN (1, 2, 3);

これは上記の OR と意味的には同じですが、はるかに読みやすくなっています。 これは自然に 「department_id が (1, 2, 3) にある」 と解釈されます。それも機能します 文字列と日付の場合:

SQL
SELECT name
FROM   departments
WHERE  city IN ('Milano', 'Roma');

その逆を行う NOT IN (...) もあります。

SQL
-- Employees who are NOT in Engineering or Sales:
SELECT first_name, last_name
FROM   employees
WHERE  department_id NOT IN (1, 2);

BETWEEN — 「A と B の間、両方を含む」

条件が連続範囲(数値、日付)の場合、代わりに column >= A AND column <= B と書くと BETWEEN A AND B になります:

SQL
-- Employees with a salary between 30000 and 50000 (both inclusive):
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary BETWEEN 30000 AND 50000;

BETWEEN は両方のエンドポイントで包括的です。非常にうまく機能します 日付も:

SQL
-- Everyone hired in 2020:
SELECT first_name, last_name, hired_on
FROM   employees
WHERE  hired_on BETWEEN '2020-01-01' AND '2020-12-31';

試してみてください

運動#sql.m4.l1.e1
試行回数: 0読み込み中…

給与が 30000 ~ 50000 の従業員の名 (first_name)、姓 (last_name)、および給与 (salal) を表示します。 3 つの列。

エディターを読み込み中…
ヒントを表示

BETWEEN 30000 AND 50000 を使用します。AND で結合された 2 つの比較よりもコンパクトで読みやすくなります。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m4.l1.e2
試行回数: 0読み込み中…

部門 1、2、または 4 で働く従業員の名 (first_name) と姓 (last_name) をリストします (IN を使用)。姓のアルファベット順に並べます。

エディターを読み込み中…
ヒントを表示

WHERE 部門 ID IN (1, 2, 4) は、3 つの OR のコンパクト バージョンです。

3 回の試行後に解決策が利用可能になります