EXISTS谓词
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
EXISTS
谓词不如 IN谓词 直观,但功能更强大,可用于形成半连接或反连接。 使用 jOOQ,EXISTS
谓词可以通过多种方式形成
- 从 DSL,使用静态方法。 这可能是最常用的情况
- 从 条件表达式 使用 附加到布尔运算符的便捷方法
- 从 SELECT 语句 使用 附加到 where 子句的便捷方法 以及其他子句
可以在此处看到 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
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!