SQL語法
CREATE
CREATE DATABASE
用於創建指定名稱的數據庫,語法如下:
CREATE DATABASE [IF NOT EXISTS] db_name
如果查詢中存在IF NOT EXISTS,則當數據庫已經存在時,該查詢不會返回任何錯誤。
:) create database test;
Ok.
0 rows in set. Elapsed: 0.018 sec.
CREATE TABLE
對於創建表,語法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
DEFAULT expr – 默認值,用法與SQL類似。
MATERIALIZED expr – 物化表達式,被該表達式指定的列不能被INSERT,因為它總是被計算出來的。 對於INSERT而言,不需要考慮這些列。 另外,在SELECT查詢中如果包含星號,此列不會被查詢。
ALIAS expr – 別名。
有三種方式創建表:
1)直接創建
:) create table t1(id UInt16,name String) engine=TinyLog
2)創建一個與其他表具有相同結構的表
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
可以對其指定不同的表引擎聲明。如果沒有表引擎聲明,則創建的表將與db2.name2使用相同的表引擎。
:) create table t2 as t1 engine=Memory
:) desc t2
DESCRIBE TABLE t2
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ id │ UInt16 │ │ │
│ name │ String │ │ │
└──────┴────────┴──────────────┴────────────────────┘
3)使用指定的引擎創建一個與SELECT子句的結果具有相同結構的表,並使用SELECT子句的結果填充它。
語法:
CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
實例:
先在t2中插入幾條數據
:) insert into t1 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')
:) create table t3 engine=TinyLog as select * from t1
:) select * from t3
┌─id─┬─name─────┐
│ 1 │ zhangsan │
│ 2 │ lisi │
│ 3 │ wangwu │
└────┴──────────┘
INSERT INTO
主要用於向表中添加數據,基本格式如下:
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
實例:
:) insert into t1 values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')
還可以使用select來寫入數據:
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
實例:
:) insert into t2 select * from t3
:) select * from t2
┌─id─┬─name─────┐
│ 1 │ zhangsan │
│ 2 │ lisi │
│ 3 │ wangwu │
└────┴──────────┘
ClickHouse不支持的修改數據的查詢:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。
ALTER
ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本語法:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...
參數解析:
ADD COLUMN – 向表中添加新列
DROP COLUMN – 在表中刪除列
MODIFY COLUMN – 更改列的類型
案例演示:
1)創建一個MergerTree引擎的表
create table mt_table (date Date, id UInt8, name String) ENGINE=MergeTree(date, (id, name), 8192);
2)向表中插入一些值
insert into mt_table values ('2019-05-01', 1, 'zhangsan');
insert into mt_table values ('2019-06-01', 2, 'lisi');
insert into mt_table values ('2019-05-03', 3, 'wangwu');
3)在末尾添加一個新列age
:)alter table mt_table add column age UInt8
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
│ age │ UInt8 │ │ │
└──────┴────────┴──────────────┴────────────────────┘
:) select * from mt_table
┌───────date─┬─id─┬─name─┬─age─┐
│ 2019-06-01 │ 2 │ lisi │ 0 │
└────────────┴────┴──────┴─────┘
┌───────date─┬─id─┬─name─────┬─age─┐
│ 2019-05-01 │ 1 │ zhangsan │ 0 │
│ 2019-05-03 │ 3 │ wangwu │ 0 │
└────────────┴────┴──────────┴─────┘
4)更改age列的類型
:)alter table mt_table modify column age UInt16
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
│ age │ UInt16 │ │ │
└──────┴────────┴──────────────┴────────────────────┘
5)刪除剛才創建的age列
:)alter table mt_table drop column age
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
└──────┴────────┴──────────────┴────────────────────┘
DESCRIBE TABLE
查看表結構
:)desc mt_table
┌─name─┬─type───┬─default_type─┬─default_expression─┐
│ date │ Date │ │ │
│ id │ UInt8 │ │ │
│ name │ String │ │ │
└──────┴────────┴──────────────┴────────────────────┘
CHECK TABLE
檢查表中的數據是否損壞,他會返回兩種結果:
0 – 數據已損壞
1 – 數據完整
該命令只支持Log,TinyLog和StripeLog引擎。