PostgreSQL EXISTS 与 SELECT Operator(示例)

⚡ 智能摘要

PostgreSQL EXISTS 是一个布尔运算符,用于测试相关子查询是否返回任何行,从而允许 SELECT、INSERT、UPDATE 和 DELETE 语句根据是否存在匹配记录来有效地筛选数据。

  • 📋 语法: 当子查询至少返回一行时,WHERE EXISTS(子查询)返回 true。
  • 🔗 相关子查询: EXISTS 连接内部查询和外部查询,根据共享键匹配行。
  • 短路: EXISTS 函数只找到第一个匹配的行就停止,因此它在大表上具有良好的扩展性。
  • 🔁 四项声明: 该运算符可在 SELECT、INSERT、UPDATE 和 DELETE 查询中使用。
  • 🛡️ 不存在: 安全地排除行,避免因 NULL 陷阱而导致 NOT IN 语句出错。
  • 🤖 AI查询: 助手生成 EXISTS 子句并标记相关子查询性能风险。

PostgreSQL 存在与选择 Opera器

存在什么 PostgreSQL?

PostgreSQL EXISTS EXISTS 运算符用于检查子查询中是否存在指定的行。这意味着该运算符需要与子查询一起使用。当子查询中至少找到一行时,就认为 EXISTS 运算符的条件满足。您可以将此操作与 SELECT、UPDATE、INSERT 和 DELETE 语句一起使用。

PostgreSQL EXISTS 查询语法

以下是 PostgreSQL EXISTS 语句:

WHERE EXISTS (subquery);

上面的语法表明 EXISTS 运算符接受一个参数,即子查询。子查询只是一个 选择语句 应该以 SELECT * 开头,而不是以列名或表达式的列表开头。

PostgreSQL 使用 SELECT 语句查找 EXISTS

让我们看看如何在 SELECT 语句中使用 EXISTS 运算符。我们有以下几个表:

书:

PostgreSQL 使用 SELECT 语句查找 EXISTS

价格:

PostgreSQL 使用 SELECT 语句查找 EXISTS

运行以下语句:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

这将返回以下内容:

PostgreSQL EXISTS 与 SELECT 语句结果

上述命令应返回 Book 表中所有 id 与子查询中任何记录的 id 匹配的记录。只有一个 id 匹配。因此,只返回了一条记录。

PostgreSQL EXISTS 与 INSERT 语句

我们可以在 插入语句.我们有以下3个表:

书:

PostgreSQL EXISTS 与 INSERT 语句

价格:

PostgreSQL EXISTS 与 INSERT 语句

价格2:

PostgreSQL EXISTS 与 INSERT 语句

然后我们可以运行以下语句:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

现价格表如下:

PostgreSQL EXISTS 与 INSERT 语句结果

匹配到 Price5 表中 ID 为 2 的行。然后,将该记录插入到 Price 表中。

PostgreSQL EXISTS 带有 UPDATE 语句

我们可以在 UPDATE 语句中使用 EXISTS 运算符。

运行以下查询:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

PostgreSQL EXISTS 带有 UPDATE 语句

我们正在更新 Price 表的价格列。我们的目标是让共享 ID 的商品价格相同。只有一行匹配,即 5。

但是,由于价格相同,即 205,因此没有进行更新。 如果有差异,则会进行更新。

PostgreSQL EXISTS 带有 DELETE 语句

A PostgreSQL DELETE 语句可以使用 EXISTS 运算符。以下是示例:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

现价格表如下:

PostgreSQL EXISTS 带有 DELETE 语句

id 为 5 的行已被删除。

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

除了 SQL shell 之外,还可以通过 pgAdmin 界面以可视化的方式执行相同的 EXISTS 查询。现在让我们看看如何使用 pgAdmin 执行这些操作:

使用 SELECT 语句

以下是使用 EXISTS 查询的步骤 PostgreSQL 使用 pgAdmin 的 SELECT 语句:

步骤1) 登录您的pgAdmin帐户。打开pgAdmin并使用您的凭据登录您的帐户。

步骤2) 创建演示数据库。

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

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

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

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

步骤4) 单击执行按钮。

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

它应该返回以下内容:

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

使用 INSERT 语句

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

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

步骤2)

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

EXISTS 语句 PostgreSQL 使用 pgAdmin

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

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

步骤4) 单击执行按钮。

EXISTS 语句 PostgreSQL 使用 pgAdmin

价格表现在应如下所示:

EXISTS 语句 PostgreSQL 使用 pgAdmin

使用 UPDATE 语句

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

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

步骤2)

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

EXISTS 语句 PostgreSQL 使用 pgAdmin

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

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

步骤4) 单击执行按钮。

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

价格表现在应如下所示:

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

使用 DELETE 语句

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

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

步骤2)

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

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

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

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

步骤4) 单击执行按钮。

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

价格表现在应如下所示:

PostgreSQL 使用 pgAdmin 执行 EXISTS 语句

下载本教程使用的数据库

常见问题

EXISTS 函数会检查相关子查询是否返回任何行,并在找到第一个匹配项时停止,因此适用于大型子查询。IN 函数会将一个值与一个列表进行比较,适用于小型、常量集合。

当子查询包含 NULL 值时,NOT IN 可能返回零行,因为比较结果未知。NOT EXISTS 会忽略 NULL 值并正确评估每一行,因此是反连接中可靠的选择。

相关子查询引用外部查询中的列,例如 WHERE Book.id = Price.id。EXISTS 会针对每一行外部查询重新检查该列,并在找到匹配项时返回 true。

是的。EXISTS 函数在子查询生成一行数据后立即返回 true,因此不会扫描其余数据。这种短路机制使其在处理大型关联子查询时非常高效。

不。EXISTS 只检查子查询是否返回行,因此 SELECT *、SELECT 1 或 SELECT id 的行为相同。子查询中的列列表不会影响结果。

对子查询中连接的列建立索引,保持相关条件可搜索,并运行 EXPLAIN ANALYZE。 PostgreSQL 当索引支持时,通常会将 EXISTS 重写为高效的半连接。

AI 助手可以将纯英文规则转换为 EXISTS 子句,构建关联子查询,并警告 NOT IN NULL 陷阱。它们还会建议索引和 EXPLAIN 提示以进行性能调优。

是的。AI 助手可以检测子查询模式,并将 IN 重写为 EXISTS,或将 NOT IN 重写为 NOT EXISTS,从而提高大型表的 NULL 安全性和性能。

总结一下这篇文章: