Skip to content

SQL In

IN 操作符允许您在 WHERE 子句中指定多个值。它作为多个 OR 条件的简写,通常能使查询更具可读性,有时也能提高性能。

SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, …);

IN 操作符也可以与返回单列值的子查询一起使用:

SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT another_column FROM another_table WHERE condition);

您还可以使用 NOT IN 来排除与列表中任何值匹配的行。

我们将使用 Northwind 示例数据库中的 “Customers” 表。

CustomerIDCustomerNameCityCountry
1Alfreds FutterkisteBerlinGermany
2Ana Trujillo Emparedados y heladosMéxico D.F.Mexico
3Antonio Moreno TaqueríaMéxico D.F.Mexico
4Around the HornLondonUK
5Berglunds snabbköpLuleåSweden
…

示例 1:选择来自特定城市的客户

Section titled “示例 1:选择来自特定城市的客户”

以下 SQL 语句选择所有位于 ‘Paris’ 或 ‘London’ 的客户:

SELECT *
FROM Customers
WHERE City IN ('Paris', 'London');

这等同于:

SELECT *
FROM Customers
WHERE City = 'Paris' OR City = 'London';

示例 2:将 IN 与子查询一起使用

Section titled “示例 2:将 IN 与子查询一起使用”

假设您想查找所有下过订单的客户。(注意:使用 INNER JOIN 通常是实现此目的更直接的方法,但这演示了 IN 与子查询的用法)。

SELECT CustomerName, City, Country
FROM Customers
WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Orders);

实际应用:

IN 操作符在以下情况下非常有用:

  • 按固定的已知值集进行过滤(例如,产品 ID、状态码、特定地区)。
  • 基于另一个查询的结果进行过滤(动态条件)。
  • 相比冗长的 OR 条件链,提高了查询的可读性。
  • 性能:对于非常长的文字值列表,性能可能因数据库系统而异。一些系统能很好地优化 IN,而另一些则可能难以处理极大的列表。与子查询一起使用 IN 通常能得到很好的优化。
  • NULL 值:当列表中或被比较的列中存在 NULL 值时,请务必小心。column_name IN (value1, NULL, value2) 的行为与可能预期的关于 NULL 比较的方式有所不同。通常,NULL 不等于 NULL,并且 NULL 不等于任何其他值。