
# CREATE TABLE创建表
本章节主要介绍ClickHouse创建表的SQL基本语法和使用说明。
#### 基本语法
- 方法一：在指定的"database_name"数据库中创建一个名为"table_name "的表。 如果建表语句中没有包含"database_name"，则默认使用客户端登录时选择的数据库作为数据库名称。
  **CREATE TABLE \[IF NOT EXISTS\]** *\[database_name.\]table_name* **\[ON CLUSTER** *ClickHouse集群名* **\]**
  **(**
  *name1* **\[** *type1* **\] \[DEFAULT\|** **MATERIALIZED** **\|ALIAS** *expr1* **\],**
  *name2* **\[** *type2* **\] \[DEFAULT\|** **MATERIALIZED** **\|ALIAS** *expr2* **\],**
  **...**
  **)** *ENGINE* = *engine* *_name()*
  \[**PARTITION BY** *expr_list*\]
  \[**ORDER BY** *expr_list*\]
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/caution_3.0-zh-cn.png)
  ClickHouse在创建表时建议携带**PARTITION BY** 创建表分区。因为ClickHouse数据迁移工具是基于表的分区做数据迁移，在创建表时如果不携带**PARTITION BY** 创建表分区，则在[集群内ClickHouseServer节点间数据迁移](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24198.html)界面无法对该表进行数据迁移。
  
- 方法二：创建一个与database_name2.table_name2具有相同结构的表，同时可以对其指定不同的表引擎声明。 如果没有表引擎声明，则创建的表将与database_name2.table_name2使用相同的表引擎。
  **CREATE TABLE \[IF NOT EXISTS\]** *\[database_name.\]table_name* **AS** \[*database_name2* .\]*table_name* 2\[ENGINE = *engine* *_name*\]
  
- 方法三：使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表，并使用SELECT子句的结果填充它。 **CREATE TABLE \[IF NOT EXISTS\]** *\[* *database_name* *.\]table_name* *ENGINE* = *engine* *_name* **AS SELECT**...
  
 
#### 使用示例
```
--在default数据库和default_cluster集群下创建名为test表
CREATE TABLE default.test ON CLUSTER default_cluster
(
    `EventDate` DateTime, 
    `id` UInt64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}')
PARTITION BY toYYYYMM(EventDate)
ORDER BY id
```
