创建表
# CREATE DATABASE [IF NOT EXISTS] database_name;
CREATE DATABASE qx_tj;
创建表
# CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
# (
# name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2],
# ...
# ) ENGINE = MergeTree
CREATE TABLE qx_tj.tb_request_record
(
`id` UInt64 COMMENT '自增ID',
`uid` UInt32 COMMENT '用户ID',
`bid` UInt64 COMMENT '书籍ID',
`chapterno` UInt64 COMMENT '章节排序值',
`client` UInt8 COMMENT '客户端 1 安卓 2 苹果',
`timestamp` DateTime COMMENT '创建时间',
`cdate` Date COMMENT '创建日期'
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(cdate) #
ORDER BY (bid, cdate, uid, chapterno)
SETTINGS index_granularity = 8192;
CREATE TABLE helloworld.my_first_table
(
user_id UInt32,
message String,
timestamp DateTime,
metric Float32
)
ENGINE = MergeTree()
PRIMARY KEY (user_id, timestamp)
- user_id: 32位无符号整数
- message:一个 String数据类型,它取代了其他数据库系统中的VARCHAR、BLOB、CLOB等类型
- timestamp: DateTime值,表示时间中的某个瞬间
- metric: 32位浮点数
表引擎确定:
如何以及在哪里存储数据
支持哪些查询
数据是否被复制
有许多引擎可供选择,但对于单节点ClickHouse服务器上的简单表,MergeTree是您可能的选择。
主键简介
在你进一步深入之前,了解主键在ClickHouse中的工作原理是很重要的(主键的实现似乎出乎意料!):
ClickHouse中的主键不是表中每行唯一的
ClickHouse表的主键决定数据在写入磁盘时如何排序。每8,192行或10MB的数据(称为索引粒度,index granularity)在主键索引文件中创建一个条目。这种粒度概念创建了一个可以轻松放入内存的稀疏索引(sparse index ),粒度(granules )表示SELECT查询期间处理的最少量列数据的条带。
主键可以使用PRIMARY KEY参数定义。如果您定义了一个没有指定PRIMARY KEY的表,那么该键将变成ORDER BY子句中指定的元组。如果同时指定了PRIMARY KEY和ORDER BY,则主键必须是排序顺序的子集。
主键也是排序键,它是一个元组(user_id, timestamp)。因此,存储在每个列文件中的数据将按user_id排序,然后按timestamp排序。
修改表
# 增加表列
# ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after]
alter table qx_tj.tb_request_record add column device String COMMENT '设备号' after ctime;
alter table qx_tj.tb_request_record add column browser String COMMENT '测试字段' ;
# 删除列
# DROP COLUMN [IF EXISTS] name
ALTER TABLE qx_tj.tb_request_record DROP COLUMN client
# 修改列
# MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL]
ALTER TABLE qx_tj.tb_request_record MODIFY COLUMN browser Array(String)
# 增加注释
# COMMENT COLUMN [IF EXISTS] name 'comment'
ALTER TABLE qx_tj.tb_request_record COMMENT COLUMN browser 'Ttest'
查看表结构
desc qx_tj.tb_request_record;
Joining Tables
ClickHouse完全支持连接,支持所有标准的SQL JOIN类型。语法应该看起来很熟悉,你可以在JOIN的docs页面查看所有细节:
# SELECT * FROM qx_tj.tableName JOIN qx_tj.tableB ON qx_tj.tableName.actor_id = qx_tj.tableB.id
select uniqExact(a.bid) as totoal_bid from gonovel.tb_book_tj a inner join gonovel.tb_book b on b.id = a.bid where a.day='2022-01-01'