我们知道在clickhouse里面可以直接执行sql。所以对于查询语句来说,可以直接使用sql92标准的sql都是兼容的。但是在clickhouse里面还有一些亮点的地方,我们在接下来的文章中进行演示。
本文我们介绍第一个亮点就是:with
这里的with我们可以看做是宏,也就是在查询之前先定义这个宏,然后在查询的时候使用这个宏就可以了。使用with的标准语法是:
with xxx as ${macro}
下面我们演示一下。
1)定义常量
在宏操作里面,我们可以直接把宏定义为一个常量,所以这里的话我们来演示一下:
with 1 as uid select * from test.users1_route where id > uid
这里我们把1定义为一个名称为uid的宏,在查询的时候,我们在where条件里面带有这个uid的宏,看看结果:
2)定义函数
定义函数就是把宏定义成一个可执行的函数,例如我们把每个人的年龄减1,示例如下:
with age - 1 as newage select id,name,newage from test.users1_route;
3)定义子查询
这里还可以把宏定义成一个查询sql,作为子查询供普通查询使用。示例如下:
with (select id from test.users1_route where age < 16) AS ids select * from test.users1_route where id GLOBAL in ids;
效果如下:
备注:
1、这里如果是定义查询语句为宏的话,则需要使用()括起来。 2、如果涉及到路由表,那么需要在主表的where条件字段里面使用gloable关键字。
4)在子查询中使用宏
前面我们都是在查询语句之前定义宏,这里的话,我们可以在查询语句的子语句里面使用宏,例如:
with (age -1) AS newage select id,name,newage from (with 1 AS uid select * from test.users1_route where id > uid)
看看效果:
可以看到在子查询里面使用了宏,但是这种只能是子集表的形式,所以用的时候稍微注意下。
还没有评论,来说两句吧...