1.访问接口
ClickHouse 自己的 clickhouse-client
使用的是“原生”的 TCP 连接来完成与服务端的交互,而在应用中用它的话,它有实现一个 HTTP 的访问接口,把 SQL 语句通过 HTTP 发送到服务端,就可以得到响应数据了(其实不用担心效率问题,数仓场景下,这种传输成本相较于大数据量下的聚合计算挑战,直接就忽略吧)。
默认配置下, HTTP 的服务是在 8123 端口上的,直接访问的话,可以得到一个 ok
的响应。(如果要外部访问,记得把配置中的 listen_host
加一个 0.0.0.0
)。
HTTP 服务,查询的话, GET 或 POST 都可以,修改和创建,只能用 POST :
echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | POST 'http://1xx.1x.0.x:8123/'
echo 'insert into t (a) values (10)' | POST 'http://1xx.1x.0.x:8123/'
GET "http://1xx.1x.0.x:8123?query=select * from t"
echo 'drop table t' | POST 'http://1xx.1x.xx.xx:8123/'
访问地址中,可以通过请求参数,或者头,来指定一些环境配置项,比如 database
,用户名密码什么的。
- database ,数据库
- user , 登录用户
- password , 登录密码
- https://clickhouse.yandex/reference_en.html#Settings 其它配置项
username="default"
password=""
ip="172.16.xxx.xx:8123/"
tablename="xxtest"
#create table with crul
#echo 'create table'+ $tablename +'with crul' +$username:$password@$ip/
echo 'CREATE TABLE '$tablename'(dt Date,dp String,id String, name String) ENGINE = Memory' | curl $username:$password@$ip -d @-
用户名和密码,也可以通过 X-ClickHouse-User
和 X-ClickHouse-Key
这两个头来设置与传递。
2. 查询语言
ClickHouse 中有两种类型的解析器, full parser 和 data format parser ,前者是一个完整的 SQL 解析器,后者是一个高性能的流解析器。当语句被发到 ClickHouse 时,默认配置下前 1 MB 字节的数据会使用 full parser 来处理,剩下的数据就交给 data format parser了,所以,像 insert
这类语句,即使整个语句再长,也不会有问题。
语法细节,整体上跟 MySQL 是一样的,当然, ClickHouse 在一些地方有自己特别实现。比如,对于别名 Synonyms , ClickHouse 中的限制就少很多:
select ((select 1) as n), n
2.1. CREATE TABLE
建表语句除了基本形式外,还有两个扩展形式。这是基本形式,如果引擎支持索引的话,索引可以在 ENGINE
的地方额外设置。其中ENGINE字段后面解析
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name
(
name1 [type1] [DEFAULT | MATERIALIZED | ALIAS expr1],
name2 [type2] [DEFAULT | MATERIALIZED | ALIAS expr2],
...
) ENGINE = engine
第一种扩展形式,可以创建一个跟指定表完全一样的表,但是可以更换不同的引擎。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name AS [db2.]name2 [ENGINE = engine]
第二种形式是“建表并填充”,表字段会自动根据
SELECT
的返回内容设置,并且,返回内容会作为新表内容填充进去。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name ENGINE = engine AS SELECT ...
2.2. 默认值
默认值 的处理方面, ClickHouse 中,默认值总是有的,如果没有显示式指定的话,会按字段类型处理:NULLs
是不支持的。
- 数字类型,
0
。 - 字符串,空字符串。
- 数组,空数组。
- 日期,
0000-00-00
。 - 时间,
0000-00-00 00:00:00
。
同时,在字段类型方面,如果没有明确指定字段类型,但是指定了默认值,则默认值表达式的返回值类型,作为字段类型。如果即指定了字段类型,也指定了默认值表达式,那么对开默认值表达式的结果,相当于会有一个类型转换。
2.3. 物化列
指定 MATERIALIZED
表达式,即将一个列作为 物化列 处理了,这意味着这个列的值不能从 insert
语句获取,是自己按照某种表达式计算出来的。同时, 物化列 也不会出现在 select *
的结果中,但是他会被计算并存储在数据库中(物化),其语法如下:
create table t (a MATERIALIZED (b+1), b UInt16) ENGINE = Memory;
insert into t(b) values (1);
select * from t;
select a, b from t;