九月 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 示例
我们将使用示例数据库中的customer
和payment
表进行演示,如下:
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;
该查询返回以下输出:
在此示例中,对于customer
表中的每个客户,子查询检查payment
表以查找该客户是否至少进行了一次付款 (p.customer_id = c.customer_id
) 并且金额是否大于 11 (amount > 11
)。
B) NOT EXISTS 示例
NOT
运算符对EXISTS
运算符的结果取反。NOT EXISTS
与EXISTS
相反。这意味着如果子查询没有返回行,则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;
这是输出:
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 的EXISTS
来测试子查询中是否存在行。