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)

如果表達式小於 low 或大於 (>) high,則 NOT BETWEEN 傳回 true;否則,它會傳回 false。

BETWEEN 運算子類似,您可以使用小於 (<) 和大於 (>) 運算子以及 OR 運算子來重寫 NOT BETWEEN 運算子,如下所示:

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

在實務上,您經常在 WHERE 子句中使用 BETWEENNOT BETWEEN 運算子搭配 SELECT,以選擇某個欄位的值在特定範圍內的資料列。

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 運算子。
這個教學有幫助嗎?