PostgreSQL 教程: 相关子查询

五月 26, 2024

摘要:在本教程中,您将了解 PostgreSQL 相关子查询,以执行依赖于正在处理的当前行的值的查询。

目录

PostgreSQL 相关子查询简介

在 PostgreSQL 中,相关子查询是一个引用外部查询中的列的子查询

与常规子查询不同,PostgreSQL 会为外部查询处理的每一行计算一次相关子查询。

由于 PostgreSQL 会重新计算外部查询中每一行的相关子查询,因此这可能会导致性能问题,尤其是在处理大型数据集时。

当您需要执行依赖于正在处理的当前值的查询时,相关子查询可能会很有用。

PostgreSQL 相关子查询示例

我们将使用示例数据库中的film表进行演示:

img

下面示例使用相关子查询,来查找时长高于其各自分级的平均时长的电影:

SELECT film_id, title, length, rating
FROM film f
WHERE length > (
    SELECT AVG(length)
    FROM film
    WHERE rating = f.rating
);

输出:

 film_id |            title            | length | rating
---------+-----------------------------+--------+--------
     133 | Chamber Italian             |    117 | NC-17
       4 | Affair Prejudice            |    117 | G
       5 | African Egg                 |    130 | G
       6 | Agent Truman                |    169 | PG
...

它是如何工作的?

外部查询从别名为ffilm表中检索 id、title、length 和 rating:

SELECT film_id, title, length, rating
FROM film f
WHERE length > (...)

对于由外部查询处理的每一行,相关子查询计算rating与当前行(f.rating)相同的电影的平均length

WHERE子句(WHERE length > (...))检查当前电影的时长是否大于平均值。

相关子查询计算与外部查询中当前行分级相同的电影的平均时长:

SELECT AVG(length)
FROM film
WHERE rating = f.rating

WHERE子句确保了相关子查询只考虑与外部查询中的当前行具有相同分级的电影。条件rating = f.rating创建了相关性。

因此,外部查询返回的行,其中电影的length大于具有相同rating的电影的平均length

总结

使用相关子查询,执行依赖于正在处理的当前行的值的查询。