時序資料庫 TDengine SQL 查詢語法規則彙總,官方教程奉上!

TDengine發表於2023-09-21

小 T 導讀:儘管時序資料處理的特點是以寫操作為主,讀操作為輔,但查詢需求也不容忽視。為方便使用者上手,時序資料庫(Time Series Database)TDengine 採用 SQL 作為查詢語言,主要查詢功能包括單列及多列資料查詢、數值列及聚合結果的四則運算、時間戳對齊的連線查詢操作等,本文將就部分查詢細則做分析。

在《查詢效能:TDengine 最高達到了 InfluxDB 的 37 倍、 TimescaleDB 的 28.6 倍》中,我們瞭解到了 TDengine 在查詢方面展現出的具體實力。但想要更好地發揮出 TDengine 的查詢效能,在實際操作上,也還有一些事項需要注意,部分內容彙總如下:

TDengine SQL 查詢語句可以指定部分或全部列作為返回結果。資料列和標籤列都可以出現在列表中。

萬用字元和標籤列

萬用字元 * 可以用於代指全部列。對於普通表和子表,結果中只有普通列。對於超級表,還包含了 Tag 列。

SELECT * FROM d1001;

萬用字元支援表名字首,以下兩個 SQL 語句均為返回全部的列:

SELECT * FROM d1001;
SELECT d1001.* FROM d1001;

在 JOIN 查詢中,帶表名字首的*和不帶字首*返回的結果有差別, *返回全部表的所有列資料(不包含標籤),而帶表名字首的萬用字元,則只返回該表的列資料。

SELECT * FROM d1001, d1003 WHERE d1001.ts=d1003.ts;
SELECT d1001.* FROM d1001,d1003 WHERE d1001.ts = d1003.ts;

上面的查詢語句中,前者返回 d1001 和 d1003 的全部列,而後者僅返回 d1001 的全部列。

在使用 SQL 函式來進行查詢的過程中,部分 SQL 函式支援萬用字元操作。其中的區別在於:  count(*)函式只返回一列。 firstlastlast_row函式則是返回全部列。

此外,在超級表和子表的查詢中我們也可以指定標籤列,且標籤列的值會與普通列的資料一起返回。

SELECT location, groupid, current FROM d1001 LIMIT 2;

結果去重

DISTINCT 關鍵字可以對結果集中的一列或多列進行去重,去除的列既可以是標籤列也可以是資料列。

對標籤列去重:

SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;

對資料列去重:

SELECT DISTINCT col_name [, col_name ...] FROM tb_name;

需要注意:

  1. cfg 檔案中的配置引數 maxNumOfDistinctRes 將對 DISTINCT 能夠輸出的資料行數進行限制。其最小值是 100000,最大值是 100000000,預設值是 10000000。如果實際計算結果超出了這個限制,那麼會僅輸出這個數量範圍內的部分。
  2. 由於浮點數天然的精度機制原因,在特定情況下,對 FLOAT 和 DOUBLE 列使用 DISTINCT 並不能保證輸出值的完全一致性。

特殊功能

部分特殊的查詢功能可以不使用 FROM 子句執行。

下面的命令可以獲取當前所在的資料庫 database(),如果登入的時候沒有指定預設資料庫,且沒有使用 USE命令切換資料,則返回 NULL。

SELECT DATABASE();

獲取伺服器和客戶端版本號:

SELECT CLIENT_VERSION();
SELECT SERVER_VERSION();

伺服器狀態檢測語句。如果伺服器正常,返回一個數字(例如 1)。如果伺服器異常,返回 error code。該 SQL 語法能相容連線池對於 TDengine 狀態的檢查及第三方工具對於資料庫伺服器狀態的檢查。並可以避免出現使用了錯誤的心跳檢測 SQL 語句導致的連線池連線丟失的問題。

SELECT SERVER_STATUS();

我們可以使用 SELECT NOW();來獲取當前時間,使用 SELECT TODAY();來獲取當前日期,使用 SELECT TIMEZONE();獲取當前時區。

正規表示式過濾

語法

WHERE (column|tbname) match/MATCH/nmatch/NMATCH _regex_

正規表示式規範

確保使用的正規表示式符合 POSIX 的規範,具體規範內容可參見Regular Expressions

使用限制

不僅能針對表名(即 tbname 篩選)、binary/nchar 型別標籤值進行正規表示式過濾,也支援普通列的過濾。

正則匹配字串長度不能超過 128 位元組。可以透過引數 maxRegexStringLen 設定和調整最大允許的正則匹配字串,該引數是客戶端配置引數,需要重啟才能生效。

CASE 表示式

語法

CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END

說明

TDengine 透過 CASE 表示式讓使用者可以在 SQL 語句中使用 IF … THEN … ELSE 邏輯。

第一種 CASE 語法返回第一個 value 等於 compare_value 的 result,如果沒有 compare_value 符合,則返回 ELSE 之後的 result,如果沒有 ELSE 部分,則返回 NULL。

第二種語法返回第一個 condition 為真的 result。 如果沒有 condition 符合,則返回 ELSE 之後的 result,如果沒有 ELSE 部分,則返回 NULL。

CASE 表示式的返回型別為第一個 WHEN THEN 部分的 result 型別,其餘 WHEN THEN 部分和 ELSE 部分,result 型別都需要可以向其轉換,否則 TDengine 會報錯。

示例

某裝置有三個狀態碼,顯示其狀態,語句如下:

SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;

統計智慧電錶的電壓平均值,當電壓小於 200 或大於 250 時認為是統計有誤,修正其值為 220,語句如下:

SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;

JOIN 子句

TDengine 支援基於時間戳主鍵的內連線,即 JOIN 條件必須包含時間戳主鍵。只要滿足基於時間戳主鍵這個要求,普通表、子表、超級表和子查詢之間可以隨意的進行內連線,且對錶個數沒有限制。

普通表與普通表之間的 JOIN 操作:

SELECT *
FROM temp_tb_1 t1, pressure_tb_1 t2
WHERE t1.ts = t2.ts

超級表與超級表之間的 JOIN 操作:

SELECT *
FROM temp_stable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;

子表與超級表之間的 JOIN 操作:

SELECT *
FROM temp_ctable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;

類似地,也可以對多個子查詢的查詢結果進行 JOIN 操作。

巢狀查詢

“巢狀查詢”又稱為“子查詢”,也即在一條 SQL 語句中,“內層查詢”的計算結果可以作為“外層查詢”的計算物件來使用。

從 2.2.0.0 版本開始,TDengine 的查詢引擎開始支援在 FROM 子句中使用非關聯子查詢(“非關聯”的意思是,子查詢不會用到父查詢中的引數)。也即在普通 SELECT 語句的 tb_name_list 位置,用一個獨立的 SELECT 語句來代替(這一 SELECT 語句被包含在英文圓括號內),於是完整的巢狀查詢 SQL 語句形如:

SELECT ... FROM (SELECT ... FROM ...) ...;

需要注意:

  • 內層查詢的返回結果將作為“虛擬表”供外層查詢使用,此虛擬表建議起別名,以便於外層查詢中方便引用。
  • 在內層和外層查詢中,都支援普通的表間/超級表間 JOIN。內層查詢的計算結果也可以再參與資料子表的 JOIN 操作。
  • 內層查詢支援的功能特性與非巢狀的查詢語句能力是一致的。
    • 內層查詢的 ORDER BY 子句一般沒有意義,建議避免這樣的寫法以免無謂的資源消耗。
  • 與非巢狀的查詢語句相比,外層查詢所能支援的功能特性存在如下限制(計算函式部分):
    • 如果內層查詢的結果資料未提供時間戳,那麼計算過程隱式依賴時間戳的函式在外層會無法正常工作。例如:INTERP, DERIVATIVE, IRATE, LAST_ROW, FIRST, LAST, TWA, STATEDURATION, TAIL, UNIQUE。
    • 如果內層查詢的結果資料不是按時間戳有序,那麼計算過程依賴資料按時間有序的函式在外層會無法正常工作。例如:LEASTSQUARES, ELAPSED, INTERP, DERIVATIVE, IRATE, TWA, DIFF, STATECOUNT, STATEDURATION, CSUM, MAVG, TAIL, UNIQUE。
    • 計算過程需要兩遍掃描的函式,在外層查詢中無法正常工作。例如:此類函式包括:PERCENTILE。

寫在最後

受篇幅所限,本文僅闡述了在進行 SQL 查詢時部分細則及注意事項,關於結果集列名、偽列、查詢物件、GROUP BY等子句的使用規則以及相關語法示例,大家可以進入官網文件進行查閱。在使用 TDengine 執行 SQL 查詢時,以上實操手冊會幫助你解決一系列基礎問題。但如果你遇到的問題遲遲未能解決,也不要著急,可以新增小T微信(tdengine)向 TDengine 技術人員尋求幫助。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70014783/viewspace-2984934/,如需轉載,請註明出處,否則將追究法律責任。

相關文章