摘要:在本教程中,您将学习如何使用 SQL IN 运算符来检查一个值是否存在于一组值中。
SQL IN 运算符简介 #
IN 是 SQL 中的逻辑运算符之一。如果一个值存在于一组值中,IN 运算符返回 true,否则返回 false。
以下是 IN 运算符的语法:
expression IN (value1, value2,...)Code language: SQL (Structured Query Language) (sql)从技术上讲,您可以用等于(=)和 OR 运算符来替代 IN 运算符。换句话说,您可以使用一个或多个 OR 运算符来重写 IN 运算符,如下所示:
expression = value1 OR expression = value2 OR ...Code language: SQL (Structured Query Language) (sql)NOT IN 运算符对 IN 运算符的结果取反。以下是 NOT IN 运算符的语法:
expression NOT IN (value1, value2,...)Code language: SQL (Structured Query Language) (sql)如果 expression 不等于列表 (value1, value2, …) 中的任何值,NOT IN 运算符返回 true,否则返回 false。
从技术上讲,您可以使用不等于(!=)和 AND 运算符来重写 NOT IN 运算符,如下所示:
expression != value1 AND expression != value2 AND...Code language: SQL (Structured Query Language) (sql)请注意,如果列表 (value1,value2,...) 中的任何值为 NULL,IN 运算符将不返回任何行。
在实践中,您通常在 SELECT 语句的 WHERE 子句中使用 IN 和 NOT IN 运算符,以筛选出其值在一组值中的行。
稍后,您将学习如何将 IN 和 NOT IN 运算符与子查询一起使用。
SQL IN 运算符示例 #
我们将使用示例数据库中的 employees 表来演示 IN 运算符的功能。

对数值数据使用 IN 运算符 #
以下示例使用 IN 运算符查找职位 ID 为 8、9 或 10 的员工:
SELECT
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) first_name | last_name | job_id
------------+-----------+--------
Susan | Mavris | 8
Bruce | Ernst | 9
David | Austin | 9
Alexander | Hunold | 9
Diana | Lorentz | 9
Valli | Pataballa | 9
Michael | Hartstein | 10Code language: SQL (Structured Query Language) (sql)以下示例使用 NOT IN 运算符查找职位 ID 不是 7、8 或 9 的员工:
SELECT
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) first_name | last_name | job_id
-------------+-------------+--------
William | Gietz | 1
Shelley | Higgins | 2
Jennifer | Whalen | 3
Steven | King | 4
Neena | Kochhar | 5
Lex | De Haan | 5
Jose Manuel | Urman | 6
Luis | Popp | 6
John | Chen | 6
Ismael | Sciarra | 6
Daniel | Faviet | 6
Michael | Hartstein | 10
...Code language: SQL (Structured Query Language) (sql)对字符数据使用 IN 运算符 #
以下查询使用 IN 运算符检索名字为 Steven、Lex 或 Daniel 的员工:
SELECT
first_name,
last_name
FROM
employees
WHERE
first_name IN ('Steven', 'Lex', 'Daniel');Code language: SQL (Structured Query Language) (sql)输出
first_name | last_name
------------+-----------
Steven | King
Lex | De Haan
Daniel | FavietCode language: SQL (Structured Query Language) (sql)对日期值使用 IN 运算符 #
以下语句使用 IN 运算符检索在 1987-06-17、1994-08-16 和 1997-09-30 这些日期之一入职的员工:
SELECT
first_name,
last_name,
hire_date
FROM
employees
WHERE
hire_date IN ('1987-06-17', '1994-08-16', '1997-09-30');Code language: SQL (Structured Query Language) (sql)输出
first_name | last_name | hire_date
------------+-----------+------------
Steven | King | 1987-06-17
Daniel | Faviet | 1994-08-16
Ismael | Sciarra | 1997-09-30Code language: SQL (Structured Query Language) (sql)结合函数使用 IN 运算符 #
以下查询使用 EXTRACT 函数从 hire_date 列中提取月份,并使用 IN 运算符检索在一月、二月或三月入职的员工:
SELECT
first_name,
last_name,
hire_date,
EXTRACT(MONTH FROM hire_date) joined_month
FROM
employees
WHERE
EXTRACT(MONTH FROM hire_date) IN (1, 2, 3)
ORDER BY
joined_month;Code language: SQL (Structured Query Language) (sql) first_name | last_name | hire_date | joined_month
-------------+-----------+------------+--------------
Lex | De Haan | 1993-01-13 | 1
Alexander | Hunold | 1990-01-03 | 1
Karen | Partners | 1997-01-05 | 1
Charles | Johnson | 2000-01-04 | 1
Michael | Hartstein | 1996-02-17 | 2
Sarah | Bell | 1996-02-04 | 2
Valli | Pataballa | 1998-02-05 | 2
Diana | Lorentz | 1999-02-07 | 2
Britney | Everett | 1997-03-03 | 3
Jonathon | Taylor | 1998-03-24 | 3
Jose Manuel | Urman | 1998-03-07 | 3Code language: SQL (Structured Query Language) (sql)摘要 #
- 使用
IN运算符检查一个值是否存在于一组值中。 - 使用
NOT运算符对IN运算符取反。