ClickHouse基础知识及与MySQL性能对比( 三 )


File引擎 内部引擎SetSQL操作
基本上来说传统关系型数据库(以MySQL为例)的SQL语句,基本支持但是也有不一样的地方
用于创建指定名称的数据库,语法如下:[IF NOT ]

ClickHouse基础知识及与MySQL性能对比

文章插图
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=TinyLog2)创建一个与其他表具有相同结构的表CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]可以对其指定不同的表引擎声明 。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎 。3)使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它 。CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
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

提供了 和的能力,这类操作被称为查询,它可以看做Alter 的一种 。
虽然可以实现修改和删除,但是和一般的OLTP数据库不一样,语句是一种很“重”的操作,而且不支持事务 。
“重”的原因主要是每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区 。所以尽量做批量的变更,不要进行频繁小数据的操作 。
// 删除操作alter table t_order_smt delete where sku_id ='sku_001';// 修改操作alter table t_order_smt update total_amount=toDecimal32(2000.00,2) where id =102;// 由于操作比较“重”,所以 Mutation语句分两步执行,同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上的失效标记 。知道触发分区合并的时候,才会删除旧数据释放磁盘空间 。
操作
基本上与标准SQL 差别不大 。
支持子查询
支持CTE(with 子句)
支持各种JOIN,但是JOIN操作无法使用缓存,所以即使是两次相同的JOIN语句,也会视为两条新SQL 。
不支持窗口函数 。
不支持自定义函数 。
GROUP BY 操作增加了 with \with cube\with total 用来计算小计和总计 。
create table t_order_mt(id UInt32,sku_id String,total_amount Decimal(16,2),create_timeDatetime) engine = MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert intot_order_mt values(101,'sku_001',1000.00,'2020-08-01 12:00:00’);insert intot_order_mt values(102,'sku_002',2000.00,'2020-08-01 12:00:00');insert intot_order_mt values(103,'sku_004',2500.00,'2020-08-01 12:00:00');insert intot_order_mt values(104,'sku_002',2000.00,'2020-08-01 12:00:00');insert intot_order_mt values(105,'sku_003',600.00,'2020-08-02 12:00:00’);insert intot_order_mt values(105,'sku_004',600.00,'2020-08-02 12:00:00');insert intot_order_mt values(106,'sku_001',1000.00,'2020-08-04 12:00:00');insert intot_order_mt values(107,'sku_002',2000.00,'2020-08-04 12:00:00');insert intot_order_mt values(108,'sku_004',2500.00,'2020-08-04 12:00:00');insert intot_order_mt values(109,'sku_002',2000.00,'2020-08-04 12:00:00');insert intot_order_mt values(110,'sku_003',600.00,'2020-08-01 12:00:00');// with rollup : 从右至左去掉维度进行小计 。select id , sku_id,sum(total_amount) fromt_order_mt group by id,sku_id with rollup;// with cube : 从右至左去掉维度进行小计,再从左至右去掉维度进行小计 。select id , sku_id,sum(total_amount) fromt_order_mt group by id,sku_id with cube;// with totals: 只计算合计 。select id , sku_id,sum(total_amount) fromt_order_mt group by id,sku_id with totals;