TDengine常用操作
本章介绍TDengine的常用操作,包括创建数据库、表、超级表、查询等操作。
注意: TDengine SQL 语句的最大长度为 1M。TDengine SQL 不支持关键字的缩写,例如 DELETE 不能缩写为 DEL。
1. 数据库
数据库常用操作
注意: 建库时可能会出现DB error: Vnodes exhausted
错误,该提示是创建 db 的 vnode 数量不够了,需要的 vnode 不能超过了 dnode 中 vnode 的上限。因为系统默认是一个 dnode 中有 CPU 核数两倍的 vnode,也可以通过配置文件中的参数 supportVnodes 控制。 正常调大 taos.cfg 中 supportVnodes 参数即可
-- 语法:CREATE DATABASE [IF NOT EXISTS] db_name [database_options]
-- database_options:参考官网
CREATE DATABASE IF NOT EXISTS demo;
# 使用数据库
use demo;
# 查看系统中所有数据库
show databases;
# 显示数据库的创建语句
show create database demo \G;
# 查看数据库参数
select * from information_schema.ins_databases where name='demo' \G;
# 删除数据库
drop database if exists demo;
2. 表
# 创建普通表
create table demo.t_water (ts timestamp,ph float,ns float,sd float,name nchar(20)) comment "表注释";
# 增加列
alter table demo.t_water add column temp float;
# 删除列
alter table demo.t_water drop column temp;
# 修改列宽
alter table demo.t_water modify column norm_name nchar(30);
# 修改列名
alter table demo.t_water rename column norm_name name;
# 删除表
drop table demo.t_water;
# 显示所有表
use demo;
show tables;
# 显示创建表语句
show create table demo.t_water \G;
# 获取表结构信息
describe demo.t_water;
3. 超级表
超级表的概念请参考之前文章。
- 超级表中列的最大个数为 4096,需要注意,这里的 4096 是包含 TAG 列在内的,最小个数为 3,包含一个时间戳主键、一个 TAG 列和一个数据列。
- TAGS语法指定超级表的标签列,标签列需要遵循以下约定:
- TAGS 中的 TIMESTAMP 列写入数据时需要提供给定值,而暂不支持四则运算,例如 NOW + 10s 这类表达式。
- TAGS 列名不能与其他列名相同。
- TAGS 列名不能为预留关键字。
- TAGS 最多允许 128 个,至少 1 个,总长度不超过 16 KB。
- 关于表参数的详细说明,参见官网 CREATE TABLE 中的介绍。
创建超级表
创建一个饮用水的超级表,列有ts:时间戳,ph:PH值,sd:色度值。和普通的建表方式差不多,唯一的区别是tags
标签。
tags
代表创建一个超级表,且带有标签location
和groupid
。
create table demo.s_water (ts timestamp, ph float,sd float) tags(location nchar(60),groupid int);
查看超级表
# 查看数据库内全部超级表。
show stables;
# 显示一个超级表的创建语句
show create stable s_water \G;
# 获取超级表的结构信息,包含列和标签
describe s_water;
# 获取超级表中所有子表的标签信息
show table tags from s_water;
# 获取某个子表的标签信息
show table tags from t1;
删除超级表
drop stable s_water;
删除超级表时会自动删除超级表内所有的子表和子表中的数据。
修改超级表
s_water
是超级表的名称。
# 增加列
alter stable s_water add column name nchar(30);
# 修改列宽
alter stable s_water modify column name nchar(50);
# 删除列
alter stable s_water drop column name;
# 添加标签
alter stable s_water add tag device_name nchar(60);
# 修改标签名
alter stable s_water rename tag device_name name;
# 修改标签列宽度
alter stable s_water modify tag name nchar(80);
# 删除标签
alter stable s_water drop tag name;
创建子表
# 创建子表,并且指定标签值
create table t1 using s_water tags('北京昌平',1) ;
create table t2 using s_water tags('北京朝阳',1) ;
# 修改子表标签值
alter table t1 set tag location='北京丰台';
4. 数据写入
普通表
使用多行插入时,要注意时间戳不能一致,因为时间戳是主键,若同一时间插入两条数据,最终只会有一条插入成功。
# 普通表单行插入数据
insert into t_water values ('2023-12-27 11:50:50.235',13.5,23.3,122.2,'xxx');
# 普通表多行插入
insert into t_water values ('2023-12-26 11:50:50.235',12.5,38,126.4,'aaa') (now,16.5,48,127.4,'bbb');
插入时建表
如果用户在写数据时并不确定某个表是否存在,此时可以在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。自动建表时,要求必须以超级表为模板,并写明数据表的 TAGS 取值。
insert into t3 using s_water tags('北京海淀',2) values(now,35.6,12.5);
子表
insert into t1 values(now,10.2,32.2);
insert into t1 values(now,15,69.2);
insert into t2 values(now,13.5,26.5);
insert into t2 values(now,15.6,30.5);
5. 数据查询
列表
查询超级表中的所有子表数据,报班标签信息,如果是子表,则只查询数据
select * from s_water;
# 统计表/超级表中某列的值最先写入的非 NULL 值。
select first(*) from s_water;
# 统计表/超级表中某列的值最后写入的非 NULL 值。
select last(*) from s_water;
# 返回表/超级表的最后一条记录。
select last_row(*) from s_water;
DISTINCT去重
DISTINCT
关键字可以对结果集中的一列或多列进行去重,去除的列既可以是标签列也可以是数据列。
select distinct location from s_water;
标签列查询
当查询的列只有标签列时,TAGS
关键字可以指定返回所有子表的标签列(类似于去重
)。每个子表只返回一行标签列。
select tags location from s_water;
别名
可使用AS
来重命名返回结果集合中列的名称,如果不写AS
,则用默认的字段名称。
select ts,ts AS primary_key from s_water;
伪列
TBNAME
可以视为超级表中一个特殊的标签,代表子表的表名。
# 获取一个超级表所有的子表名及相关的标签信息:
select tags tbname,location from s_water;
# 统计超级表下子表数量
select count(*) from (select tags tbname,location from s_water);
特殊功能
部分特殊的查询功能可以不使用 FROM 子句执行
# 获取当前数据库
select database();
# 获取服务器和客户端版本号
select client_version();
select server_version();
# 获取服务器状态
select server_status();
# 获取当前时间
select now();
# 获取当前日期
select today();
# 获取当前时区
select timezone();
# 获取当前用户
select current_user();
6. 删除数据
据删除后不可恢复,请慎重使用。为了确保删除的数据确实是自己要删除的,建议可以先使用 select
语句加 where
后的删除条件查看要删除的数据内容,确认无误后再执行 delete
命令。
# 删除超级表某个时间节点之前的数据
delete from s_water where ts >= '2023-12-28 15:43:18.614';
# 删除超级表中所有的数据
delete from s_water;