English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL IN & BETWEEN 演算子

このトレーニングでは、INおよびBETWEEN演算子を使用し、WHERE子句と一緒に使用する方法を学びます。

範囲とメンバー資格条件の使用

前章では、ANDおよびOR演算子を使用して複数の条件を組み合わせる方法を学びました。しかし、特定の範囲または値群に位置する値を確認する必要がある場合、これは十分ではありません。

ここにINおよびBETWEEN演算子が登場し、特定の範囲または値群を定義することができ、単一の条件を組み合わせるのではなく、範囲や値群を定義することができます。

IN演算子

IN演算子は論理演算子であり、特定の値が値群に存在するかどうかを確認するために使用されます。その基本的な文法は以下のように示されます:

SELECT column_list FROM table_name
WHERE column_name IN (value)1, value1,...);

ここでは、column_listは、値を取得したいデータベースのテーブルの列です/の名称、例えばnameagecountryなどがあります。それでは、いくつかの例を見てみましょう。

データベースにemployeesテーブルが以下の記録を持っています:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

以下のSQL文は、dept_idの1または3の従業員以外を返します。

SELECT * FROM employees
WHERE dept_id IN (1, 3);

クエリを実行した後、以下の結果セットを取得します:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
+--------+--------------+------------+--------+---------+

同様に、NOT IN演算子を使用できます。これはIN演算子の完全反対です。以下のSQL文は、dept_idではありません1または3の従業員以外のすべての従業員です。

SELECT * FROM employees
WHERE dept_id NOT IN (1, 3);

クエリを実行した後、今度は以下の結果セットを取得します:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt | 2001-05-01 |   5000 |       4 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
+--------+--------------+------------+--------+---------+

BETWEEN演算子

列の値が特定の範囲にある場合、一度に一行を選択したいことがあります。数字データを処理する場合、このような条件はよく見られます。

この条件に基づいてクエリを実行する場合、BETWEEN演算子を使用できます。これは論理演算子であり、以下のように範囲を指定できます:

SELECT column1_name, column2_name, columnN_name FROM table_name WHERE column_name BETWEEN min_value AND max_value;

以下のように従業員(employees)テーブル上の範囲条件を構築および実行するクエリです。

数値範囲を定義

以下のSQL文は、employees表中の給料が7000から9000の間の従業員です。

SELECT * FROM employees WHERE salary BETWEEN 7000 AND 9000;

実行後、以下の結果が得られます:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
+--------+--------------+------------+--------+---------+

日付範囲を定義

BETWEEN演算子と日付または時間値を使用する場合、CAST()関数を使用してこれらの値を明示的に必要なデータ型に変換して、最適な結果を得ます。例えば、DATEと比較する場合「 2016-12-31のような文字列があれば、以下のようにDATEに変換します:

以下のSQL文は選択2006年1月1日(つまり「 2006-01-01”)まで2016年12月31日(つまり「 2016-12-31)の間に雇用されたすべての従業員:

SELECT * FROM employees WHERE hire_date
BETWEEN CAST('2006-01-01AS DATE) AND CAST('2016-12-31AS DATE);

クエリを実行した後、以下の結果セットを取得します:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

文字列範囲の定義

日付や数字の範囲は最も一般的ですが、文字列の範囲を検索するための条件も設定できます。以下のSQL文は、名前が「O」から「Z」の間の任意の文字で始まるすべての従業員を選択します:

SELECT * FROM employees
WHERE emp_name BETWEEN 'O' AND 'Z';

実行後、以下の結果が得られます:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
+--------+--------------+------------+--------+---------+