ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Clickhouse基本语法

2026/8/16 17:40:56 拓冰建站 浏览量
Clickhouse基本语法 1、建库CREATE DATABASE [IF NOT EXISTS] db_name [ENGINEengine];数据库目前一共支持5种引擎Ordinary: 默认引擎在此数据库里可以使用任意类型的表引擎。Dictionary: 字典引擎此类数据库会自动为所有数据字典创建他们的数据表。Memory: 内存引擎此类数据库里的表只会停留在内存中不涉及磁盘操作服务重启数据会被清除。Lazy日志引擎此类数据库里的表只能使用Log系列的表引擎。MySQL: MySQL引擎此类数据库会自动拉取MySQL中的表并为他们创建MySQL表引擎的数据表create database if not exists testDb engineOrdinary;2、表常规定义方法CREATE TABLE [IF NOT EXISTS] [db_name].tb_name ( name1 [type] [Default|Materialized|Alias expr], name2 [type] [Default|Materialized|Alias expr], .... ) ENGINEengine复制其他表结构这种方式支持在不同数据库之间复制表结构CREATE TABLE [IF NOT EXISTS] [db_name2].tb_name2 AS [db_name1].tb_name1 ENGINEengine通过SELECT子句形式创建CREATE TABLE [IF NOT EXISTS] [db_name].tb_name ENGINEengine AS SELECT...其他DROP TABL [IF EXISTS] [db_name].tb_name; SHOW CREATE TABLE tb_name; DESCRIBE TABLE tb_name; DESC tb_name;默认值表达式表字段支持三种默认值表达式定义方法DEFAULT、MATERIALIZED、ALIAS无论哪种表达式表字段一旦被定义默认值它便不再强制要求定义数据类型因为clickhouse会根据默认值进行类型判断。如果同时定义了表字段的类型和默认值表达式则以明确定义的数据类型为主create table test( a UInt16, b default 123, c String default b )engineTinyLog; insert into test(a) values(1); insert into test(a,c) values(2,111); select a,b,c,toTypeName(b),toTypeName(c) from test;b字段没有定义数据类型默认值是整形123c字段定义数据类型且默认值等于b字段三种默认值表达式的区别数据写入时只有DEFAULT类型的字段可以出现在INSERT语句中而MATERIALIZED和ALIAS都不能显示赋值只能依靠计算取值。数据查询时只有DEFAULT类型的字段可以通过SELECT * 返回而MATERIALIZED和ALIAS类型的字段不会出现在SELECT * 的结果集中。数据存储时只有DEFAULT和MATERIALIZED类型的字段才支持持久化而ALIAS类型的字段不支持它的取值总是依靠计算产生表的基本操作只有Merge、MergeTree和Distributed三类表引擎支持ALTER操作//添加字段 ALTER TABLE tb_name ADD COLUMN [IF NOT EXISTS] name [TYPE] [DEFAULT_EXPR] [AFTER name_after]; //修改数据类型 ALTER TABLE tb_name MODIFY COLUMN [IF EXISTS] name [TYPE] [DEFAULT_EXPR]; //修改备注 ALTER TABLE tb_name COMMENT COLUMN [IF EXISTS] name **** //删除字段 ALTER TABLE tb_name DROP COLUMN [IF EXISTS] name //移动表:RENAME TABLE 只能在同一个服务节点内 RENAME TABLE [db_name01.]tb_name01 TO [db_name02.]tb_name02, [db_name11.]tb_name11 TO [db_name12.]tb_name12, ... //清空表 TRUNCATE TABLE [IF EXISTS] [db_name.]tb_name;分区表只有MergeTree家族的表引擎才支持表分区使用PARTITION BY 指定分区键create table if not exists test1( id UInt8, message String, etime Date )engineMergeTree partition by toYYYYMM(etime) order by id数据INSERT INTO test1(id, message, etime) VALUES(1,A,2021-02-24),(2,B,2021-02-24),(3,C,2021-01-23),(4,D,2021-01-23);select * from test1通过system.parts系统表查看表分区的状态select table,partition,path from system.parts where database testDb and tabletest1删除指定分区ALTER TABLE tb_name DROP PARTITION partition_expr;复制分区数据ALTER TABLE tb_name1 REPLACE PARTITION partition_expr FROM tb_name2;clickhouse支持将A表分区的数据复制到B表。可以相互复制的表需要满足两张表需要有相同的分区键表结构完全相同重置分区数据ALTER TABLE tb_name CLEAR COLUMN column_naem IN PARTITION partition_expr; //卸载分区 ALTER TABLE tb_name DETACH PARTITION partition_expr; //装载分区 ALTER TABLE tb_name ATTACH PARTITION partition_expr;分区被卸载后物理目录并没有被删除而是转移到当前数据目录的detached子目录下。而装载分区则是反向操作。一旦分区被转移到detached子目录就代表其脱离clickhouse的管理clickhouse并不会主动清理这些文件除非我们手动删除或者重新装载数据的删除与修改Clickhouse提供了DELETE和UPDATE的能力这类操作被称为Mutation查询它可以看做是ALTER语句的变种。Mutation虽然能实现DELETE和UPDATE但不能用通常意义上的DELTE和UPDATE来理解Mutation是种很重的操作更适用于批量数据的删除修改其次不支持事物语句一旦被提交就立刻对现有数据产生影响无法回滚最后Mutation是一个异步执行的过程语句提交就立即返回。// ALTER TABLE [db_name.]tb_name DELETE WHERE fileter_expr; //UPDATE支持在一条语句中同时修改多个字段但分区键和主键不能作为被修改的字段 ALTER TABLE [db_name.]tb_name UPDATE column1 expr1, column2 expr2, ... WHERE fileter_expr;