clickhouse查询语法--with

with

clickhouse支持CTE(Common Table Expression,公共表达式),以增强查询语句的表达

select pow(2,3);     //pow是计算次方值函数
┌─pow(2, 3)─┐
│         8 │
└───────────┘

select pow(pow(2,2),2);
┌─pow(pow(2, 2), 2)─┐
│                16 │
└───────────────────┘

改用CTE的形式后,可以极大地提高语句的可读性和可维护性。

with pow(2,2) as res select pow(res,2);
┌─pow(res, 2)─┐
│          16 │
└─────────────┘

1)定义变量

with 1 as num select num+1;
┌─plus(num, 1)─┐
│            2 │
└──────────────┘

select * from  test_str;
┌─name─┬─job─┐
│ cxy  │ it  │
└──────┴─────┘
┌─name─────┬─job─┐
│ zhangsan │ DBA │
└──────────┴─────┘

with 'cxy' as n select * from test_str where name=n;
┌─name─┬─job─┐
│ cxy  │ it  │
└──────┴─────┘

with 'cxy' as a,'zhangsan' as b select * from test_str where name=a or name=b;
┌─name─┬─job─┐
│ cxy  │ it  │
└──────┴─────┘
┌─name─────┬─job─┐
│ zhangsan │ DBA │
└──────────┴─────┘

2)调用函数

select toYear(now());
┌─toYear(now())─┐
│          2021 │
└───────────────┘

with toYear(now()) as year select year;
┌─year─┐
│ 2021 │
└──────┘

3)子查询

可以定义子查询,但是一定还要注意的是,子查询只能返回一行结果,否则会输出异常,子查询返回的是元组类型的结果

with 
(select * from tb_merge_tree where uid=1) 
as res select res from tb_merge_tree;   //报错,因为子查询返回多行结果

with
(select * from tb_merge_tree_partition where uid=1) 
as res select uid,name,res from tb_merge_tree_partition;
┌─uid─┬─name─┬─res────────────────────────────┐
│   3 │ ww   │ (1,'zs','2020-09-27 10:00:00') │
│   4 │ zl   │ (1,'zs','2020-09-27 10:00:00') │
│  13 │ www  │ (1,'zs','2020-09-27 10:00:00') │
│  14 │ zll  │ (1,'zs','2020-09-27 10:00:00') │
└─────┴──────┴────────────────────────────────┘
┌─uid─┬─name─┬─res────────────────────────────┐
│   1 │ zs   │ (1,'zs','2020-09-27 10:00:00') │
│   2 │ ls   │ (1,'zs','2020-09-27 10:00:00') │
│  11 │ zss  │ (1,'zs','2020-09-27 10:00:00') │
│  12 │ lss  │ (1,'zs','2020-09-27 10:00:00') │
└─────┴──────┴────────────────────────────────┘

4)with模型

create table tb_with(
id UInt8,
visit UInt8,
province String,
city String,
area String
)engine=MergeTree()
order by id;

insert into tb_with values(1,12,'山东','济南','历下');
insert into tb_with values(2,12,'山东','济南','历下');
insert into tb_with values(3,12,'山东','济南','天桥');
insert into tb_with values(4,12,'山东','济南','天桥');
insert into tb_with values(5,88,'山东','青岛','黄岛');
insert into tb_with values(6,88,'山东','青岛','黄岛');
insert into tb_with values(7,12,'山西','太原','小店');
insert into tb_with values(8,12,'山西','太原','小店');
insert into tb_with values(9,112,'山西','太原','尖草坪');

select * from tb_with;
┌─id─┬─visit─┬─province─┬─city─┬─area───┐
│  112 │ 山东     │ 济南 │ 历下    │
│  212 │ 山东     │ 济南 │ 历下    │
│  312 │ 山东     │ 济南 │ 天桥    │
│  412 │ 山东     │ 济南 │ 天桥    │
│  588 │ 山东     │ 青岛 │ 黄岛    │
│  688 │ 山东     │ 青岛 │ 黄岛    │
│  712 │ 山西     │ 太原 │ 小店    │
│  812 │ 山西     │ 太原 │ 小店    │
│  9112 │ 山西     │ 太原 │ 尖草坪  │
└────┴───────┴──────────┴──────┴────────┘

select province,city,area,sum(visit) from tb_with group by province,city,area;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东     │ 青岛 │ 黄岛   │        176  │
│ 山东     │ 济南 │ 天桥   │         24  │
│ 山西     │ 太原 │ 尖草坪 │        112  │
│ 山东     │ 济南 │ 历下   │         24  │
│ 山西     │ 太原 │ 小店   │         24  │
└──────────┴──────┴────────┴────────────┘

select province,city,area,sum(visit) from tb_with group by province,city,area with CUBE;   ┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东     │ 青岛 │ 黄岛   │        176 │
│ 山东     │ 济南 │ 天桥   │         24 │
│ 山西     │ 太原 │ 尖草坪 │        112 │
│ 山东     │ 济南 │ 历下   │         24 │
│ 山西     │ 太原 │ 小店   │         24 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山东     │ 青岛 │      │        176 │
│ 山东     │ 济南 │      │         48 │
│ 山西     │ 太原 │      │        136 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东     │      │ 历下   │         24 │
│ 山东     │      │ 天桥   │         24 │
│ 山西     │      │ 尖草坪 │        112 │
│ 山西     │      │ 小店   │         24 │
│ 山东     │      │ 黄岛   │        176 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山西     │      │      │        136 │
│ 山东     │      │      │        224 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│          │ 济南 │ 历下   │         24 │
│          │ 济南 │ 天桥   │         24 │
│          │ 太原 │ 尖草坪 │        112 │
│          │ 青岛 │ 黄岛   │        176 │
│          │ 太原 │ 小店   │         24 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│          │ 青岛 │      │        176 │
│          │ 济南 │      │         48 │
│          │ 太原 │      │        136 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│          │      │ 天桥   │         24 │
│          │      │ 小店   │         24 │
│          │      │ 黄岛   │        176 │
│          │      │ 历下   │         24 │
│          │      │ 尖草坪 │        112 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│          │      │      │        360 │
└──────────┴──────┴──────┴────────────┘



select province,city,area,sum(visit) from tb_with group by province,city,area with rollup;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东     │ 青岛 │ 黄岛   │        176 │
│ 山东     │ 济南 │ 天桥   │         24 │
│ 山西     │ 太原 │ 尖草坪 │        112 │
│ 山东     │ 济南 │ 历下   │         24 │
│ 山西     │ 太原 │ 小店   │         24 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山东     │ 青岛 │      │        176 │
│ 山东     │ 济南 │      │         48 │
│ 山西     │ 太原 │      │        136 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山西     │      │      │        136 │
│ 山东     │      │      │        224 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│          │      │      │        360 │
└──────────┴──────┴──────┴────────────┘


select province,city,area,sum(visit) from tb_with group by province,city,area with totals;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东     │ 青岛 │ 黄岛   │        176 │
│ 山东     │ 济南 │ 天桥   │         24 │
│ 山西     │ 太原 │ 尖草坪 │        112 │
│ 山东     │ 济南 │ 历下   │         24 │
│ 山西     │ 太原 │ 小店   │         24 │
└──────────┴──────┴────────┴────────────┘
Totals:
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│          │      │      │        360 │
└──────────┴──────┴──────┴────────────┘
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值