摘要:在本教學中,您將學習如何使用 SQL IN
運算子來檢查一個值是否在一組值之中。
SQL IN 運算子簡介
IN
是 SQL 中的一個邏輯運算子。如果一個值在一組值中,則 IN
運算子會傳回 true,否則傳回 false。
以下說明 IN
運算子的語法
expression IN (value1,value2,...)
Code language: SQL (Structured Query Language) (sql)
技術上,您可以使用 =
和 OR
運算子來替代 IN 運算子。使用 IN
運算子的條件可以使用一個或多個 OR
運算子重寫,如下所示
expression = value1 OR expression = value2 OR ...
Code language: SQL (Structured Query Language) (sql)
要否定 IN
運算子,您可以使用 NOT
運算子
expression NOT IN (value1, value2,...)
Code language: SQL (Structured Query Language) (sql)
如果 expression
不等於列表中的任何值,則 NOT IN
運算子會傳回 true,否則傳回 false。
要替代 IN 運算子,您可以使用 !=
和 AND
運算子,如下所示
expression != value1 AND expression != value2 AND...
Code language: SQL (Structured Query Language) (sql)
請注意,如果列表 (value1,value2,...)
中的任何值為 null,則 IN
運算子不會傳回任何列。
在實務上,您經常在 WHERE
子句中使用 IN
和 NOT IN
運算子,在 SELECT
陳述式中選取具有一組值的列。此外,您也會在子查詢中使用 IN
運算子。
SQL IN 範例
我們將使用範例資料庫中的 employees
資料表來示範 IN
運算子的功能。

以下範例使用 IN
運算子來尋找職位 ID 為 8、9 或 10 的員工
SELECT
employee_id,
first_name,
last_name,
job_id
FROM
employees
WHERE
job_id IN (8, 9, 10)
ORDER BY
job_id;
Code language: SQL (Structured Query Language) (sql)
+-------------+------------+-----------+--------+
| employee_id | first_name | last_name | job_id |
+-------------+------------+-----------+--------+
| 203 | Susan | Mavris | 8 |
| 103 | Alexander | Hunold | 9 |
| 104 | Bruce | Ernst | 9 |
| 105 | David | Austin | 9 |
| 106 | Valli | Pataballa | 9 |
| 107 | Diana | Lorentz | 9 |
| 201 | Michael | Hartstein | 10 |
+-------------+------------+-----------+--------+
以下範例使用 NOT IN
運算子來尋找職位 ID 既不是 7、8 也不是 9 的員工
SELECT
employee_id,
first_name,
last_name,
job_id
FROM
employees
WHERE
job_id NOT IN (7, 8, 9)
ORDER BY
job_id;
Code language: SQL (Structured Query Language) (sql)
+-------------+-------------+-------------+--------+
| employee_id | first_name | last_name | job_id |
+-------------+-------------+-------------+--------+
| 206 | William | Gietz | 1 |
| 205 | Shelley | Higgins | 2 |
| 200 | Jennifer | Whalen | 3 |
| 100 | Steven | King | 4 |
| 102 | Lex | De Haan | 5 |
| 101 | Neena | Kochhar | 5 |
| 109 | Daniel | Faviet | 6 |
| 113 | Luis | Popp | 6 |
| 110 | John | Chen | 6 |
| 111 | Ismael | Sciarra | 6 |
| 112 | Jose Manuel | Urman | 6 |
| 201 | Michael | Hartstein | 10 |
| 202 | Pat | Fay | 11 |
| 204 | Hermann | Baer | 12 |
| 118 | Guy | Himuro | 13 |
...
2) 使用 SQL IN 運算子搭配子查詢的範例
子查詢是巢狀於另一個查詢內的查詢。讓我們看一下範例

以下查詢會傳回 Marketing
和 Sales
部門的部門 ID
SELECT
department_id
FROM
departments
WHERE
department_name = 'Marketing'
OR department_name = 'Sales'
Code language: SQL (Structured Query Language) (sql)
+---------------+
| department_id |
+---------------+
| 2 |
| 8 |
+---------------+
該查詢會傳回兩個部門 ID 的列表。
您可以將 ID 列表傳遞給 IN
運算子,以尋找在 Marketing
和 Sales
部門工作的員工,如下所示
SELECT
employee_id,
first_name,
last_name,
department_id
FROM
employees
WHERE
department_id IN (2, 8);
Code language: SQL (Structured Query Language) (sql)
+-------------+------------+------------+---------------+
| employee_id | first_name | last_name | department_id |
+-------------+------------+------------+---------------+
| 145 | John | Russell | 8 |
| 146 | Karen | Partners | 8 |
| 176 | Jonathon | Taylor | 8 |
| 177 | Jack | Livingston | 8 |
| 178 | Kimberely | Grant | 8 |
| 179 | Charles | Johnson | 8 |
| 201 | Michael | Hartstein | 2 |
| 202 | Pat | Fay | 2 |
+-------------+------------+------------+---------------+
要將以上兩個查詢合併為單一查詢,您可以使用第一個查詢來替代 IN 運算子後面的括號內的列表
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
department_id IN (SELECT
department_id
FROM
departments
WHERE
department_name = 'Marketing'
OR department_name = 'Sales')
Code language: SQL (Structured Query Language) (sql)
摘要
- 使用 SQL
IN
運算子來檢查一個值是否在一組值中。 - 使用
NOT
運算子來否定IN
運算子,即NOT IN
。 - 使用 `IN` 和子查詢將兩個查詢合併為單一查詢。