SQL BETWEEN

摘要:在本教程中,你将学习如何使用 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 <= highCode language: SQL (Structured Query Language) (sql)

要将一个值与一个不包含范围进行比较,你需要使用 比较运算符 小于 (<) 和大于 ( >)。

NOT BETWEEN

若要否定 BETWEEN 运算符的结果,可以使用 NOT 运算符

expression NOT BETWEEN low AND highCode language: SQL (Structured Query Language) (sql)

如果 expression 小于 low 或大于 (>) high,则 NOT BETWEEN 返回 true;否则,返回 false。

BETWEEN 运算符一样,你可以使用小于 (<) 和大于 (>) 运算符以及 OR 运算符重写 NOT BETWEEN 运算符,如下所示

expression < low OR expression > highCode language: SQL (Structured Query Language) (sql)

在实践中,你通常在 WHERE 从句的 SELECT 中使用 BETWEENNOT BETWEEN 运算符,以选择列值在特定范围内的行。

SQL BETWEEN 运算符示例

我们将使用 示例数据库 中的 employees 表来说明 BETWEEN 运算符是如何工作的。

employees_table

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() 函数,你需要使用类似的函数

数据库从日期中提取年份的函数
PostgreSQLDATE_PART('year', hire_date)
OracleEXTRACT(year from hire_date)
SQL ServerYEAR(hire_date)

总结

  • 当一个值位于特定范围内时,BETWEEN 运算符返回 true。
  • 使用 NOT 运算符可以否定 BETWEEN 运算符。
本教程是否对您有帮助?