可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

EXISTS谓词

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

EXISTS谓词不如 IN谓词 直观,但功能更强大,可用于形成半连接或反连接。 使用 jOOQ,EXISTS谓词可以通过多种方式形成

可以在此处看到 EXISTS 谓词的示例

    EXISTS (SELECT 1 FROM BOOK
            WHERE AUTHOR_ID = 3)

NOT EXISTS (SELECT 1 FROM BOOK
            WHERE AUTHOR_ID = 3)
   exists(create.selectOne().from(BOOK)
                .where(BOOK.AUTHOR_ID.eq(3)));

notExists(create.selectOne().from(BOOK)
                .where(BOOK.AUTHOR_ID.eq(3)));

请注意,在 SQL 中,EXISTS 谓词中子查询的投影无关紧要。 为了帮助您编写像上面这样的查询,您可以使用 jOOQ 的 selectZero() 或 selectOne() DSL 方法

IN vs. EXISTS 的性能

理论上,这两种类型的谓词可以表现得同样好。 如果您的数据库系统附带复杂的基于成本的优化器,如果您设置了所有必要的约束(例如,引用约束,非空约束),它将能够将一个谓词转换为另一个谓词。 但是,实际上,两者之间的性能可能会有很大差异。 可以在此处看到一篇有趣的博文,调查了 MySQL 数据库上的这个主题
https://blog.jooq.org/not-in-vs-not-exists-vs-left-join-is-null-mysql/

方言支持

此示例使用 jOOQ

exists(select(asterisk()).from(BOOK))

翻译成以下特定方言的表达式

所有方言

EXISTS (
  SELECT *
  FROM BOOK
)
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo