11 KiB
title | sidebar_label | toc_max_heading_level |
---|---|---|
执行 SQL | 执行 SQL | 4 |
import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem";
TDengine 对 SQL 语言提供了全面的支持,允许用户以熟悉的 SQL 语法进行数据的查询、插入和删除操作。TDengine 的 SQL 还支持对数据库和数据表的管理操作,如创建、修改和删除数据库及数据表。TDengine 扩展了标准 SQL,引入了时序数据处理特有的功能,如时间序列数据的聚合查询、降采样、插值查询等,以适应时序数据的特点。这些扩展使得用户可以更高效地处理时间序列数据,进行复杂的数据分析和处理。具体支持的 SQL 语法请参考 TDengine SQL
下面介绍使用各语言连接器通过执行 SQL 完成建库、建表、写入数据和查询数据。
:::note
REST 连接:各编程语言的连接器封装使用 HTTP
请求的连接,支持数据写入和查询操作,开发者依然使用连接器提供的接口访问 TDengine
。
REST API:直接调用 taosadapter
提供的 REST API 接口,进行数据写入和查询操作。代码示例使用 curl
命令来演示。
:::
建库和表
下面以智能电表为例,展示使用各语言连接器如何执行 SQL 命令创建一个名为 power
的数据库,然后使用 power
数据库为默认数据库。
接着创建一个名为 meters
的超级表(STABLE),其表结构包含时间戳、电流、电压、相位等列,以及分组 ID 和位置作为标签。
{{#include docs/examples/java/src/main/java/com/taos/example/JdbcCreatDBDemo.java:create_db_and_table}}
{{#include docs/examples/python/create_db_ws.py}}
{{#include docs/examples/python/create_db_native.py}}
{{#include docs/examples/python/create_db_rest.py}}
```go
{{#include docs/examples/go/sqlquery/main.go:create_db_and_table}}
```
{{#include docs/examples/rust/nativeexample/examples/createdb.rs:create_db_and_table}}
```js
{{#include docs/examples/node/websocketexample/sql_example.js:create_db_and_table}}
```
```csharp
{{#include docs/examples/csharp/wsInsert/Program.cs:create_db_and_table}}
```
{{#include docs/examples/c-ws/create_db_demo.c:create_db_and_table}}
{{#include docs/examples/c/create_db_demo.c:create_db_and_table}}
创建数据库
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
--data 'CREATE DATABASE IF NOT EXISTS power'
创建表,在 url 中指定数据库为 power
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql/power' \
--data 'CREATE STABLE IF NOT EXISTS meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))'
> **注意**:建议采用 `.` 的格式构造SQL语句,不推荐在应用中采用 `USE DBName` 方式访问。
插入数据
下面以智能电表为例,展示如何使用连接器执行 SQL 来插入数据到 power
数据库的 meters
超级表。样例使用 TDengine 自动建表 SQL 语法,写入 d1001 子表中 3 条数据,写入 d1002 子表中 1 条数据,然后打印出实际插入数据条数。
Note NOW 为系统内部函数,默认为客户端所在计算机当前时间。NOW + 1s 代表客户端当前时间往后加 1 秒,数字后面代表时间单位:a(毫秒),s(秒),m(分),h(小时),d(天),w(周),n(月),y(年)。
{{#include docs/examples/python/insert_ws.py}}
{{#include docs/examples/python/insert_native.py}}
{{#include docs/examples/python/insert_rest.py}}
```go
{{#include docs/examples/go/sqlquery/main.go:insert_data}}
```
{{#include docs/examples/rust/nativeexample/examples/insert.rs:insert_data}}
```js
{{#include docs/examples/node/websocketexample/sql_example.js:insertData}}
```
```csharp
{{#include docs/examples/csharp/wsInsert/Program.cs:insert_data}}
```
{{#include docs/examples/c-ws/insert_data_demo.c:insert_data}}
{{#include docs/examples/c/insert_data_demo.c:insert_data}}
Note NOW 为系统内部函数,默认为客户端所在计算机当前时间。NOW + 1s 代表客户端当前时间往后加 1 秒,数字后面代表时间单位:a(毫秒),s(秒),m(分),h(小时),d(天),w(周),n(月),y(年)。
写入数据
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
--data 'INSERT INTO power.d1001 USING power.meters TAGS(2,'\''California.SanFrancisco'\'') VALUES (NOW + 1a, 10.30000, 219, 0.31000) (NOW + 2a, 12.60000, 218, 0.33000) (NOW + 3a, 12.30000, 221, 0.31000) power.d1002 USING power.meters TAGS(3, '\''California.SanFrancisco'\'') VALUES (NOW + 1a, 10.30000, 218, 0.25000)'
查询数据
下面以智能电表为例,展示如何使用各语言连接器执行 SQL 来查询数据,从 power
数据库 meters
超级表中查询最多 100 行数据,并将获取到的结果按行打印出来。
{{#include docs/examples/java/src/main/java/com/taos/example/JdbcQueryDemo.java:query_data}}
Note 查询和操作关系型数据库一致,使用下标获取返回字段内容时从 1 开始,建议使用字段名称获取。
{{#include docs/examples/python/query_ws.py}}
{{#include docs/examples/python/query_native.py}}
{{#include docs/examples/python/query_rest.py}}
```go
{{#include docs/examples/go/sqlquery/main.go:select_data}}
```
{{#include docs/examples/rust/nativeexample/examples/query.rs:query_data}}
rust 连接器还支持使用 serde 进行反序列化行为结构体的结果获取方式:
{{#include docs/examples/rust/nativeexample/examples/query.rs:query_data_2}}
```js
{{#include docs/examples/node/websocketexample/sql_example.js:queryData}}
```
```csharp
{{#include docs/examples/csharp/wsInsert/Program.cs:select_data}}
```
{{#include docs/examples/c-ws/query_data_demo.c:query_data}}
{{#include docs/examples/c/query_data_demo.c:query_data}}
查询数据
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql' \
--data 'SELECT ts, current, location FROM power.meters limit 100'
执行带有 reqId 的 SQL
reqId 可用于请求链路追踪,reqId 就像分布式系统中的 traceId 作用一样。一个请求可能需要经过多个服务或者模块才能完成。reqId 用于标识和关联这个请求的所有相关操作,以便于我们可以追踪和分析请求的完整路径。
使用 reqId 有下面好处:
- 请求追踪:通过将同一个 reqId 关联到一个请求的所有相关操作,可以追踪请求在系统中的完整路径
- 性能分析:通过分析一个请求的 reqId,可以了解请求在各个服务和模块中的处理时间,从而找出性能瓶颈
- 故障诊断:当一个请求失败时,可以通过查看与该请求关联的 reqId 来找出问题发生的位置
如果用户不设置 reqId,连接器会在内部随机生成一个,但建议由显式用户设置以以更好地跟用户请求关联起来。
下面是各语言连接器设置 reqId 执行 SQL 的代码样例。
{{#include docs/examples/java/src/main/java/com/taos/example/JdbcReqIdDemo.java:with_reqid}}
{{#include docs/examples/python/reqid_ws.py}}
{{#include docs/examples/python/reqid_native.py}}
{{#include docs/examples/python/reqid_rest.py}}
```go
{{#include docs/examples/go/queryreqid/main.go:query_id}}
```
{{#include docs/examples/rust/nativeexample/examples/query.rs:query_with_req_id}}
```js
{{#include docs/examples/node/websocketexample/sql_example.js:sqlWithReqid}}
```
```csharp
{{#include docs/examples/csharp/wsInsert/Program.cs:query_id}}
```
{{#include docs/examples/c-ws/with_reqid_demo.c:with_reqid}}
{{#include docs/examples/c/with_reqid_demo.c:with_reqid}}
查询数据,指定 reqId 为 3
curl --location -uroot:taosdata 'http://127.0.0.1:6041/rest/sql?req_id=3' \
--data 'SELECT ts, current, location FROM power.meters limit 1'