摘要:在本教程中,你将学习如何使用 SQL BETWEEN
运算符来检查一个值是否落在一个特定范围内。
SQL BETWEEN 运算符简介
BETWEEN
运算符是 SQL 中的 逻辑运算符 之一。BETWEEN
运算符检查一个值是否在一个值的范围内。
BETWEEN
运算符的语法如下
expression BETWEEN low AND high;
Code language: SQL (Structured Query Language) (sql)
如果 expression
大于或等于 ( >=
) 低值,且小于或等于 ( <=
) 高值,则 BETWEEN
运算符返回 true。
从技术上来说,BETWEEN
等效于使用大于或等于 (>=
) 和小于或等于 (<=
) 运算符的以下表达式
expression >= low AND expression <= high
Code language: SQL (Structured Query Language) (sql)
要将一个值与一个不包含范围进行比较,你需要使用 比较运算符 小于 (<
) 和大于 ( >
)。
NOT BETWEEN
若要否定 BETWEEN
运算符的结果,可以使用 NOT
运算符
expression NOT BETWEEN low AND high
Code language: SQL (Structured Query Language) (sql)
如果 expression
小于 low
或大于 (>) high
,则 NOT BETWEEN
返回 true;否则,返回 false。
与 BETWEEN
运算符一样,你可以使用小于 (<) 和大于 (>) 运算符以及 OR
运算符重写 NOT BETWEEN
运算符,如下所示
expression < low OR expression > high
Code language: SQL (Structured Query Language) (sql)
在实践中,你通常在 WHERE
从句的 SELECT
中使用 BETWEEN
和 NOT BETWEEN
运算符,以选择列值在特定范围内的行。
SQL BETWEEN 运算符示例
我们将使用 示例数据库 中的 employees
表来说明 BETWEEN
运算符是如何工作的。

1) 使用 SQL BETWEEN 运算符与数字的示例
以下语句使用 BETWEEN
运算符查找所有工资在 2,500 到 2,900 之间的员工
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
WHERE
salary BETWEEN 2500 AND 2900
ORDER BY
salary DESC;
Code language: SQL (Structured Query Language) (sql)
+-------------+------------+-------------+---------+
| employee_id | first_name | last_name | salary |
+-------------+------------+-------------+---------+
| 116 | Shelli | Baida | 2900.00 |
| 117 | Sigal | Tobias | 2800.00 |
| 126 | Irene | Mikkilineni | 2700.00 |
| 118 | Guy | Himuro | 2600.00 |
| 119 | Karen | Colmenares | 2500.00 |
+-------------+------------+-------------+---------+
请注意,结果集包括薪资为 2,500 和 2,900 的员工。
以下查询返回与上述查询相同的结果集。但是,它使用了大于或等于 (>=) 和小于或等于 (<=) 的比较运算符
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
WHERE
salary >= 2500 AND salary <= 2900
ORDER BY
salary;
Code language: SQL (Structured Query Language) (sql)
2) 使用 SQL NOT BETWEEN 示例
以下示例使用 NOT BETWEEN
运算符查找所有工资不在 2,500 到 2,900 范围内的员工
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
WHERE
salary NOT BETWEEN 2500 AND 2900
ORDER BY salary DESC;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+------------+----------+
| employee_id | first_name | last_name | salary |
+-------------+-------------+------------+----------+
| 100 | Steven | King | 24000.00 |
| 101 | Neena | Kochhar | 17000.00 |
| 102 | Lex | De Haan | 17000.00 |
| 145 | John | Russell | 14000.00 |
| 146 | Karen | Partners | 13500.00 |
| 201 | Michael | Hartstein | 13000.00 |
| 205 | Shelley | Higgins | 12000.00 |
| 108 | Nancy | Greenberg | 12000.00 |
| 114 | Den | Raphaely | 11000.00 |
| 204 | Hermann | Baer | 10000.00 |
| 109 | Daniel | Faviet | 9000.00 |
| 103 | Alexander | Hunold | 9000.00 |
| 176 | Jonathon | Taylor | 8600.00 |
| 177 | Jack | Livingston | 8400.00 |
| 206 | William | Gietz | 8300.00 |
| 121 | Adam | Fripp | 8200.00 |
| 110 | John | Chen | 8200.00 |
| 120 | Matthew | Weiss | 8000.00 |
| 122 | Payam | Kaufling | 7900.00 |
| 112 | Jose Manuel | Urman | 7800.00 |
| 111 | Ismael | Sciarra | 7700.00 |
| 178 | Kimberely | Grant | 7000.00 |
| 113 | Luis | Popp | 6900.00 |
| 123 | Shanta | Vollman | 6500.00 |
| 203 | Susan | Mavris | 6500.00 |
| 179 | Charles | Johnson | 6200.00 |
| 202 | Pat | Fay | 6000.00 |
| 104 | Bruce | Ernst | 6000.00 |
| 106 | Valli | Pataballa | 4800.00 |
| 105 | David | Austin | 4800.00 |
| 200 | Jennifer | Whalen | 4400.00 |
| 107 | Diana | Lorentz | 4200.00 |
| 192 | Sarah | Bell | 4000.00 |
| 193 | Britney | Everett | 3900.00 |
| 115 | Alexander | Khoo | 3100.00 |
+-------------+-------------+------------+----------+
3) 使用 SQL BETWEEN 运算符与日期范围
以下示例使用 BETWEEN
运算符查找所有在 1999 年 1 月 1 日
与 2000 年 12 月 31 日
之间加入公司的员工
SELECT
employee_id,
first_name,
last_name,
hire_date
FROM
employees
WHERE
hire_date BETWEEN '1999-01-01' AND '2000-12-31'
ORDER BY
hire_date;
Code language: SQL (Structured Query Language) (sql)
+-------------+------------+------------+------------+
| employee_id | first_name | last_name | hire_date |
+-------------+------------+------------+------------+
| 107 | Diana | Lorentz | 1999-02-07 |
| 178 | Kimberely | Grant | 1999-05-24 |
| 119 | Karen | Colmenares | 1999-08-10 |
| 113 | Luis | Popp | 1999-12-07 |
| 179 | Charles | Johnson | 2000-01-04 |
+-------------+------------+------------+------------+
以下示例使用 NOT BETWEEN
运算符查找在 1989 年 1 月 1 日
至 1999 年 12 月 31 日
之间未加入公司的员工
SELECT
employee_id,
first_name,
last_name,
hire_date
FROM
employees
WHERE
hire_date NOT BETWEEN '1989-01-01' AND '1992-12-31'
ORDER BY
hire_date;
Code language: SQL (Structured Query Language) (sql)
+-------------+------------+-----------+------------+
| employee_id | first_name | last_name | hire_date |
+-------------+------------+-----------+------------+
| 100 | Steven | King | 1987-06-17 |
| 200 | Jennifer | Whalen | 1987-09-17 |
| 179 | Charles | Johnson | 2000-01-04 |
+-------------+------------+-----------+------------+
3 rows in set (0.00 sec)
Code language: JavaScript (javascript)
4) 使用 SQL BETWEEN 运算符与函数的示例
以下示例使用 BETWEEN 运算符和 YEAR 函数查找在 1990 年至 1993 年之间加入公司的员工
SELECT
employee_id,
first_name,
last_name,
year(hire_date) joined_year
FROM
employees
WHERE
year(hire_date) BETWEEN 1990 and 1993
ORDER BY
hire_date;
输出
+-------------+------------+-----------+-------------+
| employee_id | first_name | last_name | joined_year |
+-------------+------------+-----------+-------------+
| 103 | Alexander | Hunold | 1990 |
| 104 | Bruce | Ernst | 1991 |
| 102 | Lex | De Haan | 1993 |
+-------------+------------+-----------+-------------+
在这个示例中
- 首先,
YEAR()
函数从雇佣日期返回年份。 - 其次,
BETWEEN
运算符将使用YEAR()
函数的结果,并检查它是否在 1990 年至 1993 年的范围内。
如果你的数据库不支持 YEAR()
函数,你需要使用类似的函数
数据库 | 从日期中提取年份的函数 |
---|---|
PostgreSQL | DATE_PART('year', hire_date) |
Oracle | EXTRACT(year from hire_date) |
SQL Server | YEAR(hire_date) |
总结
- 当一个值位于特定范围内时,BETWEEN 运算符返回 true。
- 使用 NOT 运算符可以否定 BETWEEN 运算符。