PostgreSQL 子查询


PostgreSQL 子查询

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

PostgreSQL 子查询介绍

子查询是在另一个查询中使用的命令。相反,INNER SELECTINNER 语句称为SUBQUERY,而OUTER SELECTOUTER 语句称为MAIN 命令。PostgreSQL 子查询括在括号中

PostgreSQL 子查询可以与不同的子句一起使用,例如 SELECT、FROM、WHERE和HAVING 子句。

我们还可以将 PostgreSQL 子查询与SELECT、INSERT、UPDATE和DELETE命令以及不同的运算符(如<、>、=、<=、>=、 BETWEEN、IN等)结合使用。

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

具有不同子句的 PostgreSQL 子查询示例

让我们看不同的例子来理解PostgreSQL 子查询是如何处理各种子句的。

带有 SELECT 子句的 PostgreSQL 子查询示例

该PostgreSQL的子查询,也可与SELECT的条款

当我们想借助聚合函数(如Average、Count、Sum、Max 和Min 函数)获取计算时使用子查询,但我们不希望在MAIN 查询中使用聚合函数。

在这里,我们将展示如何使用带有 SELECT 子句的子查询

我们从javatpoint 数据库中获取car\表以从表中选择特定数据。

SELECT c1.car_name, c1.car_model,  
    (SELECT MIN (car_id)  
     FROM car c2  
     WHERE c1.car_id = c2.car_id) Subquery1  
FROM car c1;

输出

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

PostgreSQL 子查询

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

PostgreSQL 子查询

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

注意:在子查询中经常使用聚合函数,如Average、Count、Sum、Max 和Min 函数。并且子查询必须返回单个值,这就是我们在 SELECT 子句中放置子查询的原因。

带有 FROM 子句的 PostgreSQL 子查询示例

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

为此,我们从javatpoint 数据库中获取Course 和 Course_categories表,我们在 PostgreSQL 教程的前面部分创建了它。

SELECT course.course_name, Subquery2.course_category_id  
FROM course,  
    (SELECT course_categories.course_category_id, course_categories.course_category,   
    COUNT (course_category_id) AS total  
    FROM course_categories  
    GROUP BY course_categories.course_category_id, course_categories.course_category) Subquery2  
WHERE Subquery2.course_category_id = course.course_id;

输出

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

PostgreSQL 子查询

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

PostgreSQL 子查询

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

带有 WHERE 子句的 PostgreSQL 子查询示例

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

为此,我们从Javatpoint数据库中获取Client 和 Client_details\表,该数据库是我们在 PostgreSQL 教程的前面部分创建的。

SELECT c.client_id, c.client_name, c.client_profession  
FROM client c  
WHERE c.client_id IN  
    (SELECT cd.client_id  
        FROM client_details cd  
        WHERE cd.client_id < 6  
    AND c.client_name LIKE 'M%');

输出

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

PostgreSQL 子查询

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

PostgreSQL 子查询

上面的子查询语句将允许我们从client_details\表中识别所有client_id值,其中client_id小于6,并且client_name'M'开头。子查询用于在 IN 条件的帮助下过滤MAIN 查询的输出。

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

SELECT c.client_id, c.client_name, c.client_profession  
FROM client c  
INNER JOIN Client_details cd  
ON c.client_id= cd.client_id  
WHERE cd.client_id < 6  
AND c.client_name LIKE 'M%';

输出

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

PostgreSQL 子查询

注意:与原始子查询相比,INNER JOIN 条件的执行效率更高,重要的是看到并非所有子查询都可以在 PostgreSQL 连接的帮助下重写。

具有不同条件的 PostgreSQL 子查询示例

让我们看不同的例子来理解PostgreSQL 子查询如何在不同的条件下工作。

带有 EXISTS 条件的 PostgreSQL 子查询示例

PostgreSQL的子查询,也可结合EXISTS子句

以下语法用于显示具有EXISTS 条件的子查询的工作:

EXISTS subquery

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

EXISTS   
(SELECT 1   
FROM table_name   
WHERE condition);
  • 子查询可以是 EXISTS 条件的输入。如果子查询返回任何行,则EXISTS条件将返回TRUE
  • 如果子查询不返回任何行,则EXISTS 条件的输出将返回FALSE

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

为此,我们从javatpoint 数据库中获取员工\部门\表,我们在 PostgreSQL 教程的前面部分创建了该数据库

SELECT emp_fname, emp_lname  
FROM employee  
WHERE EXISTS (  
        SELECT 1  
        FROM department  
        WHERE department.emp_id = employee.emp_id  
    );

输出

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

PostgreSQL 子查询

正如我们在上面的屏幕截图中看到的,命令的工作方式类似于emp_id列上的 PostgreSQL Inner Join 。

但是它至少返回employee\表中的一行,尽管department\表中有一些匹配的行。

带有 IN 条件的 PostgreSQL 子查询示例

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

在这里,我们使用带有 IN 条件和 WHERE 子句的子查询。

在下面的示例中,我们采用与上述示例类似的表(员工和部门\)。

在这里,我们将尝试获取这些员工的信息,\它具有joining_date\之间2010-08-22\2010-08-26:\

SELECT department.emp_id  
FROM employee  
INNER JOIN department  
ON department.emp_id = employee.emp_id  
WHERE joining_date   
BETWEEN '2010-08-22' AND '2010-08-26';

输出

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

PostgreSQL 子查询

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

SELECT job_id, job_description  
FROM jobs  
WHERE job_id IN (  
            SELECT department.emp_id  
            FROM employee  
            INNER JOIN department   
            ON department.emp_id = employee.emp_id  
            WHERE joining_date   
            BETWEEN '2010-08-22' AND '2010-08-26'  
            );

输出

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

PostgreSQL 子查询

使用不同语句的 PostgreSQL 子查询示例

让我们看不同的例子来理解PostgreSQL 子查询是如何处理几个语句的。

带有 SELECT 语句的 PostgreSQL 子查询示例

我们将使用带有 SELECT 命令的子查询进行显示。

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

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

步骤1

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

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

SELECT  
AVG (car_price)  
FROM car;

输出

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

PostgreSQL 子查询

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

第2步

之后,我们将在第二个SELECT 命令中获取第一个命令的输出,以从汽车表中识别汽车。

在下面的命令,我们会得到car_id,car_namecar_price更大的比一般car_price

SELECT car_id, car_name, car_price  
FROM car  
WHERE car_price >103109.5;

输出

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

PostgreSQL 子查询

正如我们所见,上面的代码设计得并不好,因为它需要两个步骤来实现一个查询。因此,我们需要在单个命令中允许第一个命令的输出到第二个命令。

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

在PostgreSQL教程的这一部分,我们将一一了解所有语句。

带有 SELECT 语句的 PostgreSQL 子查询的语法

带有 SELECT 命令的 PostgreSQL 子查询的语法如下:

SELECT column_name    
FROM table_name    
WHERE column_name expression operator(  
SELECT column_name    
FROM able_name   
WHERE condition);

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

SELECT car_id, car_name, car_price  
FROM car  
WHERE car_price >(  
            SELECT  
            AVG (car_price)  
            FROM  
            car );

输出

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

PostgreSQL 子查询

正如我们所观察到的,在执行这两个命令后,我们将得到类似的输出,但 Subquery 命令更高效和可读。

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

  • 首先,它将实现子查询。
  • 然后,它将获取输出并将其传递给OUTER SELECTOUTER QUERY
  • 最后,它将执行OUTER SELECT

带有 INSERT 语句的 PostgreSQL 子查询示例

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

在 PostgreSQL 子查询中,可以使用任何日期函数和字符来更改所选数据。

带有 INSERT 语句的 PostgreSQL 子查询的语法

带有 INSERT 命令的 PostgreSQL 子查询的语法如下:

INSERT INTO table_name (column1, column2,.. columnN)     
SELECT column_names  
FROM table_name    
WHERE VALUE OPERATOR

为此,我们从组织数据库中取出员工\部门\表,并使用AND 运算符将记录从一个表插入到另一个表。

在下面的示例中,我们将记录从部门\表插入到员工\表中。

我们从部门\表中取出电话地址列记录,dept_id小于5,并且部门名称OPERATION

INSERT INTO employee  
(phone, address)  
SELECT phone, address  
FROM department  
WHERE dept_id < 5  
AND department_name = 'OPERATION';

输出

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

PostgreSQL 子查询

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

SELECT * FROM employee;

输出

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

PostgreSQL 子查询

正如我们在上面的屏幕截图中看到的那样,PostgreSQL 子查询将一条记录插入到员工\表中。

带有 UPDATE 语句的 PostgreSQL 子查询示例

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

带有 UPDATE 语句的 PostgreSQL 子查询的语法

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

UPDATE table    
SET column_name = new_value    
WHERE VALUE OPERATOR (  
        SELECT column_name   
        FROM table_name   
        WHERE condition  
);

为此,我们从Javatpoint数据库中获取Summer_fruits\Winter_fruits\表,该数据库是我们在 PostgreSQL 教程的前面部分中创建的。

在下面的命令时,PostgreSQL的子查询被用来更新Fruits_name列中的值summer_fruits\从表winter_fruits_name在列winter_fruits\表所在的winter_fruits'\ wf_id列等于summer_fruits'\ sf_id柱。

UPDATE summer_fruits  
SET Fruits_name=(SELECT winter_fruits.winter_fruits_name  
                        FROM winter_fruits  
                        WHERE winter_fruits.wf_id = summer_fruits.sf_id);

输出

执行完上面的命令后,我们会得到如下输出,可以看到summer_fruits\表已经更新成功。

PostgreSQL 子查询

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

SELECT * FROM summer_fruits;

输出

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

PostgreSQL 子查询

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

带有 DELETE 语句的 PostgreSQL 子查询示例

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

带有 DELETE 语句的 PostgreSQL 子查询的语法

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

DELETE   
FROM table_name    
WHERE value operator (  
SELECT column_name    
    FROM table_name   
    WHERE condition  
);

在下面的示例中,我们从Javatpoint数据库中获取Course\Course_categories\表,并使用EXISTS 运算符从表中删除特定记录。

在下面的命令时,PostgreSQL的子查询被用来从删除的所有记录课程\表,其中COURSE_ID课程\表,并course_category_idCourse_categories\表是相等

DELETE FROM Course  
WHERE EXISTS (  
        SELECT course_name  
            FROM Course_categories  
            WHERE Course.course_id = Course_categories.course_category_id  
);

输出

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

PostgreSQL 子查询

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

SELECT *   
FROM Course;

输出

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

PostgreSQL 子查询

概述

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

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