
# CREATE MATERIALIZED VIEW
本章节介绍如何在ClickHouse中创建物化视图。
#### 创建物化视图
```
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]Materialized_name [TO[db.]name] [ON CLUSTER default_cluster] 
ENGINE = engine_name()
ORDER BY expr 
[POPULATE] 
AS SELECT ...
```
表1参数说明 
| 参数                             | 说明                                                                                                                                                                                                                                          |
|:---|:---|
| db                             | 数据库的名称，默认为当前选择的数据库。                                                                                                                                                                                                                         |
| Materialized_name              | 物化视图名。                                                                                                                                                                                                                                      |
| TO\[db.\]name                  | 将物化视图的数据写入到新表中。                                                                                                                                                                                                                             |
| \[ON CLUSTER default_cluster\] | 在每一个节点上都创建一个物化视图，固定为ON CLUSTER default_cluster。                                                                                                                                                                                             |
| ENGINE = engine_name()         | 表引擎类型。                                                                                                                                                                                                                                      |
| \[POPULATE\]                   | POPULATE关键字。如果创建物化视图时指定了POPULATE关键字，则在创建时将SELECT子句所指定的源表数据插入到物化视图中。不指定POPULATE关键字时，物化视图只会包含在物化视图创建后新写入源表的数据。 说明： 一般不推荐使用POPULATE关键字，因为在物化视图创建期间写入源表的数据将不会写入物化视图中。 |
| SELECT ...                     | SELECT子句。当数据写入物化视图中SELECT子句所指定的源表时，插入的数据会通过SELECT子句查询进行转换并将最终结果插入到物化视图中。 说明： SELECT查询可以包含DISTINCT、GROUP BY、ORDER BY和LIMIT等，但是相应的转换是在每个插入数据块上独立执行的。                  |
   
示例：
1. 创建源表。
   ```
   create table DB.table1 ON CLUSTER default_cluster (id Int16,name String) ENGINE = MergeTree() ORDER BY (id);
   ```
   
2. 插入数据。
   ```
   insert into DB.table1 values(1,'X'),(2,'Y'),(3,'Z');
   ```
   
3. 创建基于源表的物化视图。
   ```
   CREATE MATERIALIZED VIEW demo_view ON CLUSTER default_cluster ENGINE = MergeTree() ORDER BY (id) AS SELECT * FROM DB.table1;
   ```
   
4. 查询物化视图。
   ```
   SELECT * FROM demo_view;
   ```
   ![](https://support.huaweicloud.com/usermanual-cloudtable/public_sys-resources/note_3.0-zh-cn.png)
   查询数据为空，说明未指定POPULATE关键字时，查询不到物化视图创建前写入源表的数据。
   
5. DB.table1表中插入数据。
   ```
   insert into demo_view values(4,'x'),(5,'y'),(6,'z');
   ```
   
6. 查询物化视图。
   ```
   SELECT * FROM demo_view;
   ```
   查询结果。
   ```
   ┌─id─┬─name─┐
   │  4 │ x    │
   │  5 │ y    │
   │  6 │ z    │
   └────┴──────┘
   ```
   
 
