PostgreSQL 子查询

2025年3月17日 | 阅读 10 分钟

在本节中,我们将了解 PostgreSQL 子查询的工作原理,它允许我们创建一个复杂的查询。我们还将看到带有不同 子句(如 SELECT, FROM, 和 WHERE)、不同 条件(如 IN, EXISTS)以及不同 查询(如 SELECT, INSERT, UPDATE, 和 DELETE)的子查询示例

PostgreSQL 子查询简介

子查询是在另一个查询中使用的命令。相比之下,内部 SELECT内部语句称为 子查询,而 外部 SELECT外部语句称为 主命令。PostgreSQL 子查询用括号括起来。

PostgreSQL 子查询可以与 SELECT、FROM、WHEREHAVING 子句 等不同子句一起使用。

我们还可以将 PostgreSQL 子查询与 SELECTINSERTUPDATEDELETE 命令以及运算符,如 <,>, =, <=,>=, BETWEENIN 等结合使用。

注意:在 PostgreSQL 中,不允许在 ORDER BY 子句中使用子查询。但是我们可以使用 GROUP BY 命令来执行类似 ORDER BY 命令的功能。

PostgreSQL 子查询与不同子句的示例

让我们通过不同的示例来了解 PostgreSQL 子查询如何与各种子句一起工作。

SELECT 子句的 PostgreSQL 子查询示例

PostgreSQL 子查询也可以与 SELECT 子句结合使用。

当我们需要使用聚合函数(如平均值、计数、总和、最大值和最小值)进行计算,但又不想将聚合函数用于主查询时,就会使用子查询。

在此,我们将展示如何将 子查询与 SELECT 子句一起使用。

我们从 javatpoint 数据库中的 car 表中选择特定数据。

输出

执行上述命令后,我们将获得以下输出

PostgreSQL Subquery

在上面的示例中,我们在 SELECT 子句中创建了一个 子查询,如下所示:

PostgreSQL Subquery

我们将子查询别名为 Subquery1,这将是引用上述子查询或其中任何字段的名称。

注意:平均值、计数、总和、最大值和最小值等聚合函数经常在子查询中使用。子查询必须返回单个值,因此我们将子查询放在 SELECT 子句中。

FROM 子句的 PostgreSQL 子查询示例

PostgreSQL 子查询也可以与 FROM 子句结合使用。

为此,我们将使用 PostgreSQL 教程前面部分创建的 javatpoint 数据库中的 Course 和 Course_categories 表

输出

成功执行上述命令后,我们将得到以下输出:

PostgreSQL Subquery

在上面的示例中,我们在 FROM 子句中创建了一个 子查询,如下所示:

PostgreSQL Subquery

我们将子查询别名为 Subquery2,这将是引用上述子查询或其中任何字段的名称。

WHERE 子句的 PostgreSQL 子查询示例

PostgreSQL 子查询最常与 WHERE 子句一起使用。这些子查询也称为嵌套子查询

为此,我们将使用 PostgreSQL 教程前面部分创建的 Javatpoint 数据库中的 Client 和 Client_details 表。

输出

执行上述命令后,我们将得到以下结果:

PostgreSQL Subquery

在上面的示例中,我们在 WHERE 子句中创建了一个 子查询,如下所示:

PostgreSQL Subquery

上面的子查询语句将允许我们通过 IN 条件识别 client_details 表中 client_id 小于 6client_name'M' 开头的所有 client_id 值。子查询用于过滤主查询的输出。

在下面的命令中,我们使用 INNER Join 条件代替子查询

输出

执行上述命令后,我们将得到与上面带有 WHERE 子句的子查询命令相似的结果:

PostgreSQL Subquery

注意:INNER JOIN 条件的性能优于原始子查询,并且重要的是要注意并非所有子查询都可以用 PostgreSQL JOIN 重写。

PostgreSQL 子查询与不同条件的示例

让我们通过不同的示例来了解 PostgreSQL 子查询如何与不同条件一起工作。

EXISTS 条件的 PostgreSQL 子查询示例

PostgreSQL 子查询也可以与 EXISTS 子句结合使用。

以下语法用于显示子查询与 EXISTS 条件 的工作原理:

EXISTS 条件只保留子查询返回的行数,而不保留行的内容。因此,我们可以使用以下 EXISTS 条件语法:

  • 子查询可以是 EXISTS 条件的输入。如果子查询返回任何行,则 EXISTS 条件将返回 TRUE
  • 如果子查询不返回任何行,则 EXISTS 条件的输出将返回 FALSE

让我们看一个示例,以便更好地理解带 EXISTS 条件子查询

为此,我们将使用 PostgreSQL 教程前面部分创建的 javatpoint 数据库中的 employee 和 department 表。

输出

执行上述命令后,我们将获得以下输出

PostgreSQL Subquery

正如我们在上面的截图中所看到的,命令在 emp_id 列上像 PostgreSQL Inner Join 一样工作。

但它会返回employee表中的至少一行,即使department表中存在一些匹配的行。

IN 条件的 PostgreSQL 子查询示例

PostgreSQL 子查询也可以与 IN 条件结合使用。

在这里,我们将子查询与 IN 条件和 WHERE 子句一起使用。

在下面的示例中,我们使用了与上面示例相同的表(employee 和 department)。

在这里,我们将尝试获取joining_date2010-08-222010-08-26 之间的employee 的信息

输出

执行上述命令后,我们将得到以下结果:

PostgreSQL Subquery

上面的命令将返回多行。因此,我们可以将此命令用作以下语句 WHERE 子句中的子查询:

输出

成功执行上述命令后,我们将得到以下输出:

PostgreSQL Subquery

PostgreSQL 子查询与不同语句的示例

让我们通过不同的示例来了解 PostgreSQL 子查询如何与各种语句一起工作。

SELECT 语句的 PostgreSQL 子查询示例

我们将展示如何将 子查询与 SELECT 命令一起使用。

为此,我们将从 Javatpoint 数据库中的 Car 表中检索所有记录。

假设我们需要识别 car_price 高于平均 car_pirce 的汽车。为此,我们将执行以下两个步骤:

步骤 1

首先,我们将使用 SELECT 命令和 (AVG) 平均函数来识别平均 car_price

以下语句用于从 car 表中获取平均 car_price

输出

成功执行上述命令后,我们将得到以下输出:

PostgreSQL Subquery

正如我们在下面的截图中所看到的,平均 car_price103109.500

步骤 2

之后,我们将第一个命令的输出放到第二个 SELECT 命令中,以识别 car 表中的汽车。

在下面的命令中,我们将获得 car_id, car_name,其 car_price大于平均 car_price

输出

执行上述命令后,我们将得到以下结果:

PostgreSQL Subquery

正如我们所见,上面的代码设计不佳,因为它需要两个步骤才能执行查询。因此,我们需要在单个命令中允许第一个命令的输出到第二个命令。

在这种情况下,我们将使用 PostgreSQL 子查询的概念,因为子查询是嵌套在 INSERT、SELECT、UPDATE 和 DELETE 等其他命令中的命令。

在本节的 PostgreSQL 教程中,我们将逐一了解所有语句。

SELECT 语句的 PostgreSQL 子查询语法

SELECT 语句的 PostgreSQL 子查询语法如下:

要创建子查询,我们将第二个命令放在括号中,并将其与 WHERE 子句一起作为表达式:

输出

执行上述命令后,我们将获得以下输出

PostgreSQL Subquery

正如我们可以观察到的,在执行两个命令后,我们将得到相似的输出,但子查询命令更高效且可读。

注意:PostgreSQL 按以下顺序执行包含子查询的命令:

  • 首先,它将执行子查询。
  • 然后,它将获取输出并将其传递给 外部 SELECT外部查询
  • 最后,它将执行 外部 SELECT

INSERT 语句的 PostgreSQL 子查询示例

我们将展示如何将 子查询与 INSERT 语句一起使用。在 INSERT 命令中,子查询返回的记录用于插入到另一个表中。

在 PostgreSQL 子查询中,选定的数据可以用任何 日期函数和字符进行更改。

INSERT 语句的 PostgreSQL 子查询语法

INSERT 语句的 PostgreSQL 子查询语法如下:

为此,我们将使用 Organization 数据库中的 employee 和 department 表,并使用 AND Operator 将记录从一个表插入到另一个表。

在下面的示例中,我们将从 department 表中的记录插入到 employee 表中。

我们从 department 表中获取 phoneaddress 列的记录,其中 dept_id 小于 5,并且 department_nameOPERATION

输出

执行上述命令后,我们将看到以下消息窗口,显示值已成功插入 employee 表中。

PostgreSQL Subquery

要检查记录是否已插入 employee 表中,我们将使用 SELECT 命令,如下所示:

输出

在实现上述命令后,我们将获得以下输出

PostgreSQL Subquery

正如我们在上面的截图中所看到的,PostgreSQL 子查询将一条记录插入到 employee 表中。

UPDATE 语句的 PostgreSQL 子查询示例

我们将展示如何将 子查询与 UPDATE 语句一起使用。如果我们将子查询与 UPDATE 命令一起使用,则可以更新表中的一个或多个列。

UPDATE 语句的 PostgreSQL 子查询语法

PostgreSQL UPDATE 命令的子查询语法如下:

为此,我们将使用 PostgreSQL 教程前面部分创建的 Javatpoint 数据库中的 Summer_fruits 和 Winter_fruits 表。

在下面的命令中,PostgreSQL 子查询用于更新 summer_fruits 表中的 Fruits_name 列值,该值来自 winter_fruits 表中的 winter_fruits_name 列,其中 winter_fruitswf_id 列等于 summer_fruitssf_id 列。

输出

执行上述命令后,我们将得到以下输出,其中我们可以看到 summer_fruits 表已成功更新。

PostgreSQL Subquery

我们现在将使用 Select 命令来检查 summer_fruits 表中的特定记录是否已更新:

输出

执行上述命令后,我们将得到以下结果:

PostgreSQL Subquery

正如我们在上面的截图中所看到的,PostgreSQL 子查询将六条记录更新到 summer_fruits 表

DELETE 语句的 PostgreSQL 子查询示例

我们将展示如何像上面提到的任何其他语句一样,将 子查询与 DELETE 语句一起使用。

DELETE 语句的 PostgreSQL 子查询语法

PostgreSQL DELETE 命令的子查询语法如下:

在下面的示例中,我们使用 Javatpoint 数据库中的 Course 和 Course_categories 表,并使用 EXISTS operator 从表中删除特定记录。

在下面的命令中,PostgreSQL 子查询用于从 Course 表中删除所有记录,其中 Course 表中的 course_idCourse_categories 表中的 course_category_id相等

输出

执行上述命令后,我们将看到以下消息窗口,显示记录已成功从 Course 表中删除。

PostgreSQL Subquery

我们现在将使用 Select 命令来检查 Course 表中的特定记录是否已删除:

输出

成功执行上述命令后,我们将得到以下输出:

PostgreSQL Subquery

概述

PostgreSQL 子查询的使用有助于我们创建复杂的命令。在 PostgreSQL 子查询部分,我们学习了以下主题:

  • 我们将 子查询与 SELECT 子句一起使用,以选择特定的表记录。
  • 我们将 子查询与 FROM 子句一起使用,以获取表列表。
  • 我们将 子查询与 WHERE 子句一起使用,以过滤输出并应用条件。
  • 我们将 子查询与 EXISTS 条件一起使用,以检查子查询至少返回一行时条件是否已满足。
  • 我们将 子查询与 IN 条件一起使用,以测试表达式是否与值列表中的任何值匹配。
  • 我们将 子查询与 SELECT 命令一起使用,以获取特定的表记录。
  • 我们将 子查询与 INSERT 命令一起使用,以将记录从一个表插入到另一个表。
  • 我们将 子查询与 UPDATE 语句一起使用,以更新表的记录。
  • 我们将 子查询与 DELETE 语句一起使用,以删除特定表的记录。