SELECT语句
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
当您不仅仅执行 CRUD(即 SELECT * FROM your_table WHERE ID = ?)时,您通常会使用自定义投影生成新的记录类型。 使用 jOOQ,这就像直接使用 SQL 一样直观。 通过如下查询,可以提供一个或多或少完整的“标准”SQL 语法示例,以及一些扩展
从复杂的表表达式中 SELECT
-- get all authors' first and last names, and the number -- of books they've written in German, if they have written -- more than five books in German in the last three years -- (from 2011), and sort those authors by last names -- limiting results to the second and third row, locking -- the rows for a subsequent update... whew! SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID WHERE BOOK.LANGUAGE = 'DE' AND BOOK.PUBLISHED_IN > 2008 GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME HAVING COUNT(*) > 5 ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST LIMIT 2 OFFSET 1 FOR UPDATE
// And with jOOQ... DSLContext create = DSL.using(connection, dialect); create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count()) .from(AUTHOR) .join(BOOK).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)) .where(BOOK.LANGUAGE.eq("DE")) .and(BOOK.PUBLISHED_IN.gt(2008)) .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME) .having(count().gt(5)) .orderBy(AUTHOR.LAST_NAME.asc().nullsFirst()) .limit(2) .offset(1) .forUpdate() .fetch();
有关此查询的各个子句的详细信息将在后续章节中提供。
从单个表中 SELECT
如果您想从单个表中进行选择以检索 TableRecords 甚至是 UpdatableRecords,则可以使用一个非常相似但受限制的 API。 在您使用 DSL 或 DSLContext 类型创建 SELECT
语句的第一步时,就已经做出了创建哪种类型的 select 的决定
public <R extends Record> SelectWhereStep<R> selectFrom(Table<R> table);
如您所见,没有办法进一步限制/投影所选字段。 这只会选择提供的 Table 中的所有已知 TableFields,并且还会将 <R extends Record> 绑定到您的 Table 的关联 Record。 这样一个查询的示例是
BookRecord book = create.selectFrom(BOOK) .where(BOOK.LANGUAGE.eq("DE")) .orderBy(BOOK.TITLE) .fetchAny();
“简化的”SELECT API 在跳过对任何这些子句的 DSL 访问方面是有限的
在本手册的大部分内容中,假定您不使用“简化的”SELECT API。 有关简单 SELECT API 的更多信息,请参阅手册中关于获取强类型或弱类型记录的部分。
目录
- 3.5.3.1.
- SELECT子句
- 3.5.3.1.1.
- 投影类型安全
- 3.5.3.1.2.
- SelectField
- 3.5.3.1.3.
- 表作为SelectField
- 3.5.3.1.4.
- SELECT *
- 3.5.3.1.5.
- SELECT * EXCEPT (...)
- 3.5.3.1.6.
- SELECT DISTINCT
- 3.5.3.1.7.
- SELECT DISTINCT ON
- 3.5.3.1.8.
- 便捷方法
- 3.5.3.2.
- FROM子句
- 3.5.3.2.1.
- JOIN运算符
- 3.5.3.2.2.
- 隐式路径JOIN
- 3.5.3.2.3.
- 隐式多对一路径JOIN
- 3.5.3.2.4.
- 显式路径JOIN
- 3.5.3.2.5.
- 隐式路径关联
- 3.5.3.3.
- WHERE子句
- 3.5.3.4.
- CONNECT BY子句
- 3.5.3.5.
- GROUP BY子句
- 3.5.3.5.1.
- GROUP BY列
- 3.5.3.5.2.
- GROUP BY列索引
- 3.5.3.5.3.
- GROUP BY表
- 3.5.3.5.4.
- GROUP BY ROLLUP
- 3.5.3.5.5.
- GROUP BY CUBE
- 3.5.3.5.6.
- GROUP BY GROUPING SETS
- 3.5.3.5.7.
- GROUP BY空分组集
- 3.5.3.6.
- HAVING子句
- 3.5.3.7.
- WINDOW子句
- 3.5.3.8.
- QUALIFY子句
- 3.5.3.9.
- ORDER BY子句
- 3.5.3.9.1.
- 按列索引排序
- 3.5.3.9.2.
- 排序和NULLS
- 3.5.3.9.3.
- 使用CASE表达式排序
- 3.5.3.9.4.
- Oracle的ORDER SIBLINGS BY子句
- 3.5.3.10.
- LIMIT .. OFFSET子句
- 3.5.3.11.
- WITH TIES子句
- 3.5.3.12.
- SEEK子句
- 3.5.3.13.
- FOR XML子句
- 3.5.3.13.1.
- AUTO模式
- 3.5.3.13.2.
- PATH模式
- 3.5.3.13.3.
- EXPLICIT模式
- 3.5.3.13.4.
- RAW模式
- 3.5.3.13.5.
- ROOT指令
- 3.5.3.13.6.
- ELEMENTS指令
- 3.5.3.14.
- FOR JSON子句
- 3.5.3.14.1.
- AUTO模式
- 3.5.3.14.2.
- PATH模式
- 3.5.3.14.3.
- ROOT指令
- 3.5.3.14.4.
- INCLUDE_NULL_VALUES指令
- 3.5.3.14.5.
- WITHOUT_ARRAY_WRAPPER指令
- 3.5.3.15.
- FOR UPDATE子句
- 3.5.3.16.
- 集合操作
- 3.5.3.16.1.
- 类型安全
- 3.5.3.16.2.
- 投影行类型
- 3.5.3.16.3.
- 与标准SQL的差异
- 3.5.3.16.4.
- UNION
- 3.5.3.16.5.
- UNION ALL
- 3.5.3.16.6.
- INTERSECT
- 3.5.3.16.7.
- INTERSECT ALL
- 3.5.3.16.8.
- EXCEPT
- 3.5.3.16.9.
- EXCEPT ALL
- 3.5.3.17.
- SELECT子句的词法和逻辑顺序
上一节 : 下一节 |
引用此页
- jOOQ 和向后兼容性
- SQL 方言
- WITH子句
- SELECT 语句的 FOR XML 子句
- SELECT 语句的 FOR JSON 子句
- INSERT 语句的 RETURNING 子句
- 创建标量函数
- CREATE FUNCTION 中的 SQL 数据访问特性
- CREATE PROCEDURE 中的 SQL 数据访问特性
- CREATE TABLE AS SELECT 语句
- 代码生成器生成的表引用
- 连接的表表达式
- VALUES()表构造函数
- 派生表
- 表值函数
- DUAL 虚拟表
- 临时表
- 数据变更增量表
- 聚合函数如何与 GROUP BY 交互
- 条件表达式
- 用于大于 1 的度数的比较谓词
- EXISTS 谓词
- 合成SQL子句
- 以编程方式使用 jOOQ 的解析器 API
- QueryPart 声明与引用
- Record 和 TableRecord 之间的区别
- 使用 UpdatableRecords 进行 CRUD 操作
- 简单的 CRUD 操作
- 批量连接
- 代码生成配置:客户端计算列
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的意见!