PostgreSQL 子查询用法与实例

本文介绍了如何在 PostgreSQL 中使用子查询。

在 PostgreSQL 中,子查询是嵌套在另一个查询中的查询,也被称为内部查询。

通常情况下,我们会使用子查询构建更复杂的 SQL 语句。比如,您可以将子查询使用在 EXISTS, IN, ANY, ALL 等表达式中,也可以将子查询的结果直接和值比较。

在 PostgreSQL EXISTS 运算符中使用子查询

PostgreSQL EXISTS 运算符需要一个子查询作为操作数,以检查此子查询是否返回行。

比如,要从 Sakila 数据库中的 language查找那些在 film 表中用到的语言,您可以使用如下语句:

SELECT *
FROM language
WHERE EXISTS(
    SELECT *
    FROM film
    WHERE film.language_id = language.language_id
  );
 language_id |         name         |     last_update
-------------+----------------------+---------------------
           1 | English              | 2006-02-15 05:02:19
(1 row)

在上面的语句中,下面的查询就是一个子查询:

SELECT *
FROM film
WHERE film.language_id = language.language_id

在 PostgreSQL IN 运算符中使用子查询

PostgreSQL IN 运算符也需要一个集合作为操作数,因此您也可以使用 子查询 作为 IN 运算符右侧的操作数。

比如,您可以使用如下带有 IN 运算符和子查询的语句达到上面的目的:

SELECT *
FROM language
WHERE language_id in(
    SELECT DISTINCT language_id
    FROM film
  );
 language_id |         name         |     last_update
-------------+----------------------+---------------------
           1 | English              | 2006-02-15 05:02:19
(1 row)

这里,下面的语句就是一个子查询,以查询出所有的影片用到的 language_id:

SELECT DISTINCT language_id
FROM film

将子查询直接和值进行比较

比如,要计算租金高于平均租金的影片的数量,您可以使用一下语句实现:

SELECT count(*)
FROM film
WHERE rental_rate > (
    SELECT avg(rental_rate)
    FROM film
  );
 count
-------
   659

这里,我们使用了下面的子查询计算影片的平均租金:

SELECT avg(rental_rate)
FROM film

然后,将租金 rental_rate 和上面子查询的结果进行比较,从而得到租金比平均租金大的影片的数量。

结论

PostgreSQL 子查询可以帮助您构建更复杂的 SQL 语句。