PostgreSQL 教程: EXISTS

九月 3, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的EXISTS运算符来测试子查询中是否存在行。

PostgreSQL EXISTS 运算符简介

EXISTS运算符是一个布尔运算符,用于测试子查询中是否存在行。

下面说明了EXISTS运算符的语法:

EXISTS (subquery)

EXISTS接受一个子查询参数。

如果子查询至少返回一行,则EXISTS结果为 true。如果子查询没有返回行,则EXISTS结果为 false。

EXISTS运算符经常与相关子查询一起使用。

EXISTS运算符的结果取决于子查询是否返回任何行,而不取决于行内容。因此,子查询的SELECT子句中出现的列并不重要。

因此,常见的编码约定是采用以下形式编写EXISTS

SELECT 
    column1
FROM 
    table_1
WHERE 
    EXISTS( SELECT 
                1 
            FROM 
                table_2 
            WHERE 
                column_2 = table_1.column_1);

注意,如果子查询返回 NULL,则EXISTS结果为 true。

PostgreSQL EXISTS 示例

我们将使用示例数据库中的customerpayment表进行演示,如下:

customer and payment tables

A) 查找至少有一笔付款金额大于 11 的客户

以下语句返回至少支付过一笔租金且金额大于 11 的客户:

SELECT first_name,
       last_name
FROM customer c
WHERE EXISTS
    (SELECT 1
     FROM payment p
     WHERE p.customer_id = c.customer_id
       AND amount > 11 )
ORDER BY first_name,
         last_name;

该查询返回以下输出:

PostgreSQL EXISTS example

在此示例中,对于customer表中的每个客户,子查询检查payment表以查找该客户是否至少进行了一次付款 (p.customer_id = c.customer_id) 并且金额是否大于 11 (amount > 11)。

B) NOT EXISTS 示例

NOT运算符对EXISTS运算符的结果取反。NOT EXISTSEXISTS相反。这意味着如果子查询没有返回行,则NOT EXISTS返回 true。如果子查询返回一行或多行,则NOT EXISTS返回 false。

以下示例返回尚未支付过金额大于 11 的付款的客户。

SELECT first_name,
       last_name
FROM customer c
WHERE NOT EXISTS
    (SELECT 1
     FROM payment p
     WHERE p.customer_id = c.customer_id
       AND amount > 11 )
ORDER BY first_name,
         last_name;

这是输出:

PostgreSQL NOT EXISTS example

C) EXISTS 和 NULL

如果子查询返回NULL,则EXISTS返回 true。请参见以下示例:

SELECT
	first_name,
	last_name
FROM
	customer
WHERE
	EXISTS( SELECT NULL )
ORDER BY
	first_name,
	last_name;

在此示例中,子查询返回NULL,因此查询返回customer表中的所有行。

PostgreSQL EXIST with NULL example

在本教程中,您学习了如何使用 PostgreSQL 的EXISTS来测试子查询中是否存在行。