基本SQL
-- 列出数据库列表
show databases;
-- 列出数据库中表列表
show tables;
-- 创建数据库
create database test;
-- 删除一个表
drop table if exists test.t1;
-- 创建第一个表
create /*temporary*/ table /*if not exists*/ test.m1 (
id UInt16
,name String
) ENGINE = Memory
;
-- 插入测试数据
insert into test.m1 (id, name) values (1, 'abc'), (2, 'bbbb');
-- 查询
select * from test.m1;
默认值处理
默认值 的处理方面, ClickHouse 中,默认值总是有的,如果没有显示式指定的话,会按字段类型处理:
数字类型, 0
字符串,空字符串
数组,空数组
日期, 0000-00-00
时间, 0000-00-00 00:00:00
注:NULLs 是不支持的
数据类型
整型:UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64
范围U开头-2N/2~2N-1;非U开头0~2^N-1
枚举类型:Enum8,Enum16, Enum(‘hello’=1,’test’=-1)
Enum是有符号的整型映射的,因此负数也是可以的
字符串型:FixedString(N),String
N是最大字节数,不是字符长度,如果是UTF8字符串,那么就会占3个字节,GBK会占2字节;String可以用来替换VARCHAR,BLOB,CLOB等数据类型
时间类型:Date
数组类型:Array(T)
T是一个基本类型,包括arry在内,官方不建议使用多维数组
元组:Tuple
结构:Nested(name1 Type1,name2 Type2,…),类似一种map的结
物列化
指定 MATERIALIZED 表达式,即将一个列作为物化列
处理了,这意味着这个列的值不能从insert
语句获取,只能是自己计算出来的。同时,
物化列也不会出现在 select *
的结果中:
drop table if exists test.m2;
create table test.m2 (
a MATERIALIZED (b+1)
,b UInt16
) ENGINE = Memory;
insert into test.m2 (b) values (1);
select * from test.m2;
select a, b from test.m2;
表达式列
ALIAS 表达式列某方面跟物化列相同,就是它的值不能从 insert 语句获取。不同的是, 物化列 是会真正保存数据(这样查询时不需要再计算),
而表达式列不会保存数据(这样查询时总是需要计算),只是在查询时返回表达式的结果。
create table test.m3 (a ALIAS (b+1), b UInt16) ENGINE = Memory;
insert into test.m3(b) values (1);
select * from test.m3;
select a, b from test.m3;