SQL语法

CREATE
CREATE DATABASE
用于创建指定名称的数据库,语法如下:

  1. CREATE DATABASE [IF NOT EXISTS] db_name

如果查询中存在IF NOT EXISTS,则当数据库已经存在时,该查询不会返回任何错误。

  1. :) create database test;
  2. Ok.
  3. 0 rows in set. Elapsed: 0.018 sec.

CREATE TABLE
对于创建表,语法如下:

  1. CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
  2. (
  3. name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
  4. name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
  5. ...
  6. ) ENGINE = engine
  7. DEFAULT expr 默认值,用法与SQL类似。
  8. MATERIALIZED expr 物化表达式,被该表达式指定的列不能被INSERT,因为它总是被计算出来的。 对于INSERT而言,不需要考虑这些列。 另外,在SELECT查询中如果包含星号,此列不会被查询。
  9. ALIAS expr 别名。

有三种方式创建表:
1)直接创建

  1. :) create table t1(id UInt16,name String) engine=TinyLog

2)创建一个与其他表具有相同结构的表

  1. CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]

可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。

  1. :) create table t2 as t1 engine=Memory
  2. :) desc t2
  3. DESCRIBE TABLE t2
  4. ┌─name─┬─type───┬─default_type─┬─default_expression─┐
  5. id UInt16
  6. name String
  7. └──────┴────────┴──────────────┴────────────────────┘

3)使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。
语法:

  1. CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...

实例:
先在t2中插入几条数据

  1. :) insert into t1 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')
  2. :) create table t3 engine=TinyLog as select * from t1
  3. :) select * from t3
  4. ┌─id─┬─name─────┐
  5. 1 zhangsan
  6. 2 lisi
  7. 3 wangwu
  8. └────┴──────────┘

INSERT INTO
主要用于向表中添加数据,基本格式如下:

  1. INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

实例:

  1. :) insert into t1 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')

还可以使用select来写入数据:

  1. INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
  2. 实例:
  3. :) insert into t2 select * from t3
  4. :) select * from t2
  5. ┌─id─┬─name─────┐
  6. 1 zhangsan
  7. 2 lisi
  8. 3 wangwu
  9. └────┴──────────┘

ClickHouse不支持的修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。
ALTER
ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法:

  1. ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

参数解析:

  1. ADD COLUMN 向表中添加新列
  2. DROP COLUMN 在表中删除列
  3. MODIFY COLUMN 更改列的类型

案例演示:
1)创建一个MergerTree引擎的表

  1. create table mt_table (date Date, id UInt8, name String) ENGINE=MergeTree(date, (id, name), 8192);

2)向表中插入一些值

  1. insert into mt_table values ('2019-05-01', 1, 'zhangsan');
  2. insert into mt_table values ('2019-06-01', 2, 'lisi');
  3. insert into mt_table values ('2019-05-03', 3, 'wangwu');

3)在末尾添加一个新列age

  1. :)alter table mt_table add column age UInt8
  2. :)desc mt_table
  3. ┌─name─┬─type───┬─default_type─┬─default_expression─┐
  4. date Date
  5. id UInt8
  6. name String
  7. age UInt8
  8. └──────┴────────┴──────────────┴────────────────────┘
  9. :) select * from mt_table
  10. ┌───────date─┬─id─┬─name─┬─age─┐
  11. 2019-06-01 2 lisi 0
  12. └────────────┴────┴──────┴─────┘
  13. ┌───────date─┬─id─┬─name─────┬─age─┐
  14. 2019-05-01 1 zhangsan 0
  15. 2019-05-03 3 wangwu 0
  16. └────────────┴────┴──────────┴─────┘

4)更改age列的类型

  1. :)alter table mt_table modify column age UInt16
  2. :)desc mt_table
  3. ┌─name─┬─type───┬─default_type─┬─default_expression─┐
  4. date Date
  5. id UInt8
  6. name String
  7. age UInt16
  8. └──────┴────────┴──────────────┴────────────────────┘

5)删除刚才创建的age列

  1. :)alter table mt_table drop column age
  2. :)desc mt_table
  3. ┌─name─┬─type───┬─default_type─┬─default_expression─┐
  4. date Date
  5. id UInt8
  6. name String
  7. └──────┴────────┴──────────────┴────────────────────┘

DESCRIBE TABLE
查看表结构

  1. :)desc mt_table
  2. ┌─name─┬─type───┬─default_type─┬─default_expression─┐
  3. date Date
  4. id UInt8
  5. name String
  6. └──────┴────────┴──────────────┴────────────────────┘

CHECK TABLE
检查表中的数据是否损坏,他会返回两种结果:
0 – 数据已损坏
1 – 数据完整
该命令只支持Log,TinyLog和StripeLog引擎。