PostgreSQL 子查询 PostgreSQL 更新插入 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、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; 输出 执行上述命令后,我们将得到以下输出: 在上面的例子中,我们在SELECT子句中创建了一个子查询,如下所示: 我们将子查询别名为名称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; 输出 成功执行上述命令后,我们将得到以下输出: 在上面的例子中,我们在FROM子句中创建了一个子查询,如下所示: 我们将子查询别名为名称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%'); 输出 执行上述命令后,我们将得到以下结果: 在上面的例子中,我们在WHERE子句中创建了一个子查询,如下所示: 上面的子查询语句将允许我们从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 子句的子查询命令类似的结果: 注意:与原始子查询相比,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 ); 输出 执行上述命令后,我们将得到以下输出: 正如我们在上面的屏幕截图中看到的,命令的工作方式类似于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'; 输出 执行上述命令,我们将得到以下结果: 上面的命令将返回不同的行。因此,我们可以将此命令用作以下语句的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 子查询是如何处理几个语句的。 带有 SELECT 语句的 PostgreSQL 子查询示例 我们将使用带有 SELECT 命令的子查询进行显示。 为此,我们从Javatpoint数据库中取出Car\表来检索表中的所有记录。 让我们假设我们需要识别那些car_price高于平均car_pirce 的汽车。因此,为此,我们将执行以下两个步骤: 步骤1 首先,我们将使用 SELECT 命令和(AVG) average 函数识别平均car_price。 以下语句用于从car\表中获取平均car_price: SELECT AVG (car_price) FROM car; 输出 成功执行上述命令后,我们将得到以下输出: 正如我们在下面的屏幕截图中看到的,平均car_price是103109.500。 第2步 之后,我们将在第二个SELECT 命令中获取第一个命令的输出,以从汽车表中识别汽车。 在下面的命令,我们会得到car_id,car_name其car_price是更大的比一般car_price: SELECT car_id, car_name, car_price FROM car WHERE car_price >103109.5; 输出 执行上述命令后,我们将得到以下结果: 正如我们所见,上面的代码设计得并不好,因为它需要两个步骤来实现一个查询。因此,我们需要在单个命令中允许第一个命令的输出到第二个命令。 在这种情况下,我们将使用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 ); 输出 执行上述命令后,我们将得到以下输出: 正如我们所观察到的,在执行这两个命令后,我们将得到类似的输出,但 Subquery 命令更高效和可读。 注意:PostgreSQL 按以下顺序执行那些包含子查询的命令: 首先,它将实现子查询。 然后,它将获取输出并将其传递给OUTER SELECT或OUTER 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'; 输出 执行上述命令后,我们将得到以下消息窗口,显示该值已成功插入到员工\表中。 要检查记录是否已插入到employee\表中,我们将使用SELECT 命令,如下所示: SELECT * FROM employee; 输出 执行上述命令后,我们将得到以下输出: 正如我们在上面的屏幕截图中看到的那样,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\表已经更新成功。 我们现在将使用Select命令来检查summer_fruits\表中的特定记录是否已更新: SELECT * FROM summer_fruits; 输出 执行上述命令,我们将得到以下结果: 正如我们在上面的截图中看到的,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_id从Course_categories\表是相等。 DELETE FROM Course WHERE EXISTS ( SELECT course_name FROM Course_categories WHERE Course.course_id = Course_categories.course_category_id ); 输出 执行上述命令后,我们将看到以下消息窗口,显示已成功从Course\表中删除记录。 我们现在将使用Select命令来检查Course\表中的特定记录是否已被删除: SELECT * FROM Course; 输出 成功执行上述命令后,我们将得到以下输出: 概述 PostgreSQL子查询的使用帮助我们创建复杂的命令。在PostgreSQL 子查询部分,我们学习了以下主题: 我们使用带有 SELECT 子句的子查询来选择特定的表记录。 我们使用带有 FROM 子句的子查询来获取表的列表。 我们使用带有 WHERE 子句的子查询来过滤输出并应用条件。 我们使用带有 EXISTS 条件的子查询来检查一旦子查询返回至少一行时是否满足条件。 如果表达式匹配值列表中的任何值,我们使用带有 IN 条件的子查询测试。 我们使用带有 SELECT 命令的子查询来获取特定的表记录。 我们使用带有 INSERT 命令的子查询将记录从一个表插入到另一个表。 我们使用带有 UPDATE 语句的子查询来更新表的记录。 我们使用带有 DELETE 语句的子查询来删除特定表的记录。 PostgreSQL 更新插入 PostgreSQL 数据类型