PostgreSQL IN、Not IN 举例说明

⚡ 智能摘要

PostgreSQL IN 运算符检查值是否出现在 WHERE 子句中的列表或子查询中,从而取代 SELECT、UPDATE、INSERT 和 DELETE 语句中的多个 OR 条件,实现更清晰、更快速、更易读的筛选。

  • 📋 语法: value IN (list) 当值与列表中的任何一项匹配时返回 true。
  • 🔤 角色列表: 将文本值用单引号括起来,并用括号括起来。
  • 🔢 数字列表: 直接比较数字,无需引号,以进行完全匹配。
  • 🚫 不在: 返回列表中不存在相应值的行。
  • ⚠️ 空陷阱: NOT IN 中的 NULL 值可能会静默返回零行。
  • 🤖 AI查询: 助手会构建 IN 子句,并标记 NULL 值和性能风险。

PostgreSQL IN,NOT IN 示例

什么是 PostgreSQL 在?

IN 运算符用于 WHERE 子句中,用于检查某个值是否存在于其他值的列表中。IN 运算符有助于减少 SELECT、UPDATE、INSERT 或 DELETE 语句中对多个 OR 条件的需求。

句法

IN 运算符采用以下语法:

value IN (value_1, value_2, ...)

该值是您在列表中检查的值。

value_1、value_2… 是列表值。

如果在列表中找到该值,则运算符将返回 true。

列表可以是数字或字符串的集合,甚至是某个函数的输出结果。 选择语句 如下图所示:

value IN (SELECT value FROM table-name);

括号内的语句称为子查询。

PostgreSQL 以性格

让我们演示如何将 IN 运算符与字符值一起使用。

请考虑下表:

员工人数:

PostgreSQL 以性格

让我们针对上表运行以下查询:

SELECT * FROM Employees WHERE name IN ('James John', 'Mercy Bush', 'Kate Joel');

它返回以下内容:

PostgreSQL IN 与字符结果

我们有一份包含三个名字的列表。我们正在查找员工表的姓名列中是否包含这三个名字中的任何一个。凯特·乔尔的名字与表中的一条记录匹配,并返回了该记录的详细信息。

PostgreSQL 带数字

现在,让我们看看如何将 IN 运算符与数值一起使用。

考虑下面给出的价格表:

价格:

PostgreSQL 带数字

我们可以对该表运行以下查询:

SELECT * FROM Price WHERE price IN (200, 308, 250, 550);

这将返回以下内容:

PostgreSQL 带有数值结果

我们创建了一个包含 4 个数值的列表。我们正在检查是否可以将这些值中的任何一个与 Price 表的价格列中包含的值匹配。两个值匹配,并返回了它们的详细信息。

使用 NOT Opera器

IN 运算符可以与 NOT 运算符一起使用。它返回在指定列中未找到的值。我们将使用 Price 表来演示这一点。

SELECT * FROM Price WHERE price NOT IN (200, 400, 190, 230);

这将返回以下内容:

PostgreSQL 在使用 NOT 运算符

我们创建了一个包含 4 个数值的列表。我们正在检查价格表的价格列中是否存在不属于该列表的值。未找到两个值 250 和 300。因此已返回它们的详细信息。

使用 pgAdmin

除了 SQL shell 之外,还可以通过 pgAdmin 界面以可视方式运行相同的 IN 和 NOT IN 查询。

具有特色

要通过 pgAdmin 完成相同操作,请执行以下操作:

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

使用字符 pgAdmin

步骤3) 在查询编辑器中输入查询:

SELECT * FROM Employees WHERE name IN ('James John', 'Mercy Bush', 'Kate Joel');

步骤4) 单击执行按钮。

使用 pgAdmin 进行字符查询

它应该返回以下内容:

使用 pgAdmin 处理字符结果

使用数字

要通过 pgAdmin 完成相同操作,请执行以下操作:

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

使用 pgAdmin 与数字

步骤3) 在查询编辑器中输入查询:

SELECT * FROM Price WHERE price IN (200, 308, 250, 550);

步骤4) 单击执行按钮。

使用 pgAdmin 进行数值查询

它应该返回以下内容:

使用 pgAdmin 获取数值结果

使用 NOT Opera器

要通过 pgAdmin 完成相同操作,请执行以下操作:

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

在 pgAdmin 中使用 NOT 运算符

步骤3) 在查询编辑器中输入查询:

SELECT * FROM Price WHERE price NOT IN (200, 400, 190, 230);

步骤4) 单击执行按钮。

在 pgAdmin 中使用 NOT 运算符查询

它应该返回以下内容:

在 pgAdmin 中使用 NOT 运算符会得到结果

下载本教程使用的数据库

常见问题

In PostgreSQL对于大型子查询,EXISTS 通常比 IN 运行速度更快,因为它会在找到第一个匹配项后停止。对于小型、常量列表,IN 简单高效。您可以使用 EXPLAIN ANALYZE 在自己的数据上测试这两种方法。

NOT IN 会将 NULL 值视为未知值,因此如果列表或子查询中包含 NULL 值,则整个条件可能评估为未知值并返回零行。请过滤掉 NULL 值或改用 NOT EXISTS。

IN 子句用一个更易读的子句取代了冗长的 OR 条件链。WHERE id IN (1,2,3) 等同于 WHERE id=1 OR id=2 OR id=3,但更简洁、更清晰、更易于维护。

是的。 PostgreSQL 将 x IN (a, b, c) 视为等价于 x = ANY (ARRAY[a, b, c])。两者产生相同的结果,并且通常产生相同的查询计划。

AI助手可以根据纯文本生成IN子句,建议正确的值列表,并标记NOT IN子句中的NULL风险。它们还会重写慢查询,并添加EXPLAIN提示以进行性能优化。

是的。AI Copilot 工具可以检测同一列中重复的 OR 条件,并将其重构为单个 IN 列表,从而提高可读性并降低逻辑错误的概率。

是的。在括号内放置一个 SELECT 语句:WHERE id IN (SELECT id FROM orders)。内部查询(称为子查询)提供 IN 子句检查的值列表。

对于大型表,NOT EXISTS 或带有 IS NULL 的 LEFT JOIN 通常比 NOT IN 更有效,因为 PostgreSQL 构建高效的反连接。同时确保比较的列已建立索引。

总结一下这篇文章: