当前位置:   article > 正文

ClickHouse学习笔记之SQL语句_clickhouse sql

clickhouse sql

简介

ClickHouse支持传统的MySQL中的结构化查询语言SQL,因此此处不会从头学SQL,而是记录ClickHouse中对SQL扩展的新特性。

Insert

基本和MySQL一致:

insert into table_name values(...), (...);
insert into table_name select a, b, c from table2_name;
  • 1
  • 2

Update和Delete

ClickHouse将UpdateDelete合称为Mutation查询,是Alter的一种。ClickHouse中的Mutation会导致放弃目标数据原有的分区,并重建分区,因此尽量做批量的变更,不要频繁进行小数据的更删,而且Mutation查询不支持事务。
Mutation语句分两步执行,同步执行的部分是第一步:新增数据或分区,并把旧分区打上失效标记;第二步是合并分区时,删除被标记的旧数据释放磁盘空间。

删除

alter table t_order_smt delete where sku_id = 'sku_001';
  • 1

修改

alter table t_order_smt update total_amount = toDecimal32(2000.00, 2) where id = 102;
  • 1

查询

跟MySQL差别不大:支持子查询、支持CTE(Common Table Expression,公用表语句)、支持Join、窗口函数(官方正在测试)、不支持自定义函数、group by增加了with rollup/with cube/with total以支持计算小计和总计。
ClickHouse中的Join不会使用缓存,因此即使是两条相同的Join语句,ClickHouse也会视为两条新的SQL。

下面对支持小计和总计的语句进行测试

插入数据

scentos :) alter table t_order_mt delete where 1=1;

ALTER TABLE t_order_mt
    DELETE WHERE 1 = 1

Query id: ee8fdaf7-13b1-4591-92ca-d5b8c39a9072

Ok.

0 rows in set. Elapsed: 0.003 sec.

scentos :) insert into t_order_mt values
:-] (101,'sku_001',1000.00,'2020-06-01 12:00:00'),
:-] (101,'sku_002',2000.00,'2020-06-01 12:00:00'),
:-] (103,'sku_004',2500.00,'2020-06-01 12:00:00'),
:-] (104,'sku_002',2000.00,'2020-06-01 12:00:00'),
:-] (105,'sku_003',600.00,'2020-06-02 12:00:00'),
:-] (106,'sku_001',1000.00,'2020-06-04 12:00:00'),
:-] (107,'sku_002',2000.00,'2020-06-04 12:00:00'),
:-] (108,'sku_004',2500.00,'2020-06-04 12:00:00'),
:-] (109,'sku_002',2000.00,'2020-06-04 12:00:00'),
:-] (110,'sku_003',600.00,'2020-06-01 12:00:00');

INSERT INTO t_order_mt FORMAT Values

Query id: 544f51e2-1437-495e-8dbd-46ce298d2c43

Ok.

10 rows in set. Elapsed: 0.004 sec.

scentos :)

with rollup:

scentos :)  select id , sku_id,sum(total_amount) from t_order_mt group by
           id,sku_id with rollup;

SELECT
    id,
    sku_id,
    sum(total_amount)
FROM t_order_mt
GROUP BY
    id,
    sku_id
    WITH ROLLUP

Query id: 8b99ff06-e5b5-4e8b-bbab-1bc4bc6d18f3

┌──id─┬─sku_id──┬─sum(total_amount)─┐
│ 110 │ sku_003 │               600 │
│ 109 │ sku_002 │              2000 │
│ 107 │ sku_002 │              2000 │
│ 106 │ sku_001 │              1000 │
│ 104 │ sku_002 │              2000 │
│ 101 │ sku_002 │              2000 │
│ 103 │ sku_004 │              2500 │
│ 108 │ sku_004 │              2500 │
│ 105 │ sku_003 │               600 │
│ 101 │ sku_001 │              1000 │
└─────┴─────────┴───────────────────┘
┌──id─┬─sku_id─┬─sum(total_amount)─┐
│ 110 │        │               600 │
│ 106 │        │              1000 │
│ 105 │        │               600 │
│ 109 │        │              2000 │
│ 107 │        │              2000 │
│ 104 │        │              2000 │
│ 103 │        │              2500 │
│ 108 │        │              2500 │
│ 101 │        │              3000 │
└─────┴────────┴───────────────────┘
┌─id─┬─sku_id─┬─sum(total_amount)─┐
│  0 │        │             16200 │
└────┴────────┴───────────────────┘
20 rows in set. Elapsed: 0.003 sec.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

计算group by子句中从左往右的每个组合的小计,此处group by id, skull_id,那么会计算每个(id, skull_id)的小计、每个id的小计和合计

with cube

scentos :)  select id , sku_id,sum(total_amount) from t_order_mt group by
           id,sku_id with cube;

SELECT
    id,
    sku_id,
    sum(total_amount)
FROM t_order_mt
GROUP BY
    id,
    sku_id
    WITH CUBE

Query id: 6c515fc3-0002-4d32-a99f-e569e0749a31

┌──id─┬─sku_id──┬─sum(total_amount)─┐
│ 110 │ sku_003 │               600 │
│ 109 │ sku_002 │              2000 │
│ 107 │ sku_002 │              2000 │
│ 106 │ sku_001 │              1000 │
│ 104 │ sku_002 │              2000 │
│ 101 │ sku_002 │              2000 │
│ 103 │ sku_004 │              2500 │
│ 108 │ sku_004 │              2500 │
│ 105 │ sku_003 │               600 │
│ 101 │ sku_001 │              1000 │
└─────┴─────────┴───────────────────┘
┌──id─┬─sku_id─┬─sum(total_amount)─┐
│ 110 │        │               600 │
│ 106 │        │              1000 │
│ 105 │        │               600 │
│ 109 │        │              2000 │
│ 107 │        │              2000 │
│ 104 │        │              2000 │
│ 103 │        │              2500 │
│ 108 │        │              2500 │
│ 101 │        │              3000 │
└─────┴────────┴───────────────────┘
┌─id─┬─sku_id──┬─sum(total_amount)─┐
│  0 │ sku_003 │              1200 │
│  0 │ sku_004 │              5000 │
│  0 │ sku_001 │              2000 │
│  0 │ sku_002 │              8000 │
└────┴─────────┴───────────────────┘
┌─id─┬─sku_id─┬─sum(total_amount)─┐
│  0 │        │             16200 │
└────┴────────┴───────────────────┘

24 rows in set. Elapsed: 0.004 sec.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

计算group by子句中所有组合的小计,此处group by id, skull_id,那么会计算每个(id, skull_id)的小计、每个id的小计、每个skull_id的小计和合计。

with totals

scentos :)  select id , sku_id,sum(total_amount) from t_order_mt group by
           id,sku_id with totals;

SELECT
    id,
    sku_id,
    sum(total_amount)
FROM t_order_mt
GROUP BY
    id,
    sku_id
    WITH TOTALS

Query id: 74a55dba-83d1-4365-9cf4-961cf5685a2e

┌──id─┬─sku_id──┬─sum(total_amount)─┐
│ 110 │ sku_003 │               600 │
│ 109 │ sku_002 │              2000 │
│ 107 │ sku_002 │              2000 │
│ 106 │ sku_001 │              1000 │
│ 104 │ sku_002 │              2000 │
│ 101 │ sku_002 │              2000 │
│ 103 │ sku_004 │              2500 │
│ 108 │ sku_004 │              2500 │
│ 105 │ sku_003 │               600 │
│ 101 │ sku_001 │              1000 │
└─────┴─────────┴───────────────────┘

Totals:
┌─id─┬─sku_id─┬─sum(total_amount)─┐
│  0 │        │             16200 │
└────┴────────┴───────────────────┘

10 rows in set. Elapsed: 0.004 sec.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

计算group by子句中的小计和合计,此处group by id, skull_id,那么会计算每个(id, skull_id)的小计和合计。

alter操作

基本和MySQL一致。

新增字段:

alter table table_name add column col_name String after old_col1;
  • 1

修改字段类型:

alter table table_name modify column col_name String;
  • 1

修改字段名:

rename column old_name to new_name;
  • 1

删除字段

alter table table_name drop column col_name;
  • 1

导出数据

[szc@scentos ~]$ clickhouse-client --query "select * from t_order_mt" --format CSVWithNames > ./clickhouse_result1.csv
[szc@scentos ~]$ cat ./clickhouse_result1.csv
"id","sku_id","total_amount","create_time"
106,"sku_001",1000,"2020-06-04 12:00:00"
107,"sku_002",2000,"2020-06-04 12:00:00"
108,"sku_004",2500,"2020-06-04 12:00:00"
109,"sku_002",2000,"2020-06-04 12:00:00"
101,"sku_001",1000,"2020-06-01 12:00:00"
101,"sku_002",2000,"2020-06-01 12:00:00"
103,"sku_004",2500,"2020-06-01 12:00:00"
104,"sku_002",2000,"2020-06-01 12:00:00"
110,"sku_003",600,"2020-06-01 12:00:00"
105,"sku_003",600,"2020-06-02 12:00:00"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

更多格式参考官网

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/559693
推荐阅读
相关标签
  

闽ICP备14008679号