SQL IN & BETWEEN 运算符
在本教程中,您将学习如何使用带有 WHERE
子句的 IN
和 BETWEEN
运算符。
使用范围和条件
在上一章中,我们学习了如何使用 AND
和 OR
运算符组合多个条件。 但是,有时这还不够,而且效率很高,例如,如果您必须检查位于某个范围或一组值内的值。
在这里, IN
和 BETWEEN
运算符出现了,它允许您定义一个排他的范围或一组值,而不是组合单独的条件。
IN
运算符
IN
运算符是逻辑运算符,用于检查特定值是否存在于一组值中。 它的基本语法可以用:
column_list
FROM table_name
WHERE
column_name
IN (value1
, value1
,...);
此处,column_list 是您要获取其值的数据库表的列/字段的名称,例如 name, age, country 等。 好吧,让我们看看一些例子。
假设我们的数据库中有一个 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_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()
函数将值显式转换为所需的数据类型以获得最佳结果。 例如,如果您使用 '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 语句选择名称以"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 | +--------+--------------+------------+--------+---------+