﻿# 查询数据

## 初始化 SDK

```js
import cloudbase from "@cloudbase/js-sdk";

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

const db = app.rdb();
```

## 基础查询

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

```js
db.from(tableName).select(columns, options)
```

- **tableName**：表名称
- **columns**：要检索的列，用逗号分隔
- **options**：查询选项配置

### 参数说明

| 参数    | 类型   | 必填 | 说明                                                                 |
| ------- | ------ | ---- | -------------------------------------------------------------------- |
| columns | string | 否   | 要检索的列，用逗号分隔。返回时可以使用 customName:aliasName 重命名列 |
| options | object | 否   | 查询选项配置                                                         |

### options 参数说明

| 参数  | 类型    | 必填 | 说明                                                   |
| ----- | ------- | ---- | ------------------------------------------------------ |
| count | string  | 否   | 计数算法，可选值：`"exact"` - 底层执行 `COUNT(*)`      |
| head  | boolean | 否   | 设置为 `true` 时不返回数据，仅在需要计数时有用         |

### 代码示例

#### 查询所有数据

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

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

#### 查询指定列

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

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

### 返回结果

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

## 关联表查询

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

### 基础关联查询

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

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

### 多重关联查询

```javascript
// 查询文章，同时获取创建者和修改者的信息
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);
```

> 💡 注意：当同一个表通过不同的外键关联多次时，需要使用外键约束名来区分不同的关联关系。

### 嵌套关联查询

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

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

## 高级查询

### 条件过滤查询

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

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

### 计数查询

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

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

### 仅获取总数

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

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

### 内连接查询

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

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

> 💡 注意：`!inner` 表示内连接，只返回那些在关联表中存在匹配记录的数据。

## 相关文档

- [过滤器](./filters) - 了解如何使用过滤条件
- [修饰符](./modifiers) - 了解查询修饰符的使用方法