Skip to main content

SQLite存在

SQLite操作程序简介

EXISTS运算符是一个逻辑运算符,用于检查子查询是否返回任何行。

以下是EXISTS运算符的基本语法:

EXISTS(subquery)

在这种语法中,子查询是一个SELECT语句,返回零行或多行。

如果子查询返回一行或多行,EXISTS运算符将返回true。否则,EXISTS运算符将返回false或NULL。

请注意,如果子查询返回一行为NULL,那么EXISTS运算符的结果仍然为true,因为结果集包含一行为NULL。

要对EXISTS运算符求反,请使用NOT EXISTS运算符,如下所示:

NOT EXISTS (subquery)

如果子查询不返回任何行,NOT EXISTS运算符将返回true。

SQLite运算符示例

请参见示例数据库中的以下客户和发票表:

以下声明查找有发票的客户:

SELECT
CustomerId,
FirstName,
LastName,
Company
FROM
Customers c
WHERE
EXISTS (
SELECT
1
FROM
Invoices
WHERE
CustomerId = c.CustomerId
)
ORDER BY
FirstName,
LastName;

下图显示了部分结果集:

在本例中,对于每个客户,EXISTS操作符检查发票表中是否存在客户id。

请注意,在这种情况下,您可以使用IN运算符而不是EXISTS运算符来实现相同的结果:

SELECT
CustomerId,
FirstName,
LastName,
Company
FROM
Customers c
WHERE
CustomerId IN (
SELECT
CustomerId
FROM
Invoices
)
ORDER BY
FirstName,
LastName;

一旦子查询返回第一行,EXISTS操作符就会停止搜索,因为它可以确定结果。另一方面,IN操作符必须扫描子查询返回的所有行以确定结果。

一般来说,如果子查询返回的结果集很大,EXISTS运算符比IN运算符更快。相比之下,如果子查询返回的结果集很小,IN运算符比EXISTS运算符更快。

SQLite不存在运算符示例

请参见示例数据库中的以下艺术家和专辑表:

此查询查找Albums表中没有任何唱片集的所有艺术家:

SELECT
*
FROM
Artists a
WHERE
NOT EXISTS(
SELECT
1
FROM
Albums
WHERE
ArtistId = a.ArtistId
)
ORDER BY Name;

以下是部分输出:

在本教程中,您学习了如何使用SQLite EXISTS操作符测试子查询返回的行的存在性。