index.mdx 8.1 KB
Newer Older
1 2
---
slug: /query-data
D
dingbo 已提交
3
title: 查询数据
D
dingbo 已提交
4
description: "主要查询功能,通过连接器执行同步查询和异步查询"
5 6
---

B
Bo Ding 已提交
7 8
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
9 10 11 12 13 14 15
import JavaQuery from "./_java.mdx";
import PyQuery from "./_py.mdx";
import GoQuery from "./_go.mdx";
import RustQuery from "./_rust.mdx";
import NodeQuery from "./_js.mdx";
import CsQuery from "./_cs.mdx";
import CQuery from "./_c.mdx";
weixin_47267244's avatar
weixin_47267244 已提交
16
import PhpQuery from "./_php.mdx";
17 18 19 20
import PyAsync from "./_py_async.mdx";
import NodeAsync from "./_js_async.mdx";
import CsAsync from "./_cs_async.mdx";
import CAsync from "./_c_async.mdx";
B
Bo Ding 已提交
21 22 23

## 主要查询功能

D
dingbo 已提交
24
TDengine 采用 SQL 作为查询语言。应用程序可以通过 REST API 或连接器发送 SQL 语句,用户还可以通过 TDengine 命令行工具 taos 手动执行 SQL 即席查询(Ad-Hoc Query)。TDengine 支持如下查询功能:
B
Bo Ding 已提交
25 26 27 28 29 30 31 32

- 单列、多列数据查询
- 标签和数值的多种过滤条件:>, <, =, <\>, like 等
- 聚合结果的分组(Group by)、排序(Order by)、约束输出(Limit/Offset)
- 数值列及聚合结果的四则运算
- 时间戳对齐的连接查询(Join Query: 隐式连接)操作
- 多种聚合/计算函数: count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff 等

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
33
例如:在命令行工具 taos 中,从表 d1001 中查询出 voltage > 215 的记录,按时间降序排列,仅仅输出 2 条。
B
Bo Ding 已提交
34

B
Bo Ding 已提交
35
```sql
B
Bo Ding 已提交
36 37 38 39 40 41 42 43 44 45
taos> select * from d1001 where voltage > 215 order by ts desc limit 2;
           ts            |       current        |   voltage   |        phase         |
======================================================================================
 2018-10-03 14:38:16.800 |             12.30000 |         221 |              0.31000 |
 2018-10-03 14:38:15.000 |             12.60000 |         218 |              0.33000 |
Query OK, 2 row(s) in set (0.001100s)
```

为满足物联网场景的需求,TDengine 支持几个特殊的函数,比如 twa(时间加权平均),spread (最大值与最小值的差),last_row(最后一条记录)等,更多与物联网场景相关的函数将添加进来。TDengine 还支持连续查询。

D
dingbo 已提交
46
具体的查询语法请看 [TAOS SQL 的数据查询](/taos-sql/select) 章节。
B
Bo Ding 已提交
47

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
48
## 多表聚合查询
B
Bo Ding 已提交
49 50 51

物联网场景中,往往同一个类型的数据采集点有多个。TDengine 采用超级表(STable)的概念来描述某一个类型的数据采集点,一张普通的表来描述一个具体的数据采集点。同时 TDengine 使用标签来描述数据采集点的静态属性,一个具体的数据采集点有具体的标签值。通过指定标签的过滤条件,TDengine 提供了一高效的方法将超级表(某一类型的数据采集点)所属的子表进行聚合查询。对普通表的聚合函数以及绝大部分操作都适用于超级表,语法完全一样。

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
52
### 示例一
53 54

在 TAOS Shell,查找北京所有智能电表采集的电压平均值,并按照 location 分组。
B
Bo Ding 已提交
55 56 57 58 59 60 61 62 63 64

```
taos> SELECT AVG(voltage) FROM meters GROUP BY location;
       avg(voltage)        |            location            |
=============================================================
             222.000000000 | Beijing.Haidian                |
             219.200000000 | Beijing.Chaoyang               |
Query OK, 2 row(s) in set (0.002136s)
```

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
65
### 示例二
D
dingbo 已提交
66

67
在 TAOS shell, 查找 groupId 为 2 的所有智能电表过去 24 小时的记录条数,电流的最大值。
B
Bo Ding 已提交
68 69 70 71 72 73 74 75 76

```
taos> SELECT count(*), max(current) FROM meters where groupId = 2 and ts > now - 24h;
     cunt(*)  |    max(current)  |
==================================
            5 |             13.4 |
Query OK, 1 row(s) in set (0.002136s)
```

D
dingbo 已提交
77
TDengine 仅容许对属于同一个超级表的表之间进行聚合查询,不同超级表之间的聚合查询不支持。在 [TAOS SQL 的数据查询](/taos-sql/select) 一章,查询类操作都会注明是否支持超级表。
B
Bo Ding 已提交
78

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
79
## 降采样查询、插值
B
Bo Ding 已提交
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

物联网场景里,经常需要通过降采样(down sampling)将采集的数据按时间段进行聚合。TDengine 提供了一个简便的关键词 interval 让按照时间窗口的查询操作变得极为简单。比如,将智能电表 d1001 采集的电流值每 10 秒钟求和

```
taos> SELECT sum(current) FROM d1001 INTERVAL(10s);
           ts            |       sum(current)        |
======================================================
 2018-10-03 14:38:00.000 |              10.300000191 |
 2018-10-03 14:38:10.000 |              24.900000572 |
Query OK, 2 row(s) in set (0.000883s)
```

降采样操作也适用于超级表,比如:将北京所有智能电表采集的电流值每秒钟求和

```
taos> SELECT SUM(current) FROM meters where location like "Beijing%" INTERVAL(1s);
           ts            |       sum(current)        |
======================================================
 2018-10-03 14:38:04.000 |              10.199999809 |
 2018-10-03 14:38:05.000 |              32.900000572 |
 2018-10-03 14:38:06.000 |              11.500000000 |
 2018-10-03 14:38:15.000 |              12.600000381 |
 2018-10-03 14:38:16.000 |              36.000000000 |
Query OK, 5 row(s) in set (0.001538s)
```

降采样操作也支持时间偏移,比如:将所有智能电表采集的电流值每秒钟求和,但要求每个时间窗口从 500 毫秒开始

```
taos> SELECT SUM(current) FROM meters INTERVAL(1s, 500a);
           ts            |       sum(current)        |
======================================================
 2018-10-03 14:38:04.500 |              11.189999809 |
 2018-10-03 14:38:05.500 |              31.900000572 |
 2018-10-03 14:38:06.500 |              11.600000000 |
 2018-10-03 14:38:15.500 |              12.300000381 |
 2018-10-03 14:38:16.500 |              35.000000000 |
Query OK, 5 row(s) in set (0.001521s)
```

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
120 121 122
物联网场景里,每个数据采集点采集数据的时间是难同步的,但很多分析算法(比如 FFT)需要把采集的数据严格按照时间等间隔的对齐,在很多系统里,需要应用自己写程序来处理,但使用 TDengine 的降采样操作就轻松解决。

如果一个时间间隔里,没有采集的数据,TDengine 还提供插值计算的功能。
B
Bo Ding 已提交
123

D
dingbo 已提交
124
语法规则细节请见 [TAOS SQL 的按时间窗口切分聚合](/taos-sql/interval) 章节。
B
Bo Ding 已提交
125 126 127

## 示例代码

128 129
### 查询数据

D
dingbo 已提交
130
在 [SQL 写入](/develop/insert-data/sql-writing) 一章,我们创建了 power 数据库,并向 meters 表写入了一些数据,以下示例代码展示如何查询这个表的数据。
B
Bo Ding 已提交
131

132 133
<Tabs defaultValue="java" groupId="lang">
  <TabItem label="Java" value="java">
B
Bo Ding 已提交
134
    <JavaQuery />
135 136
  </TabItem>
  <TabItem label="Python" value="python">
B
Bo Ding 已提交
137
    <PyQuery />
138 139
  </TabItem>
  <TabItem label="Go" value="go">
B
Bo Ding 已提交
140
    <GoQuery />
141 142
  </TabItem>
  <TabItem label="Rust" value="rust">
B
Bo Ding 已提交
143
    <RustQuery />
144 145
  </TabItem>
  <TabItem label="Node.js" value="nodejs">
B
Bo Ding 已提交
146
    <NodeQuery />
147 148
  </TabItem>
  <TabItem label="C#" value="csharp">
B
Bo Ding 已提交
149
    <CsQuery />
150 151
  </TabItem>
  <TabItem label="C" value="c">
B
Bo Ding 已提交
152
    <CQuery />
153
  </TabItem>
weixin_47267244's avatar
weixin_47267244 已提交
154 155 156
  <TabItem label="PHP" value="php">
    <PhpQuery />
  </TabItem>
B
Bo Ding 已提交
157 158
</Tabs>

159 160
:::note

D
dingbo 已提交
161
1. 无论是使用 REST 连接还是原生连接的连接器,以上示例代码都能正常工作。
B
Bo Ding 已提交
162
2. 唯一需要注意的是:由于 REST 接口无状态, 不能使用 `use db` 语句来切换数据库。
163 164 165

:::

B
Bo Ding 已提交
166
### 异步查询
B
Bo Ding 已提交
167

B
Bo Ding 已提交
168 169
除同步查询 API 之外,TDengine 还提供性能更高的异步调用 API 处理数据插入、查询操作。在软硬件环境相同的情况下,异步 API 处理数据插入的速度比同步 API 快 2-4 倍。异步 API 采用非阻塞式的调用方式,在系统真正完成某个具体数据库操作前,立即返回。调用的线程可以去处理其他工作,从而可以提升整个应用的性能。异步 API 在网络延迟严重的情况下,优点尤为突出。

D
dingbo 已提交
170
需要注意的是,只有使用原生连接的连接器,才能使用异步查询功能。
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
171

172 173 174 175 176 177 178
<Tabs defaultValue="python" groupId="lang">
  <TabItem label="Python" value="python">
    <PyAsync />
  </TabItem>
  <TabItem label="C#" value="csharp">
    <CsAsync />
  </TabItem>
179
  <TabItem label="C" value="c">
180
    <CAsync />
181
  </TabItem>
B
Bo Ding 已提交
182
</Tabs>