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;
输出
执行上述命令后,我们将获得以下输出:
在上面的示例中,我们在
SELECT 子句中创建了
Subquery ,如下所示:
我们将子查询的别名命名为
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;
输出
成功执行以上命令后,我们将获得以下输出:
在上面的示例中,我们在
FROM 子句中创建了一个
Subquery ,如下所示:
并且我们将子查询的别名命名为
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%');
输出
在执行上述命令时,我们将得到以下结果:
在上面的示例中,我们在
WHERE 子句中创建了
Subquery ,如下所示:
上述子查询语句将使我们能够从
中识别所有 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子句的上述子查询命令相比,我们将获得类似的结果:
注意: 与原始子查询相比,INNER JOIN条件的执行效率更高,很重要的一点是,并不是所有的子查询都可以借助PostgreSQL联接来重写。
具有不同条件的PostgreSQL子查询示例
让我们看看不同的示例以了解
PostgreSQL子查询如何工作
具有EXISTS条件的PostgreSQL子查询示例
PostgreSQL子查询也可以与
EXISTS子句结合使用。
以下语法用于显示具有 EXISTS条件:
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
);
输出
执行上述命令后,我们将获得以下输出:
如上图所示,该命令的工作方式类似于
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';
输出
在执行上述命令时,我们将得到以下结果:
以上命令将返回各行。因此,我们可以在以下语句的
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命令。
为此,我们从
lidihuo 数据库中获取
Car 表,以从中检索所有记录
让我们假设我们需要确定那些
car_price 高于平均
car_pirce 的汽车。为此,我们将执行以下两个步骤:
Step1
首先,我们将使用SELECT命令和
确定平均 car_price >(AVG)平均函数。
以下语句用于获取平均
car表中的
car_price :
SELECT
AVG (car_price)
FROM car;
输出
成功执行上述命令后,我们将获得以下输出:
如下面的屏幕截图所示,平均
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子查询的概念,因为子查询是一个命令,该命令嵌套在其他命令中,例如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按照以下顺序执行包含子查询的命令:
首先,它将实现子查询。
然后,它将获取输出并将其传递给外部选择或外部查询。
最后,它将执行外部选择。
带有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 表。
我们用
phone和
department 表中的
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 表。
检查记录是否已插入
employee 表,我们将使用SELECT命令,如下所示:
输出
执行上述命令后,我们将获得以下输出:
如上图所示,
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 表已成功更新。
我们现在将使用
Select 命令以检查
summer_fruits 表中的特定记录是否已更新:
SELECT * FROM summer_fruits;
输出
在执行上述命令时,我们将得到以下结果:
如上图所示,
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 表。
我们现在将使用
Select 命令以检查
课程 表中的特定记录是否已删除:
输出
成功执行上述命令后,我们将获得以下输出:
概述
使用PostgreSQL
Subquery 帮助我们创建复杂的命令。在
PostgreSQL子查询部分中,我们学习了以下主题:
我们使用带有SELECT子句的子查询来选择特定的表记录。
我们使用子查询和FROM子句获取表列表。
我们使用了子查询和WHERE子句一起过滤输出并应用条件。
我们将子查询与EXISTS条件一起使用,以检查子查询返回至少一行后是否满足条件。
如果表达式与值列表中的任何值匹配,我们将子查询与IN条件测试结合使用。
我们使用子查询和SELECT命令来获取特定的表记录。
我们使用 Subquery 和INSERT命令将记录从一个表插入到另一个表。
我们使用子查询和UPDATE语句来更新表的记录。
我们使用子查询和DELETE语句删除特定表的记录。