跳到主要内容

查询数据

初始化 SDK

import cloudbase from "@cloudbase/node-sdk";

const app = cloudbase.init({
env: "your-env-id", // 替换为您的环境id
});

const db = app.rdb();

// 或指定实例和数据库
// const db = app.rdb({
// instance: "<instance>",
// database: "<database>"
// });

基础查询

通过 select() 方法查询表数据,支持条件筛选、关联查询等功能。

db.from(tableName).select(columns, options)
  • tableName:表名称
  • columns:要检索的列,用逗号分隔
  • options:查询选项配置

参数说明

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

options 参数说明

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

代码示例

查询所有数据

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

console.log('查询结果:', data);

查询指定列

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

console.log('查询结果:', data);

返回结果

{
data: [
{
id: 1,
title: "文章标题",
created_at: "2023-01-01T00:00:00Z"
},
// ... 其他记录
],
error: null
}

关联表查询

通过关联查询可以同时获取多个表的数据,支持一对一、一对多等关联关系。

示例表结构

为了更好地理解关联查询,我们先了解一下示例中使用的表结构:

表关系说明:

  • articles 表通过 category_idcategories 表建立多对一关系
  • articles 表通过 created_byusers 表建立多对一关系(创建者)
  • articles 表通过 updated_byusers 表建立多对一关系(修改者)
查看完整的 SQL 建表语句
-- 用户表
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100)
);

-- 分类表
CREATE TABLE categories (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
);

-- 文章表
CREATE TABLE articles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(256),
content TEXT,
category_id VARCHAR(256),
created_by VARCHAR(256),
updated_by VARCHAR(256),
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id),
CONSTRAINT articles_created_by_fkey FOREIGN KEY (created_by) REFERENCES users(id),
CONSTRAINT articles_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES users(id)
);

基础关联查询

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

console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 入门教程",
categories: {
name: "前端开发"
}
},
{
title: "Node.js 实战",
categories: {
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)
`);

console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 入门教程",
created_by: {
name: "张三"
},
updated_by: {
name: "李四"
}
}
]

💡 注意:当同一个表通过不同的外键关联多次时,需要使用外键约束名来区分不同的关联关系。在示例中,articles_created_by_fkeyarticles_updated_by_fkey 是数据库中定义的外键约束名。

嵌套关联查询

// 查询分类及其下的所有文章,以及文章的作者信息
// 这是一个三层嵌套的关联查询:categories -> articles -> users
const { data, error } = await db.from("categories").select(`
name,
articles (
title,
users (
name
)
)
`);

console.log('查询结果:', data);
查看返回结果示例
[
{
name: "前端开发",
articles: [
{
title: "JavaScript 入门教程",
users: {
name: "张三"
}
},
{
title: "Vue.js 实战",
users: {
name: "李四"
}
}
]
},
{
name: "后端开发",
articles: [
{
title: "Node.js 实战",
users: {
name: "王五"
}
}
]
}
]

高级查询

条件过滤查询

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

console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 高级特性",
categories: {
id: 1,
name: "技术文章"
}
},
{
title: "数据库优化技巧",
categories: {
id: 1,
name: "技术文章"
}
}
]

计数查询

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

console.log('查询结果:', data);
查看返回结果示例
[
{
id: 1,
name: "前端开发",
articles: [
{ count: 5 } // 该分类下有5篇文章
]
},
{
id: 2,
name: "后端开发",
articles: [
{ count: 3 } // 该分类下有3篇文章
]
}
]

仅获取总数

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

console.log('总数:', count);

内连接查询

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

console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 基础教程",
categories: {
name: "教程"
}
},
{
title: "React 入门教程",
categories: {
name: "教程"
}
}
]

💡 注意:!inner 表示内连接,只返回那些在关联表中存在匹配记录的数据。如果不使用 !inner,即使文章的 category_id 为 null 或指向不存在的分类,文章仍会被返回,但 categories 字段为 null。

相关文档

  • 过滤器 - 了解如何使用过滤条件
  • 修饰符 - 了解查询修饰符的使用方法