TDEngine(taos) 涛思数据库-sql初识

一、基本使用

这里读者自行安装数据库:使用安装包立即开始 | TDengine 文档 | 涛思数据 (taosdata.com)

// 下载gz文件,解压
tar -zxvf TDengine-server-<对应版本>-Linux-x64.tar.gz

// 解压后启动
sudo ./install.sh

启动成功后,直接输入 taos 即可进入数据库:

建表语句同mysql一样,在终端中运行的 SQL 语句需要以分号(;)结束来运行,CREATE TABLE 语句用于创建普通表和以超级表为模板创建子表。

CREATE DATABASE demo;
USE demo;
CREATE TABLE t (ts TIMESTAMP, speed INT);
INSERT INTO t VALUES ('2019-07-15 00:00:00', 10);
INSERT INTO t VALUES ('2019-07-15 01:00:00', 20);
SELECT * FROM t;

           ts            |    speed    |
========================================
 2019-07-15 00:00:00.000 |          10 |
 2019-07-15 01:00:00.000 |          20 |

Query OK, 2 row(s) in set (0.003128s)

创建数据库示例

创建了一个有 10 个 vgroup 名为 db 的数据库, 其中每个 vnode 分配 10MB 的写入缓存

create database if not exists db vgroups 10 buffer 10

查看系统中的所有数据库

SHOW DATABASES;

 创建子表

CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...);

显示所有表

SHOW TABLES [LIKE tb_name_wildchar];

 显示表创建语句

SHOW CREATE TABLE tb_name;

获取表结构信息

DESCRIBE [db_name.]tb_name;

显示当前数据库下的所有超级表信息

SHOW STABLES [LIKE tb_name_wildcard];

二、查询sql

1. 查询开始时间到及结束时间的记录:

select * from 表 where ts >= 开始时间 and ts <= 结束时间

select * from power.d1001 where ts >= "2018-10-03T06:38:05.000Z" and ts <= "2018-10-03T06:38:15.000Z"

 2. 查询开始时间到及结束时间的第一条记录

查询开始值,可以使用first函数:select first(表字段) from 表 where ts >= 开始时间 and ts <= 结束时间(查询指定时间结束值使用last函数。)

select first(current) from power.d1001 where ts >= "2018-10-03T06:38:05.000Z" and ts <= "2018-10-03T06:38:15.000Z"

3. 数据切分查询(分组)

PARTITION BY part_list

        part_list 可以是任意的标量表达式,包括列、常量、标量函数和它们的组合。

        例如:将数据按标签 location 进行分组,取每个分组内的电压平均值:

select location,avg(voltage) from power.meters partition by location

4. 窗口切分查询-INTERVAL

 TDengine 支持按时间窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。

其中窗口函数中可以指定查询窗口大小。根据需求,分别为: a (毫秒), b (纳秒), d (天), h (小时), m (分钟), n (月), s (秒), u (微妙), w (周), y (年)。

官方文档这块我认为比较难理解,这里我就以一个例子简单的使用一下:

假设我们要查询从 2023-08-01 00:00:00 到 2023-08-01 00:05:00 这段时间内的数据,返要查询每个 location 下电压的平均值,并且考虑到每秒的分区

用正常的语法应该是:

SELECT location, AVG(voltage) FROM power.meters 
WHERE ts >= '2023-08-01 00:00:00' AND ts < '2023-08-01 00:05:00' 
GROUP BY location, (ts - MICROSECOND(ts) % 1000000);

这里的 MICROSECOND(ts) % 1000000 实际并不存在,是我们自定义的,用来获取时间戳的微秒部分,并确保每秒开始的时间点相同。

使用 窗口切分查询解决这个问题应该是:

SELECT location, AVG(voltage) FROM power.meters 
WHERE ts >= '2023-08-01 00:00:00' AND ts < '2023-08-01 00:05:00' 
partition by location INTERVAL(1s)

个人理解:

        INTERVAL(1s) 就是一个函数,用来定义时间段里的条件,而这里的partition by 相当于GROUP BY,只不过 INTERVAL(1s) 必须配合 partition by 使用。

 三、使用 taosBenchmark 测试

在终端执行 taosBenchmark,这条命令很快完成 1 亿条记录的插入:

$ taosBenchmark

该命令将在数据库 test 下面自动创建一张超级表 meters,该超级表下有 1 万张表,表名为 d0 到 d9999,每张表有 1 万条记录,每条记录有 tscurrentvoltagephase 四个字段,时间戳从 2017-07-14 10:40:00 000 到 2017-07-14 10:40:09 999,每张表带有标签 location 和 groupId,groupId 被设置为 1 到 10,location 被设置为 California.CampbellCalifornia.CupertinoCalifornia.LosAngelesCalifornia.MountainViewCalifornia.PaloAltoCalifornia.SanDiegoCalifornia.SanFranciscoCalifornia.SanJoseCalifornia.SantaClara 或者 California.Sunnyvale

 查询超级表 meters 下的记录总条数:

SELECT COUNT(*) FROM test.meters;

查询 1 亿条记录的平均值、最大值、最小值等:

SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters;

查询 location = "California.SanFrancisco" 的记录总条数:

SELECT COUNT(*) FROM test.meters WHERE location = "California.SanFrancisco";

查询 groupId = 10 的所有记录的平均值、最大值、最小值等:

SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters WHERE groupId = 10;

对表 d10 按每 10 秒进行平均值、最大值和最小值聚合统计:

SELECT FIRST(ts), AVG(current), MAX(voltage), MIN(phase) FROM test.d10 INTERVAL(10s);
<think>好的,用户之前问了如何将Map转成JSON,现在又问如何将JSON转成Map。我需要先回顾之前的回答结构,保持一致。首先,用户可能是开发人员,需要处理数据转换的问题,可能在前后端交互或者数据处理中遇到这个问题。 用户的问题涉及不同语言,比如Java、Python、JavaScript,可能他们使用多种编程语言,或者想了解不同环境下的处理方法。我需要分别给出不同语言的示例,确保每个例子都准确,并且注意语法正确。 用户可能的需求包括理解基本概念、转换方法、注意事项和应用场景。需要分步骤说明,结构清晰,便于用户逐步操作。同时,需要注意数据类型兼容性,比如JSON中的某些类型在Map中可能无法直接对应,需要特别处理。 在Java中,使用Jackson库是常见做法,但用户可能不知道需要添加依赖,或者如何处理异常。需要提醒他们导入相关包,并处理可能的异常。Python的例子相对简单,但需要提到`json`模块的使用,以及如何处理嵌套结构。JavaScript中,Map和普通对象的区别需要注意,特别是如何将JSON对象转为Map可能需要遍历属性。 还要考虑用户可能遇到的常见问题,比如特殊类型处理、键名冲突或者嵌套结构。需要指出这些注意事项,帮助用户避免错误。应用场景部分可以强调数据传输、配置解析等,让用户理解实际用途。 最后,保持语言简洁明了,避免使用专业术语过多,必要时解释关键点。检查代码示例是否正确,特别是JSON字符串的格式和转义字符是否正确。确保回答覆盖所有主要语言,满足不同用户的需求。</think>将JSON转换为Map(键值对集合)是JSON数据解析的常见需求,适用于从API响应、配置文件或字符串中提取结构化数据。以下是分步骤说明及示例: --- ### **1. 基本概念** - **JSON**:文本格式的数据结构,例如:`{ "name": "Alice", "age": 30 }`。 - **Map**:编程语言中的键值对容器(如Java的`HashMap`、Python的`dict`、JavaScript的`Map`)。 --- ### **2. 转换方法(分语言示例)** #### **Java示例** 使用`Jackson`库解析JSON到Map: ```java import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { String json = "{\"name\":\"Alice\",\"age\":30}"; ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = mapper.readValue(json, Map.class); System.out.println(map.get("name")); // 输出: Alice System.out.println(map.get("age")); // 输出: 30 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值