本教學將演示如何使用SQL BETWEEN
運算子選擇指定範圍內的值。
BETWEEN
運算子是邏輯運算子。 它返回true
,false
或unknown
值。 BETWEEN
運算子用於SELECT,UPDATE或DELETE語句中以查詢範圍內的值。
以下說明了BETWEEN
運算子的語法:
expression BETWEEN low AND high;
在上面語法中,
low
和high
可以是表示式或文字值,要求low
的值小於high
的值。如果表示式大於或等於(>=
)low
值且小於或等於(<=
)high
值,則BETWEEN
運算子返回true
,這相當於以下條件:
expression >= low and expression <= high
如果要指定獨佔範圍,則必須使用小於(<
)和大於(>
)的比較運算子。
要否定BETWEEN
運算子的結果,可以新增NOT
運算子:
expression NOT BETWEEN low AND high
如果表示式小於低於或大於(>
)的值,則NOT BETWEEN
返回true
; 否則它返回:false
。
可以使用以下條件重寫NOT BETWEEN
:
expression < low OR expression > high
我們將使用範例資料庫中的employees
表來演示BETWEEN
運算子的工作原理。
mysql> DESC employees;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| employee_id | int(11) | NO | PRI | NULL | auto_increment |
| first_name | varchar(20) | YES | | NULL | |
| last_name | varchar(25) | NO | | NULL | |
| email | varchar(100) | NO | | NULL | |
| phone_number | varchar(20) | YES | | NULL | |
| hire_date | date | NO | | NULL | |
| job_id | int(11) | NO | MUL | NULL | |
| salary | decimal(8,2) | NO | | NULL | |
| manager_id | int(11) | YES | MUL | NULL | |
| department_id | int(11) | YES | MUL | NULL | |
+---------------+--------------+------+-----+---------+----------------+
10 rows in set
SQL BETWEEN與數位範例
以下語句使用BETWEEN
運算子查詢薪水在2500
和3000
之間的所有員工:
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
salary BETWEEN 2500 AND 3000;
執行上面查詢語句,得到以下結果 -
請注意,結果集中包含薪水為2500
和3000
的員工。
以下查詢使用大於或等於(>=
)且小於或等於(<=
)的比較運算子和邏輯運算子AND
,返回相同的結果集:
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
WHERE
salary >= 2500
AND salary <= 3000;
要查詢薪水不在2500
和10000
範圍內的所有員工,請在WHERE
子句中使用NOT BETWEEN
運算子,如下所示:
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
salary NOT BETWEEN 2500 AND 10000
ORDER BY salary;
執行上面查詢語句,得到以下結果 -
SQL BETWEEN日期範例
要查詢在1999年1月1日到2000年12月31日之間加入公司的所有員工,查詢僱用日期(hire_date
)是否在以下範圍內:
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;
執行上面範例程式碼,得到以下結果 -
+-------------+------------+-----------+------------+
| employee_id | first_name | last_name | hire_date |
+-------------+------------+-----------+------------+
| 107 | Diana | Chen | 1999-02-07 |
| 178 | Kimberely | Yang | 1999-05-24 |
| 119 | Karen | Zhang | 1999-08-10 |
| 113 | Min | Su | 1999-12-07 |
| 179 | Charles | Yang | 2000-01-04 |
+-------------+------------+-----------+------------+
5 rows in set
要檢索不在1989年1月1日到1999年12月31日這個時間內加入公司的所有員工,請使用NOT BETWEEN
運算子,如下所示:
SELECT
employee_id, first_name, last_name, hire_date
FROM
employees
WHERE
hire_date NOT BETWEEN '1989-01-01' AND '1999-01-30'
ORDER BY hire_date;
執行上面範例程式碼,得到以下結果 -
1. 低和高的值
BETWEEN
運算子需要低值和高值。 當從使用者那裡獲得輸入時,在將其傳遞給查詢之前,應始終檢查低值是否小於高值。 如果低值大於高值,將得到一個空的結果集。
以下查詢不返回任何行,因為低值大於高值:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary BETWEEN 5000 AND 2000;
2. 將BETWEEN運算子與DATETIME資料一起使用
考慮以下tb1
表,結構和資料如下所示:
2019年9月23日至2019年9月30日期間有5
行資料。如果使用BETWEEN
運算子查詢create_time
值介於2019-09-23
和2019-09-30
之間的行記錄,將獲得所期望的內容。
SELECT
id, create_time
FROM
tb1
WHERE
create_time BETWEEN '20190920' AND '20190930';
執行上面查詢語句,得到以下結果 -
結果顯示只返回了4
行。 這是因為當使用以下條件時:
create_time BETWEEN '20190920' AND '20190930';
資料庫系統將其轉換為:
create_time BETWEEN '20190920 00:00:00.000000' AND '20190930 00:00:00.000000';
因此,2019-09-30 14:29:55
值的行記錄未包含在結果集中。
在本教學中,我們學習示了如何使用SQL BETWEEN
運算子根據範圍選擇資料,通過本教學,可以使用BETWEEN
運算子來組合成為更複雜的查詢語句。