> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse 中嵌套数据结构的概述

# Nested

<div id="nestedname1-type1-name2-type2-">
  ## Nested(name1 Type1, Name2 Type2, ...)
</div>

嵌套数据结构就像单元格中的一张表。嵌套数据结构的参数——列名和类型——其指定方式与 [CREATE TABLE](/zh/reference/statements/create/table) 查询中的写法相同。表中的每一行都可以对应嵌套数据结构中的任意多行。

<Tip>
  **避免在列名中使用点号**

  当 `flatten_nested = 1` (默认值) 时，包含点号的列名、具有相同点号前缀的列，以及 `Array` 类型的列，都可能被解释为扁平化 Nested 结构的一部分。这可能导致在插入时出现意外的数组长度校验，以及重命名限制。

  如无必要，请避免在列名中使用点号。
  除非你确实需要 `Nested` 语义，否则请在列名中使用下划线 (`_`) 或其他分隔符来代替点号。
</Tip>

示例：

```sql theme={null}
CREATE TABLE test.visits
(
    CounterID UInt32,
    StartDate Date,
    Sign Int8,
    IsNew UInt8,
    VisitID UInt64,
    UserID UInt64,
    ...
    Goals Nested
    (
        ID UInt32,
        Serial UInt32,
        EventTime DateTime,
        Price Int64,
        OrderID String,
        CurrencyID UInt32
    ),
    ...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
```

此示例声明了 `Goals` 嵌套数据结构，其中包含有关转化 (已达成目标) 的数据。`visits` 表中的每一行都可以对应零个或任意多个转化。

当 [flatten\_nested](/zh/reference/settings/session-settings#flatten_nested) 设置为 `0` 时 (默认并非如此) ，支持任意层级的嵌套。

在大多数情况下，使用嵌套数据结构时，其列通过以点分隔的列名来指定。这些列构成一个类型对应的数组。单个嵌套数据结构中的所有列数组长度都相同。

示例：

```sql theme={null}
SELECT
    Goals.ID,
    Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
```

```text theme={null}
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
│ [1073752,591325,591325]        │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27']                       │
│ [1073752]                      │ ['2014-03-17 00:28:25']                                                                   │
│ [1073752]                      │ ['2014-03-17 10:46:20']                                                                   │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │
│ []                             │ []                                                                                        │
│ [1073752,591325,591325]        │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21']                       │
│ []                             │ []                                                                                        │
│ []                             │ []                                                                                        │
│ [591325,1073752]               │ ['2014-03-17 00:46:05','2014-03-17 00:46:05']                                             │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
```

将嵌套数据结构理解为一组由多个等长列数组组成的集合，是最简单的方式。

在 SELECT 查询中，唯一可以指定整个嵌套数据结构名称而非单独列名的地方是 ARRAY JOIN 子句。更多信息，请参见 "ARRAY JOIN 子句"。示例：

```sql theme={null}
SELECT
    Goal.ID,
    Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
```

```text theme={null}
┌─Goal.ID─┬──────Goal.EventTime─┐
│ 1073752 │ 2014-03-17 16:38:10 │
│  591325 │ 2014-03-17 16:38:48 │
│  591325 │ 2014-03-17 16:42:27 │
│ 1073752 │ 2014-03-17 00:28:25 │
│ 1073752 │ 2014-03-17 10:46:20 │
│ 1073752 │ 2014-03-17 13:59:20 │
│  591325 │ 2014-03-17 22:17:55 │
│  591325 │ 2014-03-17 22:18:07 │
│  591325 │ 2014-03-17 22:18:51 │
│ 1073752 │ 2014-03-17 11:37:06 │
└─────────┴─────────────────────┘
```

你不能对整个嵌套数据结构执行 SELECT。只能显式列出其中的各个列。

对于 INSERT 查询，你应分别传递嵌套数据结构中各个组成列的数组 (就像它们是独立的列数组一样) 。插入时，系统会检查它们的长度是否一致。

对于 DESCRIBE 查询，嵌套数据结构中的列也会以同样的方式分别列出。

对嵌套数据结构中元素执行 ALTER 查询时存在一些限制。
