SQL IN 和 BETWEEN 运算符

在本教程中,你将学习如何跟 WHERE 子句一起使用 INBETWEEN 运算符。

使用范围和成员资格条件

在上一章中,我们学习了如何使用 ANDOR 运算符组合多个条件。但是,有时这不够充分且效率很高,例如,如果必须检查一个范围或一组值中的值。

在这里 INBETWEEN 运算符允许你定义一个特定的范围或一组值,而不是组合单独的条件。

IN 运算符

IN 运算符是用于检查值是否存在一组值中的逻辑运算符。它的基本语法如下:

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

这里,column_list 是要获取其值的数据库表的列/字段的名称,如名称年龄国家 / 地区等。好吧,让我们看看一些例子。

考虑我们的数据库中有一个 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 |
+--------+--------------+------------+--------+---------+

同样,你可以使用与 IN 运算符完全相反的运算符 NOT 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_nameFROM table_nameWHERE column_name BETWEEN min_value AND max_value;

让我们根据 employees 表上的范围条件构建和执行查询。

定义数字范围

以下 SQL 语句将仅返回 employees 表中的 employee,其薪水范围为 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() 函数将值显式转换为所需的数据类型,以获得最佳结果。例如,如果在比较中使用诸如 2016-12-31 DATE 之类的字符串,则将字符串强制转换为 DATE ,如下所示:

以下 SQL 语句选择 2006 年 1 月 1 日(即 2006-01-01)和 2016 年 12 月 31 日(即 2016-12-31)之间雇用的所有员工:

SELECT * FROM employees WHERE hire_date
BETWEEN CAST('2006-01-01' AS DATE) AND CAST('2016-12-31' AS 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 语句选择名称以 OZ 之间的任何字母开头的所有员工:

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 |
+--------+--------------+------------+--------+---------+