TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,对业务运行状态进行实时监测、预警,提供实时的商业洞察。其核心模块是高性能、集群开源、云原生、极简的时序数据库 TDengine OSS。
下载安装:
TDengine:TDengine-client-3.2.1.0-Windows-x64.exe (17.1 M)
官网地址:建立连接 | TDengine 文档 | 涛思数据
可视化工具:
TDengineGUI.Setup.1.0.3
下载地址:https://github.com/skye0207/TDengineGUI/releases/tag/v1.0.0
DBeaver(更好用)
Maven:
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>3.2.7</version>
</dependency>
建立连接:
Class.forName("com.taosdata.jdbc.TSDBDriver");
String jdbcUrl = "jdbc:TAOS://taosdemo.com:6030/test?user=root&password=taosdata";
Connection conn = DriverManager.getConnection(jdbcUrl);
url 中的配置参数如下:
user:登录 TDengine 用户名,默认值 'root'。
password:用户登录密码,默认值 'taosdata'。
cfgdir:客户端配置文件目录路径,Linux OS 上默认值 /etc/taos,Windows OS 上默认值 C:/TDengine/cfg。
启动:
Win:
安装后,可以在拥有管理员权限的 cmd 窗口执行 sc start taosd 或在 C:\TDengine 目录下,运行 taosd.exe 来启动 TDengine 服务进程。如需使用 http/REST 服务,请执行 sc start taosadapter 或运行 taosadapter.exe 来启动 taosAdapter 服务进程。
Linux:
安装后,请使用 systemctl 命令来启动 TDengine 的服务进程。
systemctl start taosd
检查服务是否正常工作:
systemctl status taosd
语法:
时序库:
- 创建时序库,当前库不存在则创建
create database if not exists dev;
- 查看库
show databases;
- 删除库,当前库存在则删除
drop database if exists dev;
超级表:
超级表并不是具体要操作的表,超级表的下级可以有多张子表,由超级表定义子表的抽象大纲,子表用于实现超级表所定义的类型,超级表和子表的关系可以理解为java中的多态,一种事物多张形态。
创建超级表:
create table if not exists dev.weather(ts timestamp, temperature float, humidity float) tags(location nchar(64), groupId int);
创建子表:
create table if not exists dev.t1 using dev.weather tags('杭州余杭区', 1);
create table if not exists dev.t2 using dev.weather tags('杭州西湖区', 1);
create table if not exists dev.t3 using dev.weather tags('杭州萧山区', 1);
create table if not exists dev.t4 using dev.weather tags('上海宝山区', 2);
插入数据:
如果要插入数据也不是对超级表进行操作,而是对子表进行操作
下面分别向t1,t2,t3,t4插入一条数据,sql如下
insert into dev.t1 values ('2018-01-01 00:00:00.001', 6.1,8.0);
insert into dev.t2 values ('2018-01-01 00:00:00.002', 6.5,8.9);
insert into dev.t3 values ('2018-01-01 00:00:00.003', 6.8,7.9);
insert into dev.t4 values ('2018-01-01 00:00:00.004', 7.5,10.9);
建普通表:
在dev库中创建一个名为test01的普通表,不需要制定标签类
CREATE TABLE dev.test01 (time timestamp , sensor_id INT, id FLOAT);
注意事项:
- 绑定标签列的表则是超级表,不绑定标签列的则是普通表
- 超级表和普通表同级
- 超级表下的子表也属于是子普通表
建表注意事项:
- 表的第一个字段必须是 TIMESTAMP,并且系统自动将其设为主键;
- 子表名只能由字母、数字和下划线组成,且不能以数字开头,不区分大小写;
- 使用数据类型 BINARY/NCHAR/GEOMETRY,需指定其最长的字节数,如 BINARY(20),表示 20 字节;
- 例如:`aBc` 和 `abc` 是不同的表名,但是 abc 和 aBc 是相同的表名。
- 超级表和普通表是同级关系,名称不能相同,比如超级表中有一个名为test01的,那么普通表就不能创建同名;
查询语句:
普通查询
SELECT location, groupid, current FROM d1001 LIMIT 2;
聚合函数
SELECT AVG(temperature),AVG(humidity), MAX(temperature), MIN(temperature) FROM dev.weather WHERE location='杭州西湖区' or location='上海宝山区' GROUP BY groupId;
释:在这里,要查询的是位于“杭州西湖区”和“上海宝山区”两个地区的平均温度avg(temperature)、平均湿度avg(humidity)、最高温度max(temperature)、最低温度min(temperature),并将结果按所处城市id(groupId)进行聚合。
对标签列去重:
SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;
对数据列去重:
SELECT DISTINCT col_name [, col_name ...] FROM tb_name;
查询时序库表的数据结构:
DESCRIBE dev.test01;
新增语句:
需要指定 库名.表名
INSERT INTO dev.test01 (time, sensor_id, id) VALUES ('2023-01-01 12:00:00', 1, 123.45);
删除语句:
需要指定 库名.表名
delete from dev.test01 where ts < '2021-10-01 10:40:00.100' ;
运算符无变化;
修改语句:
如果我想修改t1表中地区为“杭州西湖区”的温度为10.10。一般来说,很少用到修改操作,但其用法和mysql还是有很大的区别的
首先查询原来的温度值是多少,如果按照mysql语法写会直接报错
select * from demo.weather where location='杭州西湖区';
执行之后是查不到的,会直接报错
报错信息:DB error: invalid operation: filter on tag not supported for normal table (0.000592s)
也就是说,正常表是不支持标签值的操作,这属于是超级表的操作。
“杭州西湖区”是超级表中地区标签的值,而t1就是为这个地区建的。所以直接在超级表上查询即可。
Sql如下:
select * from dev.weather where location='杭州西湖区';
默认是不支持修改数据的
如果需要修改数据,则需要打开update参数开关
建库时不指定update参数,则update参数默认为0,表示数据不可修改。
以下操作为删除原来的库,重新创建并指定update参数为1
drop database if exists demo;
create database if not exists demo update 1;
create table if not exists demo.weather(ts timestamp, temperature float, humidity float) tags(location nchar(64), groupId int);
create table if not exists demo.t1 using demo.weather tags('杭州余杭区', 1);
create table if not exists demo.t2 using demo.weather tags('杭州西湖区', 1);
create table if not exists demo.t3 using demo.weather tags('杭州萧山区', 1);
create table if not exists demo.t4 using demo.weather tags('上海宝山区', 2);
insert into demo.t1 values ('2018-01-01 00:00:00.001', 6.1,8.0);
insert into demo.t2 values ('2018-01-01 00:00:00.002', 6.5,8.9);
insert into demo.t3 values ('2018-01-01 00:00:00.003', 6.8,7.9);
insert into demo.t4 values ('2018-01-01 00:00:00.004', 7.5,10.9);
接下来修改数据
insert into demo.t2 values ('2018-01-01 00:00:00.002', 10.10,8.9);
这时发现原来的数据被新数据覆盖了,这是因为同一个子表下,如果时间戳一致,则新数据直接覆盖旧数据
注意事项:
- 时间戳是不可修改的
- Tdengine的修改并不是update而是使用insert新数据覆盖旧数据