PostgreSQL教程

PostgreSQL 子查询

在本节中,我们将了解 PostgreSQL子查询的工作原理,这使我们能够创建困难的查询。而且,我们还会看到 子查询示例,它们具有不同的 子句,例如 SELECT,FROM和WHERE ,不同的 条件(例如 IN,EXISTS )和其他 查询(例如 SELECT,INSERT,UPDATE和DELETE)。

PostgreSQL子查询简介

子查询是在另一个查询中使用的命令。相比之下, INNER SELECT INNER语句被称为 SUBQUERY ,而 OUTER SELECT OUTER语句称为 MAIN命令。 PostgreSQL子查询包含在 括号中。
PostgreSQL子查询可以与其他子句一起使用,例如SELECT,FROM,位置和 HAVING子句。
我们还可以将PostgreSQL子查询与 SELECT ,插入,更新和删除 命令以及其他 运算符,例如 <,>,=,<=,> = , BETWEEN, IN ,依此类推。
注意: 在PostgreSQL中,子查询不允许与ORDER BY子句一起使用。但是我们可以使用GROUP BY命令代替ORDER BY命令执行类似的功能。

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

让我们看一下不同的示例来了解 PostgreSQL子查询如何工作

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

PostgreSQL 子查询也可以与SELECT 子句结合。
当我们想借助诸如 的集合函数来获取计算时,将使用子查询。 > Average,Count,Sum,Max和Min函数,但我们不希望将聚集函数用于 MAIN查询
此处,我们将显示如何将 子查询与SELECT子句一起使用。
我们从 中获取 car 表lidihuo数据库,以从表中选择特定数据。
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 Subquery
在上面的示例中,我们在 SELECT 子句中创建了 Subquery ,如下所示:
PostgreSQL子查询
我们将子查询的别名命名为 Subquery1 。用于引用上面的子查询或任何这些字段。
注意: 注意: 子查询中经常使用诸如平均值,计数,求和,最大值和最小值等聚合函数。并且子查询必须返回单个值,这就是为什么我们将子查询放在SELECT子句中的原因。

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

PostgreSQL子查询也可以与 FROM子句组合。
为此,我们从 lidihuo数据库中获取 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 Subquery
在上面的示例中,我们在 FROM 子句中创建了一个 Subquery ,如下所示:
PostgreSQL子查询
并且我们将子查询的别名命名为 Subquery2

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

最常与 一起使用的PostgreSQL子查询> WHERE子句。这些子查询也称为 嵌套子查询
为此,我们使用 Client and Client_details 表从 lidihuo 数据库中获得,该数据库是我们在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 Subquery
在上面的示例中,我们在 WHERE 子句中创建了 Subquery ,如下所示:
PostgreSQL子查询
上述子查询语句将使我们能够从 中识别所有 client_id client_id 小于 6 client_details 表,而 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条件子查询
为此,我们从 lidihuo数据库中获取 员工 department strong>,这是我们在PostgreSQL教程前面的部分中创建的。
SELECT emp_fname, emp_lname
FROM employee
WHERE EXISTS (
    SELECT 1
    FROM department
    WHERE department.emp_id = employee.emp_id
  );
输出
执行上述命令后,我们将获得以下输出:
PostgreSQL Subquery
如上图所示,该命令的工作方式类似于 emp_id 列上的PostgreSQL Inner Join。
但是它会返回 employee 表中的至少一行,尽管 department 表中有一些匹配的行。

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

PostgreSQL子查询也可以与IN条件组合。
这里,我们使用
在下面的示例中,我们采用与上面的示例类似的表( 员工和department )。
在这里,我们将尝试获取包含 入职日期 员工信息 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 Subquery
以上命令将返回各行。因此,我们可以在以下语句的 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命令。
为此,我们从 lidihuo 数据库中获取 Car 表,以从中检索所有记录
让我们假设我们需要确定那些 car_price 高于平均 car_pirce 的汽车。为此,我们将执行以下两个步骤:
Step1
首先,我们将使用SELECT命令和 确定平均 car_price >(AVG)平均函数。
以下语句用于获取平均 car表中的 car_price :
SELECT
AVG (car_price)
FROM car;
输出
成功执行上述命令后,我们将获得以下输出:
PostgreSQL子查询
如下面的屏幕截图所示,平均 car_price 103109.500
Step2
此后,我们将在第二个 SELECT命令中获取第一个命令的输出,以从轿厢表中识别汽车。
在下面的命令中,我们将得到 car_id,car_name ,其 car_price 比平均 car_price <更大> /strong>:
SELECT car_id, car_name, car_price
FROM car
WHERE car_price >103109.5;
输出
在执行上述命令时,我们将得到以下结果:
PostgreSQL Subquery
我们可以看到,上面的代码设计得不好,因为它需要两个步骤来实现查询。因此,我们需要在单个命令中允许第一条命令的输出到第二条命令。
在这种情况下,我们将使用 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
我们可以看到,在执行这两个命令之后,我们将获得类似的输出,但是Subquery命令更加高效和可读。
注意: PostgreSQL按照以下顺序执行包含子查询的命令:
首先,它将实现子查询。 然后,它将获取输出并将其传递给外部选择外部查询 最后,它将执行外部选择

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

我们将显示如何将 Subquery 与INSERT语句一起使用。在INSERT命令中,子查询返回的记录用于插入另一个表。
在PostgreSQL子查询中,可以使用任何 date函数和字符更改所选数据。 >。

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

带有INSERT命令的PostgreSQL子查询的语法如下:
INSERT INTO table_name (column1, column2,.. columnN)   
SELECT column_names
FROM table_name  
WHERE VALUE OPERATOR
为此,我们从 组织数据库中获取 员工 department ,并使用 AND运算符将记录从一个表插入到另一个表。
在下面的示例中,我们将记录插入到 employee 表中的 employee 表。
我们用 phonedepartment 表中的 address列记录, dept_id 小于 5,且ANDdepartment名称 OPERATION
INSERT INTO employee
(phone, address)
SELECT phone, address
FROM department
WHERE dept_id < 5
AND department_name = 'OPERATION';
输出
执行上述命令后,我们将获得以下消息窗口,显示该值已成功插入 employee 表。
PostgreSQL子查询
检查记录是否已插入 employee 表,我们将使用SELECT命令,如下所示:
SELECT * FROM employee;
输出
执行上述命令后,我们将获得以下输出:
PostgreSQL Subquery
如上图所示, 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
);  
为此,我们从 lidihuo 中获取 Summer_fruits Winter_fruits表数据库,该数据库是我们在PostgreSQL教程前面的部分中创建的。
在以下命令中, PostgreSQL子查询用于更新 Fruits_name winter_fruits 中的 winter_fruits_name 列中的 summer_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 命令如下:
DELETE 
FROM table_name  
WHERE value operator (
SELECT column_name  
    FROM table_name 
    WHERE condition
);   
在下面的示例中,我们从 lidihuo中获取 Course Course_categories 数据库,还使用 EXISTS运算符从表中删除特定记录。
在以下命令中, PostgreSQL子查询是用于从 课程 表中删除所有记录,其中 Course 中的 course_id 表,并且 课程类别 表中的 course_category_id 等于
DELETE FROM Course
WHERE EXISTS (
    SELECT course_name
          FROM Course_categories
          WHERE Course.course_id = Course_categories.course_category_id
);
输出
执行上述命令后,我们将获得以下消息窗口,显示记录已成功从 Course 表。
PostgreSQL子查询
我们现在将使用 Select 命令以检查 课程 表中的特定记录是否已删除:
SELECT * 
FROM Course;
输出
成功执行上述命令后,我们将获得以下输出:
PostgreSQL Subquery

概述

使用PostgreSQL Subquery 帮助我们创建复杂的命令。在 PostgreSQL子查询部分中,我们学习了以下主题:
我们使用带有SELECT子句的子查询来选择特定的表记录。 我们使用子查询和FROM子句获取表列表。 我们使用了子查询和WHERE子句一起过滤输出并应用条件。 我们将子查询与EXISTS条件一起使用,以检查子查询返回至少一行后是否满足条件。 如果表达式与值列表中的任何值匹配,我们将子查询与IN条件测试结合使用。 我们使用子查询和SELECT命令来获取特定的表记录。 我们使用 Subquery 和INSERT命令将记录从一个表插入到另一个表。 我们使用子查询和UPDATE语句来更新表的记录。 我们使用子查询和DELETE语句删除特定表的记录。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4