對于熟悉關系型數據庫的開發(fā)者來說,時序數據庫的SQL語法學習成本極低。作為一款專業(yè)的時序數據庫,它不僅全面支持標準SQL的查詢、插入和刪除操作,還針對時間序列數據場景進行了功能擴展。本文將圍繞建庫建表和數據寫入兩大核心操作,詳細介紹時序數據庫的SQL開發(fā)要點。
SQL語言支持概述
時序數據庫對SQL語言提供了全面的支持,允許用戶以熟悉的SQL語法進行數據的查詢、插入和刪除操作。在此基礎上,時序數據庫還擴展了標準SQL,引入了時序數據處理特有的功能,包括時間序列數據的聚合查詢、降采樣、插值查詢等。這意味著開發(fā)者可以復用已有的SQL知識,在時序數據庫上快速上手時序數據的開發(fā)工作。
建庫操作
創(chuàng)建數據庫是使用時序數據庫的第一步,也是時序數據庫應用開發(fā)的基礎。以下是一個標準的建庫語句:
CREATE DATABASE IF NOT EXISTS power
IF NOT EXISTS子句確保了操作的冪等性,在數據庫已存在時不會報錯。這一特性在自動化部署和腳本化運維中非常實用。
在實際應用中,建庫時還可以指定多種參數,如數據保留天數、副本數量、緩存大小等。這些參數的合理配置對于時序數據庫的存儲效率和查詢性能至關重要。
建表操作:超級表與子表
時序數據庫采用超級表(STABLE)和子表的層次結構來組織數據,這是時序數據庫獨有的數據模型設計。超級表定義了數據 schema,子表則是時序數據庫中具體的數據存儲單元。
創(chuàng)建超級表
CREATE STABLE IF NOT EXISTS power.meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))
在這個示例中,power.meters是超級表的完整名稱,采用了dbName.tableName的格式。超級表包含四個數據列和一個時間戳主鍵列,以及兩個標簽列(groupId和location)。
設計要點:
ts TIMESTAMP:時間戳列是時序數據庫的主鍵,每張表必須包含current FLOAT, voltage INT, phase FLOAT:普通數據列,記錄采集的數值TAGS (groupId INT, location BINARY(24)):標簽列用于標識數據來源,標簽列的值在子表級別是固定的
超級表本身不存儲數據,它相當于一個模板。實際的數據寫入和查詢都在子表上進行。
子表的創(chuàng)建方式
子表可以通過以下方式創(chuàng)建:
方式一:手動創(chuàng)建后寫入數據。 先使用CREATE TABLE語句創(chuàng)建子表,再執(zhí)行INSERT語句寫入數據。
方式二:使用自動建表語法。 在INSERT語句中直接指定子表所屬的超級表和標簽值,系統(tǒng)會自動創(chuàng)建子表并寫入數據。這種方式更為簡潔高效,是推薦的實踐。
數據寫入詳解
自動建表寫入
時序數據庫支持自動建表語法,可以在寫入數據的同時創(chuàng)建子表,這是時序數據庫簡化開發(fā)流程的重要特性:
INSERT INTO power.d1001 USING power.meters TAGS(2,'California.SanFrancisco') VALUES (NOW + 1a, 10.30000, 219, 0.31000)
這條語句的含義是:
power.d1001:目標子表名USING power.meters:指定該子表所屬的超級表TAGS(2,'California.SanFrancisco'):子表的標簽值VALUES (NOW + 1a, 10.30000, 219, 0.31000):寫入的數據值
時間函數與時間偏移
時序數據庫提供了靈活的時間表達式支持,這是時序數據庫在數據寫入方面的一大優(yōu)勢。NOW為系統(tǒng)內部函數,默認取客戶端所在計算機的當前時間。在此基礎上,支持通過加減運算指定時間偏移:
NOW + 1s -- 客戶端當前時間往后加1秒
NOW + 1a -- 客戶端當前時間往后加1毫秒
NOW + 1m -- 客戶端當前時間往后加1分鐘
NOW + 1h -- 客戶端當前時間往后加1小時
NOW + 1d -- 客戶端當前時間往后加1天
NOW + 1w -- 客戶端當前時間往后加1周
NOW + 1n -- 客戶端當前時間往后加1月
NOW + 1y -- 客戶端當前時間往后加1年
時間單位字母對照:a(毫秒)、s(秒)、m(分)、h(小時)、d(天)、w(周)、n(月)、y(年)。這種靈活的時間偏移語法在批量寫入歷史數據或模擬數據時非常方便。
SQL編寫最佳實踐
在實際開發(fā)中,時序數據庫的SQL編寫需要遵循一些最佳實踐,以充分發(fā)揮時序數據庫的性能優(yōu)勢:
使用dbName.tableName格式: 建議在SQL語句中采用dbName.tableName的完整格式來引用表,而不是使用USE DBName方式切換數據庫。這一建議在連接池環(huán)境下尤為重要,因為USE語句可能導致不同請求之間的數據庫上下文混亂。
合理利用自動建表: 在物聯網場景中,設備數量可能非常龐大且動態(tài)變化。使用自動建表語法可以簡化代碼邏輯,避免預先創(chuàng)建大量子表的繁瑣操作。
注意數據類型選擇: 時序數據庫支持FLOAT、INT、BINARY、NCHAR等多種數據類型。對于標簽列,BINARY和NCHAR需要指定長度,如BINARY(24)。如果后續(xù)寫入的數據超出預設長度,在無模式寫入方式下系統(tǒng)會自動擴展列長度。
時序特有的查詢功能
除了標準的增刪改查操作,時序數據庫還提供了針對時間序列數據的專用查詢功能,這些功能是時序數據庫的核心競爭力所在:
- 聚合查詢: 對時間窗口內的數據進行統(tǒng)計聚合,如求平均值、最大值、最小值等
- 降采樣: 將高頻率采集的數據按時間窗口降采樣,減少數據量同時保留趨勢信息
- 插值查詢: 對缺失的時間點數據進行插值填充,確保時間序列的連續(xù)性
這些功能是時序數據庫區(qū)別于傳統(tǒng)關系型數據庫的核心能力,能夠顯著簡化時序數據庫中時序數據的分析工作。
總結
掌握時序數據庫的SQL語法是高效開發(fā)的基礎。從建庫建表到數據寫入,時序數據庫的SQL設計充分考慮了時間序列數據的特點,在保持標準SQL兼容性的同時,通過超級表/子表模型、自動建表語法、靈活的時間表達式等時序數據庫特有的功能,大幅降低了開發(fā)復雜度。遵循dbName.tableName的SQL編寫規(guī)范、善用自動建表語法和時間偏移表達式,能夠幫助開發(fā)者構建更加健壯和高效的數據處理流程。作為一款專為時序數據設計的數據庫引擎,TDengine在SQL層面的擴展使其既能滿足傳統(tǒng)數據庫用戶的操作習慣,又能充分發(fā)揮時序數據的處理優(yōu)勢。



互聯網.png)



-1.png)












伙伴.png)



