Skip to main content

查询数据

对表执行 SELECT 查询。

您可以使用 range() 查询来分页浏览数据。

select() 可以与 过滤器 结合使用

select() 也可以与 修饰符 结合使用

参数

参数类型必需说明
columnsQuery可选要检索的列,用逗号分隔。返回时可以使用 customName:aliasName 重命名列
optionsobject可选查询选项配置

options 详细配置

参数类型必需说明
countstring可选计数算法,可选值:
"exact" - 底层执行 COUNT(*)
headboolean可选设置为 true 时不返回数据,仅在需要计数时有用

代码示例

const app = cloudbase.init({
...
});

const db = app.mysql();

基础查询

获取数据

// 查询 articles 表中的所有数据
const { data, error } = await db.from("articles").select();

选择特定列

// 只查询文章的标题和创建时间
const { data, error } = await db.from("articles").select("title, created_at");

关联表查询

查询关联表

// 查询文章数据,同时获取关联的分类信息
const { data, error } = await db.from("articles").select(`
title,
categories (
name
)
`);

查询表名包含空格的关联表

// 如果表名中有空格,需要用双引号包裹
const { data, error } = await db.from("blog posts").select(`
title,
"article categories" (
name
)
`);

通过连接表查询关联表

// 查询文章及其作者信息
const { data, error } = await db.from("articles").select(`
title,
users (
name
)
`);

多次查询同一个关联表

// 查询文章,同时获取创建者和修改者的信息
// 使用外键约束名来区分不同的关联关系
const { data, error } = await db.from("articles").select(`
title,
created_by:users!articles_created_by_fkey(name),
updated_by:users!articles_updated_by_fkey(name)
`);

说明:当同一个表(这里是 users)通过不同的外键关联多次时,需要使用外键约束名(articles_created_by_fkeyarticles_updated_by_fkey)来区分不同的关联关系。这通常发生在一张表有多个字段都关联到同一张目标表的情况。

通过连接表查询嵌套的外键表

// 查询分类及其下的所有文章,以及文章的作者信息
const { data, error } = await db.from("categories").select(`
name,
articles (
title,
users (
name
)
)
`);

高级查询

通过关联表过滤

// 查询特定分类下的所有文章
const { data, error } = await db
.from("articles")
.select("title, categories(*)")
.eq("categories.name", "技术文章");

说明:通过在 .eq() 中使用关联表的字段(categories.name),可以基于关联数据的条件来过滤主表数据。这种查询会自动处理表之间的关联关系。

查询关联表并计数

// 获取每个分类及其包含的文章数量
const { data, error } = await db
.from("categories")
.select(`*, articles(count)`);

说明articles(count) 会返回每个分类下文章的数量,而不会加载具体的文章数据。这在需要统计关联数据数量但不需要详细数据时非常有用,可以提高查询性能。

使用计数选项查询

// 只获取文章总数,不返回具体数据
const { count, error } = await db
.from("articles")
.select("*", { count: "exact", head: true });

使用内连接查询关联表

// 只获取有分类的文章,使用内连接确保分类存在
const { data, error } = await db
.from("articles")
.select("title, categories!inner(name)")
.eq("categories.name", "教程")
.limit(10);

说明!inner 表示内连接,只返回那些在关联表中存在匹配记录的数据。在这个例子中,只返回有对应分类的文章,排除了没有分类的文章。这在需要确保关联数据完整性时非常有用。