SQL IN 和 BETWEEN 運算子

在本教程中,你將學習如何跟 WHERE 子句一起使用 INBETWEEN 運算子。

使用範圍和成員資格條件

在上一章中,我們學習瞭如何使用 ANDOR 運算子組合多個條件。但是,有時這不夠充分且效率很高,例如,如果必須檢查一個範圍或一組值中的值。

在這裡 INBETWEEN 運算子允許你定義一個特定的範圍或一組值,而不是組合單獨的條件。

IN 運算子

IN 運算子是用於檢查值是否存在一組值中的邏輯運算子。它的基本語法如下:

SELECT column_list FROM table_name WHERE column_name IN ( value1 , value1 ,...); 

這裡,column_list 是要獲取其值的資料庫表的列/欄位的名稱,如名稱年齡國家 / 地區等。好吧,讓我們看看一些例子。

考慮我們的資料庫中有一個 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_nameFROM table_nameWHERE column_name BETWEEN min_value AND max_value;

讓我們根據 employees 表上的範圍條件構建和執行查詢。

定義數字範圍

以下 SQL 語句將僅返回 employees 表中的 employee,其薪水範圍為 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 語句選擇名稱以 OZ 之間的任何字母開頭的所有員工:

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 |
+--------+--------------+------------+--------+---------+