相較于其他眾多時序數(shù)據(jù)庫和實時數(shù)據(jù)庫,TDengine的一個獨特優(yōu)勢在于,自其首個版本發(fā)布之初便支持標準的SQL查詢功能。這一特性極大地降低了用戶在使用過程中的學習難度。本文將介紹如何在時序數(shù)據(jù)庫中運用SQL查詢來處理時序數(shù)據(jù)。
一、SQL查詢的獨特優(yōu)勢
1.1 低學習成本
對于熟悉關系型數(shù)據(jù)庫的開發(fā)者來說,學習時序數(shù)據(jù)庫的SQL查詢幾乎沒有門檻。標準的SELECT語句、WHERE條件、ORDER BY排序等語法都可以直接使用。
1.2 生態(tài)兼容性
SQL作為最廣泛使用的數(shù)據(jù)庫查詢語言,擁有豐富的工具生態(tài):
- BI工具直接對接
- 各種ORM框架支持
- 成熟的查詢優(yōu)化器
1.3 TDengine的SQL特色
TDengine在標準SQL基礎上,針對時序數(shù)據(jù)場景進行了擴展:
- 原生支持時間窗口查詢
- 豐富的時序聚合函數(shù)
- 高效的時間范圍過濾
二、基本查詢語法
2.1 簡單查詢
最基礎的查詢是從表中檢索所有數(shù)據(jù):
SELECT * FROM meters;
2.2 條件過濾
通過WHERE語句指定條件,查詢時序數(shù)據(jù):
SELECT * FROM meters
WHERE voltage > 230
ORDER BY ts DESC
LIMIT 5;
上面的SQL從超級表meters中查詢出電壓voltage大于230V的記錄,按時間降序排列,且僅輸出前5行。
查詢結果示例:
ts | current | voltage | phase | groupid | location |
===================================================================================================
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 10 | California.Sunnyvale |
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 1 | California.LosAngles |
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 10 | California.Sunnyvale |
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 5 | California.Cupertino |
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 4 | California.SanFrancisco |
Query OK, 5 row(s) in set (0.145403s)
2.3 時間范圍查詢
時序數(shù)據(jù)查詢中最常見的是按時間范圍過濾:
SELECT * FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2023-01-01T00:00:00+08:00";
三、查詢子句詳解
3.1 SELECT子句
SELECT子句指定要查詢的列:
-- 查詢指定列
SELECT ts, current, voltage FROM meters;
-- 使用聚合函數(shù)
SELECT COUNT(*), AVG(voltage) FROM meters;
-- 使用表達式
SELECT ts, current * voltage AS power FROM meters;
3.2 WHERE子句
WHERE子句用于過濾數(shù)據(jù),支持多種條件表達式:
-- 比較運算
SELECT * FROM meters WHERE voltage > 220;
-- 邏輯運算
SELECT * FROM meters WHERE voltage > 220 AND current > 10;
-- 時間范圍
SELECT * FROM meters WHERE ts >= '2022-01-01 00:00:00' AND ts < '2022-02-01 00:00:00';
-- 標簽過濾
SELECT * FROM meters WHERE location = 'California.SanFrancisco';
3.3 ORDER BY子句
ORDER BY子句用于對結果進行排序:
-- 按時間升序(默認)
SELECT * FROM meters ORDER BY ts ASC;
-- 按時間降序
SELECT * FROM meters ORDER BY ts DESC;
-- 多列排序
SELECT * FROM meters ORDER BY voltage DESC, ts ASC;
3.4 LIMIT和OFFSET
用于分頁查詢:
-- 返回前10條記錄
SELECT * FROM meters LIMIT 10;
-- 跳過前10條,返回接下來的10條
SELECT * FROM meters LIMIT 10 OFFSET 10;
-- 簡寫形式
SELECT * FROM meters LIMIT 10, 10;
四、超級表查詢
4.1 超級表查詢特點
針對超級表的查詢,TDengine將所有子表中的數(shù)據(jù)視為一個整體:
- 首先通過標簽篩選出滿足查詢條件的表
- 然后在這些子表上分別查詢時序數(shù)據(jù)
- 最終將各張子表的查詢結果合并
4.2 超級表查詢示例
SELECT groupid, avg(voltage)
FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2023-01-01T00:00:00+08:00"
GROUP BY groupid;
查詢結果:
groupid | avg(voltage) |
======================================
8 | 243.961981544901079 |
5 | 243.961981544901079 |
1 | 243.961981544901079 |
7 | 243.961981544901079 |
9 | 243.961981544901079 |
6 | 243.961981544901079 |
4 | 243.961981544901079 |
10 | 243.961981544901079 |
2 | 243.961981544901079 |
3 | 243.961981544901079 |
Query OK, 10 row(s) in set (0.042446s)
4.3 使用tbname偽列
在超級表查詢中,可以使用tbname偽列來獲取子表名稱:
SELECT tbname, * FROM meters WHERE voltage > 230 LIMIT 5;
五、常用查詢場景
5.1 最新數(shù)據(jù)查詢
查詢設備的最新數(shù)據(jù):
SELECT * FROM d1001 ORDER BY ts DESC LIMIT 1;
5.2 時間段統(tǒng)計
查詢某時間段內(nèi)的統(tǒng)計數(shù)據(jù):
SELECT COUNT(*) as cnt, AVG(current) as avg_current, MAX(voltage) as max_voltage
FROM meters
WHERE ts >= '2022-01-01 00:00:00' AND ts < '2022-01-02 00:00:00';
5.3 設備分組統(tǒng)計
按標簽分組進行統(tǒng)計:
SELECT location, COUNT(*) as device_count, AVG(voltage) as avg_voltage
FROM meters
GROUP BY location;
5.4 異常數(shù)據(jù)查詢
查詢異常數(shù)據(jù)記錄:
SELECT * FROM meters
WHERE voltage > 250 OR voltage < 180
ORDER BY ts DESC;
六、查詢性能優(yōu)化
6.1 時間范圍優(yōu)先
時序數(shù)據(jù)查詢應優(yōu)先使用時間范圍條件,TDengine對時間范圍查詢有專門優(yōu)化:
-- 推薦:包含時間范圍
SELECT * FROM meters
WHERE ts >= '2022-01-01 00:00:00' AND ts < '2022-01-02 00:00:00'
AND voltage > 220;
-- 不推薦:只有非時間條件
SELECT * FROM meters WHERE voltage > 220;
6.2 合理使用LIMIT
對于大數(shù)據(jù)量的查詢,使用LIMIT限制返回結果:
SELECT * FROM meters LIMIT 1000;
6.3 避免SELECT *
只查詢需要的列,減少數(shù)據(jù)傳輸:
-- 推薦
SELECT ts, current, voltage FROM meters;
-- 不推薦
SELECT * FROM meters;
七、測試數(shù)據(jù)生成
為了更好地學習和測試查詢功能,可以使用taosBenchmark工具生成測試數(shù)據(jù):
taosBenchmark --start-timestamp=1600000000000 --tables=100 --records=10000000 --time-step=10000
上面的命令在TDengine中生成了一個用于測試的數(shù)據(jù)庫,產(chǎn)生共10億條時序數(shù)據(jù):
- 時間戳從1600000000000(2020-09-13T20:26:40+08:00)開始
- 包含100個設備(子表)
- 每個設備有10000000條數(shù)據(jù)
- 時序數(shù)據(jù)的采集頻率是10秒/條
總結
TDengine時序數(shù)據(jù)庫的SQL查詢功能為開發(fā)者提供了熟悉而強大的數(shù)據(jù)查詢能力。通過標準SQL語法,開發(fā)者可以快速上手時序數(shù)據(jù)查詢,無需學習新的查詢語言。同時,TDengine針對時序數(shù)據(jù)場景進行了專門優(yōu)化,在時間范圍查詢、聚合計算等方面表現(xiàn)出色。掌握這些基礎查詢技能,是構建工業(yè)數(shù)據(jù)管理平臺(IDMP)和實時數(shù)據(jù)庫應用的重要基礎。TDengine憑借其SQL兼容性和高性能查詢能力,成為物聯(lián)網(wǎng)和工業(yè)場景的理想選擇。



互聯(lián)網(wǎng).png)



-1.png)












伙伴.png)



