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

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子句的词法和逻辑顺序

上一节 : 下一节

反馈

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

The jOOQ Logo