TAOS SQL
本(ben)文檔說明 TAOS SQL 支(zhi)持的語法(fa)規則、主要查詢功(gong)能、支(zhi)持的 SQL 查詢函數,以及常(chang)用(yong)技巧等內容(rong)。閱讀本(ben)文檔需要讀者(zhe)具有基(ji)本(ben)的 SQL 語言的基(ji)礎。
TAOS SQL 是用戶對 TDengine 進行數(shu)據寫入(ru)和(he)查(cha)詢(xun)的主(zhu)要工(gong)具。TAOS SQL 為了便于用戶快(kuai)速上(shang)手,在(zai)(zai)一定程度上(shang)提供(gong)類似(si)于標準(zhun) SQL 類似(si)的風(feng)格(ge)和(he)模(mo)式(shi)。嚴格(ge)意義上(shang),TAOS SQL 并不(bu)是也不(bu)試圖提供(gong) SQL 標準(zhun)的語法。此(ci)外,由(you)于 TDengine 針(zhen)對的時(shi)序性結構(gou)化數(shu)據不(bu)提供(gong)刪除功(gong)能(neng),因此(ci)在(zai)(zai) TAO SQL 中不(bu)提供(gong)數(shu)據刪除的相(xiang)關(guan)功(gong)能(neng)。
TAOS SQL 目前(qian)僅支持 DESCRIBE 關鍵字的縮寫,DESCRIBE 可以(yi)縮寫為 DESC。
本章節 SQL 語法遵循如下約定:
- < > 里的內容是用戶需要輸入的,但不要輸入 <> 本身
- [ ] 表示內容為可選項,但不能輸入 [] 本身
- | 表示多選一,選擇其中一個即可,但不能輸入 | 本身
- … 表示前面的項可重復多個
為更好地(di)說明 SQL 語法的規則及其特點,本文假設存在一個(ge)(ge)數據集。以智(zhi)能電表(biao)(meters)為例,假設每個(ge)(ge)智(zhi)能電表(biao)采集電流(liu)、電壓(ya)、相位三個(ge)(ge)量。其建模如(ru)下:
taos> DESCRIBE meters;
Field | Type | Length | Note |
=================================================================================
ts | TIMESTAMP | 8 | |
current | FLOAT | 4 | |
voltage | INT | 4 | |
phase | FLOAT | 4 | |
location | BINARY | 64 | TAG |
groupid | INT | 4 | TAG |
數據(ju)集(ji)包(bao)含 4 個(ge)智能(neng)電表的數據(ju),按照(zhao) TDengine 的建模規則(ze),對(dui)應 4 個(ge)子表,其名稱(cheng)分(fen)別(bie)是(shi) d1001, d1002, d1003, d1004。
支持的數據類型
使用 TDengine,最重要(yao)的是時間(jian)戳。創(chuang)建并插入記錄(lu)、查(cha)詢歷史記錄(lu)的時候,均需(xu)要(yao)指定時間(jian)戳。時間(jian)戳有如下規則:
- 時間格式為
YYYY-MM-DD HH:mm:ss.MS,默認時間分辨率為毫秒。比如:2017-08-12 18:25:58.128 - 內部函數 now 是客戶端的當前時間
- 插入記錄時,如果時間戳為 now,插入數據時使用提交這條記錄的客戶端的當前時間
- Epoch Time:時間戳也可以是一個長整數,表示從格林威治時間 1970-01-01 00:00:00.000 (UTC/GMT) 開始的毫秒數(相應地,如果所在 Database 的時間精度設置為“微秒”,則長整型格式的時間戳含義也就對應于從格林威治時間 1970-01-01 00:00:00.000 (UTC/GMT) 開始的微秒數;納秒精度的邏輯也是類似的。)
- 時間可以加減,比如 now-2h,表明查詢時刻向前推 2 個小時(最近 2 小時)。數字后面的時間單位可以是 b(納秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小時)、d(天)、w(周)。 比如
select * from t1 where ts > now-2w and ts <= now-1w,表示查詢兩周前整整一周的數據。在指定降采樣操作(down sampling)的時間窗口(interval)時,時間單位還可以使用 n(自然月) 和 y(自然年)。
TDengine 缺省的時間戳是毫秒(miao)精度,但(dan)通過在 CREATE DATABASE 時傳遞的 PRECISION 參數(shu)就(jiu)可以(yi)支持微秒(miao)和納秒(miao)。(從 2.1.5.0 版本(ben)開始(shi)支持納秒(miao)精度)
CREATE DATABASE db_name PRECISION 'ns';
在TDengine中,普(pu)通表的(de)數據模型(xing)中可(ke)使用以下 10 種數據類型(xing)。
| # | 類型 | Bytes | 說明 |
|---|---|---|---|
| 1 | TIMESTAMP | 8 | 時間戳。缺省精度毫秒,可支持微秒和納秒。從格林威治時間 1970-01-01 00:00:00.000 (UTC/GMT) 開始,計時不能早于該時間。(從 2.0.18.0 版本開始,已經去除了這一時間范圍限制)(從 2.1.5.0 版本開始支持納秒精度) |
| 2 | INT | 4 | 整型,范圍 [-2^31+1, 2^31-1], -2^31 用作 NULL |
| 3 | BIGINT | 8 | 長整型,范圍 [-2^63+1, 2^63-1], -2^63 用于 NULL |
| 4 | FLOAT | 4 | 浮點型,有效位數 6-7,范圍 [-3.4E38, 3.4E38] |
| 5 | DOUBLE | 8 | 雙精度浮點型,有效位數 15-16,范圍 [-1.7E308, 1.7E308] |
| 6 | BINARY | 自定義 | 記錄單字節字符串,建議只用于處理 ASCII 可見字符,中文等多字節字符需使用 nchar。理論上,最長可以有 16374 字節。binary 僅支持字符串輸入,字符串兩端需使用單引號引用。使用時須指定大小,如 binary(20) 定義了最長為 20 個單字節字符的字符串,每個字符占 1 byte 的存儲空間,總共固定占用 20 bytes 的空間,此時如果用戶字符串超出 20 字節將會報錯。對于字符串內的單引號,可以用轉義字符反斜線加單引號來表示,即 \’。 |
| 7 | SMALLINT | 2 | 短整型, 范圍 [-32767, 32767], -32768 用于 NULL |
| 8 | TINYINT | 1 | 單字節整型,范圍 [-127, 127], -128 用于 NULL |
| 9 | BOOL | 1 | 布爾型,{true, false} |
| 10 | NCHAR | 自定義 | 記錄包含多字節字符在內的字符串,如中文字符。每個 nchar 字符占用 4 bytes 的存儲空間。字符串兩端使用單引號引用,字符串內的單引號需用轉義字符 \’。nchar 使用時須指定字符串大小,類型為 nchar(10) 的列表示此列的字符串最多存儲 10 個 nchar 字符,會固定占用 40 bytes 的空間。如果用戶字符串長度超出聲明長度,將會報錯。 |
| 11 | JSON | json數據類型, 只有tag類型可以是json格式 |
Tips:
- TDengine 對 SQL 語句中的英文字符不區分大小寫,自動轉化為小寫執行。因此用戶大小寫敏感的字符串及密碼,需要使用單引號將字符串引起來。
- 注意,雖然 Binary 類型在底層存儲上支持字節型的二進制字符,但不同編程語言對二進制數據的處理方式并不保證一致,因此建議在 Binary 類型中只存儲 ASCII 可見字符,而避免存儲不可見字符。多字節的數據,例如中文字符,則需要使用 nchar 類型進行保存。如果強行使用 Binary 類型保存中文字符,雖然有時也能正常讀寫,但并不帶有字符集信息,很容易出現數據亂碼甚至數據損壞等情況。
- 注意,SQL語句中的數值類型將依據是否存在小數點,或使用科學計數法表示,來判斷數值類型是否為整型或者浮點型,因此在使用時要注意相應類型越界的情況。例如,9999999999999999999會認為超過長整型的上邊界而溢出,而9999999999999999999.0會被認為是有效的浮點數。
數據庫管理
-
創建數據庫
CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1];說明:
1) KEEP是該數據庫的數據保留多長天(tian)(tian)數,缺省(sheng)是3650天(tian)(tian)(10年),數據庫會自動(dong)刪除超過時限的數據;
2) UPDATE 標志數據庫支持更新相同時間戳數據;(從 2.1.7.0 版本開始此參數支持設為 2,表示允許部分列更新,也即更新數據行時未被設置的列會保留原值。)(從 2.0.8.0 版本開始支持此參數。注意此參數不能通過
ALTER DATABASE指令進行修改。)1) UPDATE設為0時,表示不允許更新數據,后發送的相同時間戳的數據會被直接丟棄; 2) UPDATE設為1時,表示更新全部列數據,即如果更新一個數據行,其中某些列沒有提供取值,那么這些列會被設為 NULL; 3) UPDATE設為2時,表示支持更新部分列數據,即如果更新一個數據行,其中某些列沒有提供取值,那么這些列會保持原有數據行中的對應值; 4) 更多關于UPDATE參數的用法,請參考[FAQ](//www.yakult-sh.com.cn/cn/documentation/faq)。3) 數據庫名最大長度為32;
4) 一(yi)條SQL 語句的最大長度為65480個字符;
5) 數據庫還有更多與存儲相關的配置參數,請參見 服務端配置 章節。
-
顯示系統當前參數
SHOW VARIABLES; -
使用數據庫
USE db_name;使用/切(qie)換數據庫(在 RESTful 連接方(fang)式下無(wu)效)。
-
刪除數據庫
DROP DATABASE [IF EXISTS] db_name;刪(shan)除數據庫。指定(ding) Database 所包含的全部數據表將(jiang)被刪(shan)除,謹慎使用!
-
修改數據庫參數
ALTER DATABASE db_name COMP 2;COMP 參數是指修改數據庫(ku)文件(jian)壓(ya)縮標志位,缺省值為 2,取值范(fan)圍為 [0, 2]。0 表示(shi)不壓(ya)縮,1 表示(shi)一階段壓(ya)縮,2 表示(shi)兩階段壓(ya)縮。
ALTER DATABASE db_name REPLICA 2;REPLICA 參數是指修(xiu)改數據庫副本(ben)數,取(qu)值范圍 [1, 3]。在集群(qun)中(zhong)使(shi)用,副本(ben)數必須(xu)小于或等于 DNODE 的數目。
ALTER DATABASE db_name KEEP 365;KEEP 參(can)數(shu)(shu)是指(zhi)修改數(shu)(shu)據(ju)文件保存的天數(shu)(shu),缺(que)省值(zhi)為 3650,取值(zhi)范圍 [days, 365000],必須大于(yu)或等于(yu) days 參(can)數(shu)(shu)值(zhi)。
ALTER DATABASE db_name QUORUM 2;QUORUM 參(can)數(shu)是(shi)指(zhi)數(shu)據(ju)寫入成功所需要的確認數(shu),取值范圍(wei) [1, 2]。對于異(yi)步(bu)(bu)復制,quorum 設為(wei)(wei) 1,具(ju)有 master 角色的虛擬節點自(zi)己確認即(ji)可。對于同(tong)步(bu)(bu)復制,quorum 設為(wei)(wei) 2。原則上,Quorum >= 1 并且(qie) Quorum <= replica(副本數(shu)),這個參(can)數(shu)在啟動一個同(tong)步(bu)(bu)模塊實(shi)例時需要提(ti)供(gong)。
ALTER DATABASE db_name BLOCKS 100;BLOCKS 參數(shu)是每個 VNODE (TSDB) 中有多少 cache 大小(xiao)(xiao)的(de)內存塊,因此一個 VNODE 的(de)用的(de)內存大小(xiao)(xiao)粗略為(cache * blocks)。取值范圍 [3, 10000]。
ALTER DATABASE db_name CACHELAST 0;CACHELAST 參數控制是否在內存中緩存子表的最近數據。缺省值為 0,取值范圍 [0, 1, 2, 3]。其中 0 表示不緩存,1 表示緩存子表最近一行數據,2 表示緩存子表每一列的最近的非 NULL 值,3 表示同時打開緩存最近行和列功能。(從 2.0.11.0 版本開始支持參數值 [0, 1],從 2.1.2.0 版本開始支持參數值 [0, 1, 2, 3]。)
說明:緩(huan)存(cun)最(zui)(zui)近行(xing),將(jiang)顯著改善(shan) LAST_ROW 函數的性能表(biao)現;緩(huan)存(cun)每列(lie)的最(zui)(zui)近非 NULL 值,將(jiang)顯著改善(shan)無特殊(shu)影(ying)響(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函數的性能表(biao)現。Tips: 以上(shang)所有參(can)數修改后都可以用show databases來(lai)確認是否(fou)修改成功。另(ling)外,從(cong) 2.1.3.0 版本開(kai)始,修改這些(xie)參(can)數后無需(xu)重(zhong)啟(qi)服務器即可生(sheng)效。
-
顯示系統所有數據庫
SHOW DATABASES; -
顯示一個數據庫的創建語句
SHOW CREATE DATABASE db_name;常用于數據庫(ku)(ku)遷移(yi)。對一(yi)個已經存(cun)在的(de)數據庫(ku)(ku),返(fan)回(hui)其(qi)創建語句;在另一(yi)個集群中執行該語句,就能得到一(yi)個設置完全相同的(de) Database。
表管理
-
創建數據表
CREATE TABLE [IF NOT EXISTS] tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]);說明:
1) 表(biao)的第一個字(zi)段(duan)必須是 TIMESTAMP,并且系(xi)統自動將(jiang)其設(she)為主鍵;
2) 表名最大長度為(wei) 192;
3) 表(biao)的(de)每行(xing)長度不(bu)能超(chao)過 48K 個字符(2.1.7.0 之前的(de)版本為 16K,每個 BINARY/NCHAR 類(lei)型的(de)列還會額外占用(yong) 2 個 byte 的(de)存儲位置)
4) 子表名只能(neng)由(you)字(zi)母(mu)、數字(zi)和下劃線組成,且(qie)不(bu)能(neng)以數字(zi)開頭,不(bu)區分大(da)小寫(xie)
5) 使(shi)用數據類型 binary 或 nchar,需指定(ding)其(qi)最長的(de)字(zi)節(jie)數,如 binary(20),表示 20 字(zi)節(jie);
6) 為(wei)了兼容支持(chi)更多形(xing)式(shi)的(de)表名(ming),TDengine 引入新(xin)的(de)轉(zhuan)義符(fu) "`",可以讓表名(ming)與關鍵詞不沖(chong)突,同(tong)時不受限于(yu)上述(shu)(shu)表名(ming)稱合(he)法性約(yue)束檢查。但是同(tong)樣具(ju)有長(chang)度限制要(yao)(yao)求。使用轉(zhuan)義字(zi)符(fu)以后,不再(zai)對轉(zhuan)義字(zi)符(fu)中的(de)內(nei)容進行大小(xiao)寫統一。 例(li)如(ru):`aBc` 和 `abc` 是不同(tong)的(de)表名(ming),但是 abc 和 aBc 是相(xiang)同(tong)的(de)表名(ming)。 需要(yao)(yao)注意的(de)是轉(zhuan)義字(zi)符(fu)中的(de)內(nei)容必須是可打印字(zi)符(fu)。 上述(shu)(shu)的(de)操作邏輯和約(yue)束要(yao)(yao)求與MySQL數(shu)據(ju)的(de)操作一致。 從 2.3.0.0 版本(ben)開始(shi)支持(chi)這種方式(shi)。
-
以超級表為模板創建數據表
CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name TAGS (tag_value1, ...);以指定的超級(ji)表(biao)為模板,指定 TAGS 的值來(lai)創建數據表(biao)。
-
以超級表為模板創建數據表,并指定具體的 TAGS 列
CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...);以指定的超級表為模板,指定一部分 TAGS 列的值來創建數據表(沒被指定的 TAGS 列會設為空值)。
說(shuo)明:從 2.0.17.0 版(ban)本開始支持這種方式(shi)。在之前(qian)的版(ban)本中(zhong),不允(yun)許指定 TAGS 列(lie),而必須顯式(shi)給出所有(you) TAGS 列(lie)的取(qu)值。 -
批量創建數據表
CREATE TABLE [IF NOT EXISTS] tb_name1 USING stb_name TAGS (tag_value1, ...) [IF NOT EXISTS] tb_name2 USING stb_name TAGS (tag_value2, ...) ...;以更(geng)快的速度批量創建(jian)大量數據表(服務器端 2.0.14 及以上版本)。
說明:
1)批(pi)量(liang)建表方式要求數(shu)據表必須(xu)以超級表為模板。
2)在不超出 SQL 語(yu)句(ju)(ju)長度(du)限制的(de)(de)前提(ti)下,單條語(yu)句(ju)(ju)中的(de)(de)建(jian)表數量建(jian)議控(kong)制在 1000~3000 之間,將會(hui)獲得比較理想的(de)(de)建(jian)表速度(du)。
-
刪除數據表
DROP TABLE [IF EXISTS] tb_name; -
顯示當前數據庫下的所有數據表信息
SHOW TABLES [LIKE tb_name_wildcar];顯示當前數據庫下的(de)所有(you)數據表信息。
-
顯示一個數據表的創建語句
SHOW CREATE TABLE tb_name;常用于數據(ju)庫遷移(yi)。對一(yi)(yi)個已經存在的(de)數據(ju)表,返回(hui)其創建語句;在另一(yi)(yi)個集群中執(zhi)行該(gai)語句,就能得(de)到(dao)一(yi)(yi)個結構完全相(xiang)同的(de)數據(ju)表。
-
在線修改顯示字符寬度
SET MAX_BINARY_DISPLAY_WIDTH <nn>;如(ru)顯(xian)示(shi)的內容后(hou)面(mian)以(yi)...結尾時,表示(shi)該內容已被(bei)截(jie)斷,可通(tong)過本(ben)命令修改(gai)顯(xian)示(shi)字符寬度(du)以(yi)顯(xian)示(shi)完整的內容。
-
獲取表的結構信息
DESCRIBE tb_name; -
表增加列
ALTER TABLE tb_name ADD COLUMN field_name data_type;說明:
1) 列的(de)最大(da)個數為(wei)(wei)1024,最小(xiao)個數為(wei)(wei)2;(從 2.1.7.0 版本開始,改為(wei)(wei)最多允許 4096 列)
2) 列名(ming)最大(da)長度為(wei)64。
-
表刪除列
ALTER TABLE tb_name DROP COLUMN field_name;如果表(biao)(biao)(biao)是(shi)通(tong)(tong)過(guo)超級表(biao)(biao)(biao)創建,更改表(biao)(biao)(biao)結(jie)構(gou)的操(cao)作只能對(dui)超級表(biao)(biao)(biao)進行。同時針對(dui)超級表(biao)(biao)(biao)的結(jie)構(gou)更改對(dui)所(suo)有(you)通(tong)(tong)過(guo)該結(jie)構(gou)創建的表(biao)(biao)(biao)生效(xiao)。對(dui)于不是(shi)通(tong)(tong)過(guo)超級表(biao)(biao)(biao)創建的表(biao)(biao)(biao),可以直接修改表(biao)(biao)(biao)結(jie)構(gou)。
-
表修改列寬
ALTER TABLE tb_name MODIFY COLUMN field_name data_type(length);如果數據列的類型是可變長格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改小)。(2.1.3.0 版本新增)
如果表(biao)(biao)(biao)(biao)是通(tong)過超級表(biao)(biao)(biao)(biao)創建,更改(gai)表(biao)(biao)(biao)(biao)結(jie)構(gou)的(de)操(cao)作只能對(dui)超級表(biao)(biao)(biao)(biao)進行。同時針對(dui)超級表(biao)(biao)(biao)(biao)的(de)結(jie)構(gou)更改(gai)對(dui)所有通(tong)過該結(jie)構(gou)創建的(de)表(biao)(biao)(biao)(biao)生(sheng)效。對(dui)于不是通(tong)過超級表(biao)(biao)(biao)(biao)創建的(de)表(biao)(biao)(biao)(biao),可以(yi)直(zhi)接修改(gai)表(biao)(biao)(biao)(biao)結(jie)構(gou)。
超級表STable管理
注(zhu)意:在(zai) 2.0.15.0 及以后的版本中,開始支持 STABLE 保留(liu)字。也即,在(zai)本節后文的指令(ling)說明中,CREATE、DROP、ALTER 三個指令(ling)在(zai)老(lao)版本中保留(liu)字需寫作 TABLE 而不是 STABLE。
-
創建超級表
CREATE STABLE [IF NOT EXISTS] stb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]) TAGS (tag1_name tag_type1, tag2_name tag_type2 [, tag3_name tag_type3]);創建 STable,與創建表的(de) SQL 語法相(xiang)似(si),但需要指定 TAGS 字(zi)段的(de)名稱和類型。
說明:
1) TAGS 列的數據類型不能是 timestamp 類型;(從 2.1.3.0 版本開始,TAGS 列中支持使用 timestamp 類型,但需注意在 TAGS 中的 timestamp 列寫入數據時需要提供給定值,而暫不支持四則運算,例如
NOW + 10s這類表達式)2) TAGS 列名(ming)不(bu)能與(yu)其他列名(ming)相同;
3) TAGS 列名不能為預留關鍵字(參見:參數限制與保留關鍵字 章節);
4) TAGS 最多允許 128 個,至少 1 個,總長度不超過 16 KB。
-
刪除超級表
DROP STABLE [IF EXISTS] stb_name;刪(shan)(shan)除(chu) STable 會自動(dong)刪(shan)(shan)除(chu)通過(guo) STable 創建的(de)子表(biao)。
-
顯示當前數據庫下的所有超級表信息
SHOW STABLES [LIKE tb_name_wildcard];查看數(shu)據庫內(nei)全部 STable,及其相關信息,包括 STable 的名稱、創建(jian)時間、列數(shu)量(liang)、標(biao)簽(TAG)數(shu)量(liang)、通過該 STable 建(jian)表的數(shu)量(liang)。
-
顯示一個超級表的創建語句
SHOW CREATE STABLE stb_name;常(chang)用(yong)于數據庫(ku)遷移。對一(yi)個(ge)已經存在(zai)的(de)超級表,返(fan)回(hui)其創(chuang)建語句;在(zai)另一(yi)個(ge)集(ji)群中(zhong)執(zhi)行該(gai)語句,就能得到一(yi)個(ge)結構完全相同的(de)超級表。
-
獲取超級表的結構信息
DESCRIBE stb_name; -
超級表增加列
ALTER STABLE stb_name ADD COLUMN field_name data_type; -
超級表刪除列
ALTER STABLE stb_name DROP COLUMN field_name; -
超級表修改列寬
ALTER STABLE stb_name MODIFY COLUMN field_name data_type(length);如果數據列的(de)類型是可變(bian)長格(ge)式(shi)(BINARY 或 NCHAR),那(nei)么可以使用此指令修改(gai)其(qi)寬度(只能(neng)改(gai)大,不能(neng)改(gai)小(xiao))。(2.1.3.0 版本新增(zeng))
超級表 STable 中 TAG 管理
-
添加標簽
ALTER STABLE stb_name ADD TAG new_tag_name tag_type;為(wei) STable 增(zeng)加一(yi)個新的標簽(qian),并指定新標簽(qian)的類型。標簽(qian)總(zong)數不(bu)能超過(guo) 128 個,總(zong)長度不(bu)超過(guo) 16K 個字符(fu)。
-
刪除標簽
ALTER STABLE stb_name DROP TAG tag_name;刪除超級(ji)表(biao)的(de)一個標簽(qian),從(cong)超級(ji)表(biao)刪除某(mou)個標簽(qian)后,該超級(ji)表(biao)下的(de)所有子(zi)表(biao)也會自動刪除該標簽(qian)。
-
修改標簽名
ALTER STABLE stb_name CHANGE TAG old_tag_name new_tag_name;修(xiu)改(gai)超級表(biao)(biao)的標簽(qian)名(ming),從超級表(biao)(biao)修(xiu)改(gai)某個標簽(qian)名(ming)后(hou),該超級表(biao)(biao)下的所有子表(biao)(biao)也會自動(dong)更新(xin)該標簽(qian)名(ming)。
-
修改標簽列寬度
ALTER STABLE stb_name MODIFY TAG tag_name data_type(length);如(ru)果標簽(qian)的(de)類(lei)型是可變長格(ge)式(BINARY 或(huo) NCHAR),那(nei)么可以使(shi)用此指令(ling)修改其寬度(只能改大,不(bu)能改小)。(2.1.3.0 版本新(xin)增)
-
修改子表標簽值
ALTER TABLE tb_name SET TAG tag_name=new_tag_value;說(shuo)明(ming):除(chu)(chu)了更新標(biao)(biao)簽(qian)的(de)值的(de)操(cao)作是(shi)針(zhen)對(dui)(dui)子(zi)(zi)表進行,其他所(suo)(suo)有的(de)標(biao)(biao)簽(qian)操(cao)作(添(tian)加(jia)標(biao)(biao)簽(qian)、刪除(chu)(chu)標(biao)(biao)簽(qian)等(deng))均只能(neng)作用于 STable,不能(neng)對(dui)(dui)單個子(zi)(zi)表操(cao)作。對(dui)(dui) STable 添(tian)加(jia)標(biao)(biao)簽(qian)以后(hou),依托于該(gai) STable 建立(li)的(de)所(suo)(suo)有表將自動(dong)增加(jia)了一個標(biao)(biao)簽(qian),所(suo)(suo)有新增標(biao)(biao)簽(qian)的(de)默(mo)認值都(dou)是(shi) NULL。
數據寫入
寫入語法:
INSERT INTO
tb_name
[USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
[(field1_name, ...)]
VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
[tb2_name
[USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
[(field1_name, ...)]
VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
...];
詳細描述及示例:
-
插入一條或多條記錄
指定已經創(chuang)建好的數據(ju)子表的表名,并(bing)通過 VALUES 關(guan)鍵字提供一行(xing)(xing)或多(duo)行(xing)(xing)數據(ju),即(ji)可(ke)向數據(ju)庫(ku)寫入這(zhe)些(xie)數據(ju)。例如,執行(xing)(xing)如下語句(ju)可(ke)以寫入一行(xing)(xing)記(ji)錄:INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);或者,可以通(tong)過如下語句(ju)寫(xie)入兩(liang)行記(ji)錄:
INSERT INTO d1001 VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32) (1626164208000, 10.15, 217, 0.33);注意:
1)在第二個例子中,兩行記錄的首列時間戳使用了不同格式的寫法。其中字符串格式的時間戳寫法不受所在 DATABASE 的時間精度設置影響;而長整形格式的時間戳寫法會受到所在 DATABASE 的時間精度設置影響——例子中的時間戳在毫秒精度下可以寫作 1626164208000,而如果是在微秒精度設置下就需要寫為 1626164208000000,納秒精度設置下需要寫為 1626164208000000000。
2)在使用“插入多條記錄”方式寫入數據時,不能把第一列的時間戳取值都設為 NOW,否則會導致語句中的多條記錄使用相同的時間戳,于是就可能出現相互覆蓋以致這些數據行無法全部被正確保存。其原因在于,NOW 函數在執行中會被解析為所在 SQL 語句的實際執行時間,出現在同一語句中的多個 NOW 標記也就會被替換為完全相同的時間戳取值。
3)允許插入的(de)最(zui)老記(ji)錄的(de)時(shi)(shi)(shi)間(jian)(jian)戳,是(shi)相(xiang)對(dui)于(yu)當前(qian)服務器時(shi)(shi)(shi)間(jian)(jian),減去(qu)配(pei)置(zhi)的(de) keep 值(數(shu)(shu)據(ju)(ju)保(bao)留的(de)天(tian)(tian)數(shu)(shu));允許插入的(de)最(zui)新記(ji)錄的(de)時(shi)(shi)(shi)間(jian)(jian)戳,是(shi)相(xiang)對(dui)于(yu)當前(qian)服務器時(shi)(shi)(shi)間(jian)(jian),加上配(pei)置(zhi)的(de) days 值(數(shu)(shu)據(ju)(ju)文(wen)件(jian)存(cun)儲數(shu)(shu)據(ju)(ju)的(de)時(shi)(shi)(shi)間(jian)(jian)跨度(du),單位(wei)為天(tian)(tian))。keep 和 days 都(dou)是(shi)可以在創(chuang)建數(shu)(shu)據(ju)(ju)庫時(shi)(shi)(shi)指定的(de),缺(que)省值分別是(shi) 3650 天(tian)(tian)和 10 天(tian)(tian)。 -
插入記錄,數據對應到指定的列
向數(shu)(shu)據(ju)(ju)子表中插入記錄時(shi),無論插入一行(xing)還(huan)是多(duo)行(xing),都可以讓數(shu)(shu)據(ju)(ju)對應到指定的(de)列。對于 SQL 語句中沒有出現的(de)列,數(shu)(shu)據(ju)(ju)庫(ku)將自動填(tian)充為 NULL。主鍵(時(shi)間戳(chuo))不能為 NULL。例(li)如:INSERT INTO d1001 (ts, current, phase) VALUES ('2021-07-13 14:06:33.196', 10.27, 0.31);說明:如果不(bu)指(zhi)定(ding)列(lie),也即(ji)使用全(quan)列(lie)模(mo)式(shi)——那(nei)么在 VALUES 部分提(ti)供(gong)的數(shu)據,必(bi)須為(wei)數(shu)據表的每個列(lie)都(dou)顯(xian)式(shi)地提(ti)供(gong)數(shu)據。全(quan)列(lie)模(mo)式(shi)寫(xie)入速度會遠(yuan)快于指(zhi)定(ding)列(lie),因(yin)此(ci)建議盡可能采用全(quan)列(lie)寫(xie)入方式(shi),此(ci)時(shi)空列(lie)可以填入 NULL。
-
向多個表插入記錄
可以在一條語句(ju)中,分(fen)別向多個表插(cha)入一條或多條記錄,并且也可以在插(cha)入過程中指(zhi)定列(lie)。例如(ru):INSERT INTO d1001 VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33) d1002 (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31); -
插入記錄時自動建表
如(ru)果用戶(hu)在(zai)(zai)寫數據(ju)時并不(bu)確定某個表是(shi)否(fou)存(cun)在(zai)(zai),此時可以在(zai)(zai)寫入數據(ju)時使用自動(dong)建表語法來創建不(bu)存(cun)在(zai)(zai)的(de)(de)表,若該(gai)表已存(cun)在(zai)(zai)則不(bu)會(hui)建立新表。自動(dong)建表時,要求必須以超級表為模(mo)板(ban),并寫明(ming)數據(ju)表的(de)(de) TAGS 取值(zhi)。例如(ru):INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);也可以在(zai)自動(dong)建表(biao)時,只(zhi)是指定部分 TAGS 列的取值,未被指定的 TAGS 列將置為 NULL。例如:
INSERT INTO d21001 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33);自動建(jian)表(biao)語法也支持在(zai)一條語句中向多個(ge)表(biao)插(cha)入記錄。例(li)如:
INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33) d21002 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33) d21003 USING meters (groupId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);說明:在(zai)(zai) 2.0.20.5 版(ban)本之前,在(zai)(zai)使用(yong)自動建表語(yu)法(fa)并指(zhi)定(ding)列(lie)時,子表的(de)列(lie)名(ming)必須緊跟在(zai)(zai)子表名(ming)稱后(hou)面,而不能如例子里那(nei)樣放在(zai)(zai) TAGS 和 VALUES 之間(jian)。從 2.0.20.5 版(ban)本開(kai)始,兩種(zhong)寫法(fa)都可以,但不能在(zai)(zai)一條 SQL 語(yu)句中混(hun)用(yong),否則(ze)會報語(yu)法(fa)錯(cuo)誤(wu)。
-
插入來自文件的數據記錄
除了使用 VALUES 關鍵(jian)字插入一行或多行數據外,也可以(yi)把要寫入的(de)數據放在(zai) CSV 文(wen)(wen)(wen)件(jian)中(英文(wen)(wen)(wen)逗號分隔(ge)、英文(wen)(wen)(wen)單引(yin)號括住(zhu)每個值)供 SQL 指令讀取。其中 CSV 文(wen)(wen)(wen)件(jian)無需表頭(tou)。例如(ru),如(ru)果(guo) /tmp/csvfile.csv 文(wen)(wen)(wen)件(jian)的(de)內容為:'2021-07-13 14:07:34.630', '10.2', '219', '0.32' '2021-07-13 14:07:35.779', '10.15', '217', '0.33'那么通(tong)過(guo)如下指令可以把(ba)這個文件中(zhong)的數據寫入(ru)子表中(zhong):
INSERT INTO d1001 FILE '/tmp/csvfile.csv'; -
插入來自文件的數據記錄,并自動建表
從 2.1.5.0 版(ban)本開始,支持(chi)在(zai)插入來(lai)自 CSV 文件的數據時,以超(chao)級表(biao)為模(mo)板來(lai)自動創建不存在(zai)的數據表(biao)。例如:INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile.csv';也可以在一條語句中向多個表以自(zi)動建表的方式插入(ru)記(ji)錄(lu)。例如(ru):
INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile_21001.csv' d21002 USING meters (groupId) TAGS (2) FILE '/tmp/csvfile_21002.csv';
歷史記錄寫入:可使用(yong)IMPORT或者INSERT命令,IMPORT的語法(fa),功能與INSERT完全一樣。
說明:針(zhen)對 insert 類型的(de)(de)(de) SQL 語句,我們(men)采用的(de)(de)(de)流(liu)式解析策略,在(zai)發(fa)現后面(mian)的(de)(de)(de)錯誤之前,前面(mian)正確的(de)(de)(de)部分 SQL 仍會(hui)執行。下面(mian)的(de)(de)(de) SQL 中,INSERT 語句是無效的(de)(de)(de),但是 d1001 仍會(hui)被創建(jian)。
taos> CREATE TABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);
Query OK, 0 row(s) affected (0.008245s)
taos> SHOW STABLES;
name | created_time | columns | tags | tables |
============================================================================================
meters | 2020-08-06 17:50:27.831 | 4 | 2 | 0 |
Query OK, 1 row(s) in set (0.001029s)
taos> SHOW TABLES;
Query OK, 0 row(s) in set (0.000946s)
taos> INSERT INTO d1001 USING meters TAGS('Beijing.Chaoyang', 2) VALUES('a');
DB error: invalid SQL: 'a' (invalid timestamp) (0.039494s)
taos> SHOW TABLES;
table_name | created_time | columns | stable_name |
======================================================================================================
d1001 | 2020-08-06 17:52:02.097 | 4 | meters |
Query OK, 1 row(s) in set (0.001091s)
數據查詢
查詢語法:
SELECT select_expr [, select_expr ...]
FROM {tb_name_list}
[WHERE where_condition]
[SESSION(ts_col, tol_val)]
[STATE_WINDOW(col)]
[INTERVAL(interval_val [, interval_offset]) [SLIDING sliding_val]]
[FILL(fill_mod_and_val)]
[GROUP BY col_list]
[ORDER BY col_list { DESC | ASC }]
[SLIMIT limit_val [SOFFSET offset_val]]
[LIMIT limit_val [OFFSET offset_val]]
[>> export_file];
通配符
通配符 * 可以用(yong)于(yu)代(dai)指(zhi)全(quan)部列。對于(yu)普通表,結果中只有(you)普通列。
taos> SELECT * FROM d1001;
ts | current | voltage | phase |
======================================================================================
2018-10-03 14:38:05.000 | 10.30000 | 219 | 0.31000 |
2018-10-03 14:38:15.000 | 12.60000 | 218 | 0.33000 |
2018-10-03 14:38:16.800 | 12.30000 | 221 | 0.31000 |
Query OK, 3 row(s) in set (0.001165s)
在針對超級表,通配符包含 標簽列 。
taos> SELECT * FROM meters;
ts | current | voltage | phase | location | groupid |
=====================================================================================================================================
2018-10-03 14:38:05.500 | 11.80000 | 221 | 0.28000 | Beijing.Haidian | 2 |
2018-10-03 14:38:16.600 | 13.40000 | 223 | 0.29000 | Beijing.Haidian | 2 |
2018-10-03 14:38:05.000 | 10.80000 | 223 | 0.29000 | Beijing.Haidian | 3 |
2018-10-03 14:38:06.500 | 11.50000 | 221 | 0.35000 | Beijing.Haidian | 3 |
2018-10-03 14:38:04.000 | 10.20000 | 220 | 0.23000 | Beijing.Chaoyang | 3 |
2018-10-03 14:38:16.650 | 10.30000 | 218 | 0.25000 | Beijing.Chaoyang | 3 |
2018-10-03 14:38:05.000 | 10.30000 | 219 | 0.31000 | Beijing.Chaoyang | 2 |
2018-10-03 14:38:15.000 | 12.60000 | 218 | 0.33000 | Beijing.Chaoyang | 2 |
2018-10-03 14:38:16.800 | 12.30000 | 221 | 0.31000 | Beijing.Chaoyang | 2 |
Query OK, 9 row(s) in set (0.002022s)
通(tong)配符(fu)支持表名前綴,以(yi)下兩個SQL語句均為返回(hui)全部(bu)的列:
SELECT * FROM d1001;
SELECT d1001.* FROM d1001;
在JOIN查詢(xun)中,帶(dai)(dai)前(qian)綴的(de)*和不帶(dai)(dai)前(qian)綴*返回(hui)(hui)的(de)結果有(you)差別(bie), *返回(hui)(hui)全部表的(de)所(suo)有(you)列(lie)數據(不包含標簽),帶(dai)(dai)前(qian)綴的(de)通配(pei)符(fu),則只返回(hui)(hui)該(gai)表的(de)列(lie)數據。
taos> SELECT * FROM d1001, d1003 WHERE d1001.ts=d1003.ts;
ts | current | voltage | phase | ts | current | voltage | phase |
==================================================================================================================================
2018-10-03 14:38:05.000 | 10.30000| 219 | 0.31000 | 2018-10-03 14:38:05.000 | 10.80000| 223 | 0.29000 |
Query OK, 1 row(s) in set (0.017385s)
taos> SELECT d1001.* FROM d1001,d1003 WHERE d1001.ts = d1003.ts;
ts | current | voltage | phase |
======================================================================================
2018-10-03 14:38:05.000 | 10.30000 | 219 | 0.31000 |
Query OK, 1 row(s) in set (0.020443s)
在使用SQL函數來進行查詢的過程中,部分SQL函數支持通配符操作。其中的區別在于:
count(*)函數只返回一列。first、last、last_row函數則是返回全部列。
taos> SELECT COUNT(*) FROM d1001;
count(*) |
========================
3 |
Query OK, 1 row(s) in set (0.001035s)
taos> SELECT FIRST(*) FROM d1001;
first(ts) | first(current) | first(voltage) | first(phase) |
=========================================================================================
2018-10-03 14:38:05.000 | 10.30000 | 219 | 0.31000 |
Query OK, 1 row(s) in set (0.000849s)
標簽列
從 2.0.14 版本開始,支持在普通表的查詢中指定 標簽列,且(qie)標簽列的值會(hui)與普(pu)通列的數據(ju)一起返回。
taos> SELECT location, groupid, current FROM d1001 LIMIT 2;
location | groupid | current |
======================================================================
Beijing.Chaoyang | 2 | 10.30000 |
Beijing.Chaoyang | 2 | 12.60000 |
Query OK, 2 row(s) in set (0.003112s)
注意:普通表的通配符 * 中并不包含 標簽列。
獲取標簽列或普通列的去重取值
從 2.0.15.0 版(ban)本開始,支持在超級表查(cha)詢標(biao)簽(qian)列(lie)時,指定(ding) DISTINCT 關鍵字,這(zhe)樣將返回指定(ding)標(biao)簽(qian)列(lie)的(de)(de)所(suo)有(you)不(bu)重復取值。注意,在 2.1.6.0 版(ban)本之前,DISTINCT 只支持處理(li)單個標(biao)簽(qian)列(lie),而從 2.1.6.0 版(ban)本開始,DISTINCT 可(ke)以對多個標(biao)簽(qian)列(lie)進行處理(li),輸出這(zhe)些(xie)標(biao)簽(qian)列(lie)取值不(bu)重復的(de)(de)組合(he)。
SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;
從 2.1.7.0 版本開始(shi),DISTINCT 也支(zhi)持對數據子表或(huo)普通(tong)(tong)表進(jin)行處理,也即支(zhi)持獲取(qu)單個(ge)普通(tong)(tong)列的不重復取(qu)值,或(huo)多個(ge)普通(tong)(tong)列取(qu)值的不重復組(zu)合。
SELECT DISTINCT col_name [, col_name ...] FROM tb_name;
說明:
- cfg 文件中的配置參數 maxNumOfDistinctRes 將對 DISTINCT 能夠輸出的數據行數進行限制。其最小值是 100000,最大值是 100000000,默認值是 10000000。如果實際計算結果超出了這個限制,那么會僅輸出這個數量范圍內的部分。
- 由于浮點數天然的精度機制原因,在特定情況下,對 FLOAT 和 DOUBLE 列使用 DISTINCT 并不能保證輸出值的完全唯一性。
- 在當前版本下,DISTINCT 不能在嵌套查詢的子查詢中使用,也不能與聚合函數、GROUP BY、或 JOIN 在同一條語句中混用。
結果集列名
SELECT子句中,如果不指定返回結果集合的列名,結果集列名稱默認使用SELECT子句中的表達式名稱作為列名稱。此外,用戶可使用AS來重命名返回結果(guo)集合中列(lie)的名稱。例如:
taos> SELECT ts, ts AS primary_key_ts FROM d1001;
ts | primary_key_ts |
====================================================
2018-10-03 14:38:05.000 | 2018-10-03 14:38:05.000 |
2018-10-03 14:38:15.000 | 2018-10-03 14:38:15.000 |
2018-10-03 14:38:16.800 | 2018-10-03 14:38:16.800 |
Query OK, 3 row(s) in set (0.001191s)
但是針對first(*)、last(*)、last_row(*)不支持(chi)針對單列(lie)的重命名。
隱式結果列
Select_exprs可以是表所屬列的列名,也可以是基于列的函數表達式或計算式,數量的上限256個。當用戶使用了interval或group by tags的(de)子(zi)(zi)句(ju)(ju)以后(hou),在最后(hou)返回結果中會強制(zhi)返回時間戳列(lie)(lie)(第一列(lie)(lie))和(he)group by子(zi)(zi)句(ju)(ju)中的(de)標簽列(lie)(lie)。后(hou)續的(de)版本中可以支持關(guan)閉(bi)group by子(zi)(zi)句(ju)(ju)中隱式(shi)列(lie)(lie)的(de)輸出,列(lie)(lie)輸出完(wan)全(quan)由select子(zi)(zi)句(ju)(ju)控制(zhi)。
表(超級表)列表
FROM關鍵字后面可以是若干個表(超級表)列表,也可以是子查詢的結果。
如果沒有指定用戶的當前數據庫,可以在表名稱之前使用數據庫的名稱來指定表所屬的數據庫。例如:power.d1001 方式來(lai)跨庫(ku)使用(yong)表(biao)。
SELECT * FROM power.d1001;
------------------------------
USE power;
SELECT * FROM d1001;
特殊功能
部分(fen)特殊的查詢功能(neng)可以不使用FROM子句執行。獲取當(dang)前所在的數據庫(ku) database():
taos> SELECT DATABASE();
database() |
=================================
power |
Query OK, 1 row(s) in set (0.000079s)
如果登錄的時候沒有指定默認數據庫,且沒有使用USE命令(ling)切換數據,則返回(hui)NULL。
taos> SELECT DATABASE();
database() |
=================================
NULL |
Query OK, 1 row(s) in set (0.000184s)
獲(huo)取服(fu)務(wu)器和客戶(hu)端版本號:
taos> SELECT CLIENT_VERSION();
client_version() |
===================
2.0.0.0 |
Query OK, 1 row(s) in set (0.000070s)
taos> SELECT SERVER_VERSION();
server_version() |
===================
2.0.0.0 |
Query OK, 1 row(s) in set (0.000077s)
服(fu)(fu)務(wu)(wu)器狀(zhuang)(zhuang)態(tai)檢(jian)測語句。如果(guo)服(fu)(fu)務(wu)(wu)器正(zheng)常,返回一個(ge)數字(zi)(例如 1)。如果(guo)服(fu)(fu)務(wu)(wu)器異常,返回error code。該SQL語法能兼容連接(jie)池對于TDengine狀(zhuang)(zhuang)態(tai)的(de)(de)檢(jian)查(cha)及第三(san)方工具對于數據(ju)庫服(fu)(fu)務(wu)(wu)器狀(zhuang)(zhuang)態(tai)的(de)(de)檢(jian)查(cha)。并可以避免出現使用了(le)錯誤的(de)(de)心(xin)跳檢(jian)測SQL語句導致的(de)(de)連接(jie)池連接(jie)丟失的(de)(de)問(wen)題。
taos> SELECT SERVER_STATUS();
server_status() |
==================
1 |
Query OK, 1 row(s) in set (0.000074s)
taos> SELECT SERVER_STATUS() AS status;
status |
==============
1 |
Query OK, 1 row(s) in set (0.000081s)
函數_block_dist()使用說明
語法
SELECT _block_dist() FROM { tb_name | stb_name }
功能說明:獲得指定的(超級)表的數據塊(kuai)分布信息(xi)
返回結果類型:字(zi)符(fu)串。
適(shi)用數據(ju)類型:不能輸入任何參(can)數。
嵌套子(zi)查(cha)詢支持:不支持子(zi)查(cha)詢或嵌套查(cha)詢。
說明:
返回(hui) FROM 子句中輸入的表或超級表的數據(ju)塊分布情況。不支持查(cha)詢條件。
返回的結果是(shi)該表或超級表的數(shu)據塊所包含的行數(shu)的數(shu)據分布直方圖。
返回結果如下:
summary:
5th=[392], 10th=[392], 20th=[392], 30th=[392], 40th=[792], 50th=[792] 60th=[792], 70th=[792], 80th=[792], 90th=[792], 95th=[792], 99th=[792] Min=[392(Rows)] Max=[800(Rows)] Avg=[666(Rows)] Stddev=[2.17] Rows=[2000], Blocks=[3], Size=[5.440(Kb)] Comp=[0.23] RowsInMem=[0] SeekHeaderTime=[1(us)]
上述信息的說明如下:
1、查詢的(超級)表所包含的存儲在文件中的數據塊(data block)中所包含的數據行的數量分布直方圖信息:5%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 95%, 99% 的數值;
2、所有數據塊中,包含行數最少的數據塊所包含的行數量, 其中的 Min 指標 392 行。
3、所有數據塊中,包含行數最多的數據塊所包含的行數量, 其中的 Max 指標 800 行。
4、所有數據塊行數的算數平均值 666行(其中的 Avg 項)。
5、所有數據塊中行數分布的均方差為 2.17 ( stddev )。
6、數據塊包含的行的總數為 2000 行(Rows)。
7、數據塊總數是 3 個數據塊 (Blocks)。
8、數據塊占用磁盤空間大小 5.44 Kb (size)。
9、壓縮后的數據塊的大小除以原始數據的所獲得的壓縮比例: 23%(Comp),及壓縮后的數據規模是原始數據規模的 23%。
10、內存中存在的數據行數是0,表示內存中沒有數據緩存。
11、獲取數據塊信息的過程中讀取頭(tou)文件(jian)的時間開銷 1 微秒(SeekHeaderTime)。
支持版(ban)本:指(zhi)定(ding)計算(suan)算(suan)法(fa)(fa)的(de)功能(neng)(neng)從2.1.0.x 版(ban)本開始,2.1.0.0之前的(de)版(ban)本不支持指(zhi)定(ding)使用算(suan)法(fa)(fa)的(de)功能(neng)(neng)。
TAOS SQL中特殊關鍵詞
TBNAME: 在超級表查詢中可視為一個特殊的標簽,代表查詢涉及的子表名
_c0: 表示表(超級表)的(de)第一列(lie) _qstart,_qstop,_qduration: 表示查詢(xun)過濾窗口(kou)(kou)(kou)的(de)起始,結束以及持(chi)續時(shi)間(從(cong) 2.6.0.0 版(ban)本開始支(zhi)(zhi)持(chi)) _wstart,_wstop,_wduration: 窗口(kou)(kou)(kou)切分聚合查詢(xun)(例如 interval/session window/state window)中表示每個切分窗口(kou)(kou)(kou)的(de)起始,結束以及持(chi)續時(shi)間(從(cong) 2.6.0.0 版(ban)本開始支(zhi)(zhi)持(chi))
小技巧
獲取一個超級表所(suo)有的子(zi)表名(ming)及相關的標(biao)簽信息:
SELECT TBNAME, location FROM meters;
統計超級表下轄子表數(shu)量:
SELECT COUNT(TBNAME) FROM meters;
以上兩個查詢均只支持在WHERE條(tiao)件子句中添加針對標簽(TAGS)的過濾條(tiao)件。例如:
taos> SELECT TBNAME, location FROM meters;
tbname | location |
==================================================================
d1004 | Beijing.Haidian |
d1003 | Beijing.Haidian |
d1002 | Beijing.Chaoyang |
d1001 | Beijing.Chaoyang |
Query OK, 4 row(s) in set (0.000881s)
taos> SELECT COUNT(tbname) FROM meters WHERE groupId > 2;
count(tbname) |
========================
2 |
Query OK, 1 row(s) in set (0.001091s)
- 可以使用 * 返回所有列,或指定列名。可以對數字列進行四則運算,可以給輸出的列取列名。
- 暫不支持含列名的四則運算表達式用于條件過濾算子(例如,不支持
where a*2>6;,但可以寫where a>6/2;)。 - 暫不支持含列名的四則運算表達式作為 SQL 函數的應用對象(例如,不支持
select min(2*a) from t;,但可以寫select 2*min(a) from t;)。
- 暫不支持含列名的四則運算表達式用于條件過濾算子(例如,不支持
- WHERE 語句可以使用各種邏輯判斷來過濾數字值,或使用通配符來過濾字符串。
- 輸出結果缺省按首列時間戳升序排序,但可以指定按降序排序( _c0 指首列時間戳)。使用 ORDER BY 對其他字段進行排序,排序結果順序不確定。
- 參數 LIMIT 控制輸出條數,OFFSET 指定從第幾條開始輸出。LIMIT/OFFSET 對結果集的執行順序在 ORDER BY 之后。且
LIMIT 5 OFFSET 2可以簡寫為LIMIT 2, 5。- 在有 GROUP BY 子句的情況下,LIMIT 參數控制的是每個分組中至多允許輸出的條數。
- 參數 SLIMIT 控制由 GROUP BY 指令劃分的分組中,至多允許輸出幾個分組的數據。且
SLIMIT 5 SOFFSET 2可以簡寫為SLIMIT 2, 5。 - 通過 “>>” 輸出結果可以導出到指定文件。
支持的條件過濾操作
| Operation | Note | Applicable Data Types |
|---|---|---|
| > | larger than | all types except bool |
| < | smaller than | all types except bool |
| >= | larger than or equal to | all types except bool |
| <= | smaller than or equal to | all types except bool |
| = | equal to | all types |
| <> | not equal to | all types |
| is [not] null | is null or is not null | all types |
| between and | within a certain range | all types except bool |
| in | match any value in a set | all types except first column timestamp |
| like | match a wildcard string | binary nchar |
| match/nmatch | filter regex | binary nchar |
-
<> 算(suan)子(zi)也可以寫為 != ,請注(zhu)意,這個算(suan)子(zi)不(bu)能用于(yu)數據表第一列的 timestamp 字段(duan)。
-
like 算子使用通配(pei)符字符串進行匹配(pei)檢查。
- 在通配符字符串中:'%'(百分號)匹配 0 到任意個字符;'_'(下劃線)匹配單個任意ASCII字符。
- 如果希望匹配字符串中原本就帶有的 _(下劃線)字符,那么可以在通配符字符串中寫作
\_,也即加一個反斜線來進行轉義。(從 2.2.0.0 版本開始支持) - 通配符字符串最長不能超過 20 字節。(從 2.1.6.1 版本開始,通配符字符串的長度放寬到了 100 字節,并可以通過 taos.cfg 中的 maxWildCardsLength 參數來配置這一長度限制。但不建議使用太長的通配符字符串,將有可能嚴重影響 LIKE 操作的執行性能。)
-
同(tong)(tong)時進行多個字段的范圍過(guo)濾,需要使(shi)用關鍵(jian)詞 AND 來連接(jie)不同(tong)(tong)的查詢(xun)(xun)條件,暫不支持 OR 連接(jie)的不同(tong)(tong)列之間的查詢(xun)(xun)過(guo)濾條件。
- 從 2.3.0.0 版本開始,已支持完整的同一列和/或不同列間的 AND/OR 運算。
-
針對單一字段的過濾,如果是時間過濾條件,則一條語句中只支持設定一個;但針對其他的(普通)列或標簽列,則可以使用
OR關鍵字進行組合條件的查詢過濾。例如:((value > 20 AND value < 30) OR (value < 12))。- 從 2.3.0.0 版本開始,允許使用多個時間過濾條件,但首列時間戳的過濾運算結果只能包含一個區間。
-
從 2.0.17.0 版本開始,條件過濾開始支持 BETWEEN AND 語法,例如
WHERE col2 BETWEEN 1.5 AND 3.25表(biao)示查(cha)詢(xun)條件為“1.5 ≤ col2 ≤ 3.25”。 -
從 2.1.4.0 版本開始,條件過濾開始支持 IN 算子,例如
WHERE city IN ('Beijing', 'Shanghai')。說明:BOOL 類型寫作{true, false}或{0, 1}均可,但不(bu)能(neng)寫(xie)作 0、1 之外的整數;FLOAT 和 DOUBLE 類(lei)型會受到浮點數精(jing)(jing)度(du)影響,集合內(nei)的值在精(jing)(jing)度(du)范圍內(nei)認為和數據行(xing)的值完全相等才能(neng)匹配成功;TIMESTAMP 類(lei)型支持非主鍵(jian)的列。 -
從2.3.0.0版本開(kai)始,條件(jian)過(guo)濾開(kai)始支(zhi)持正則表達式,關鍵字 match/nmatch 不區分大小(xiao)寫。
語法
WHERE (column|tag|tbname) match/MATCH/nmatch/NMATCH regex
match/MATCH 匹配正則表達式
nmatch/NMATCH 不(bu)匹(pi)配正則表達式
正則表達式規范
確保使用(yong)的(de)正則(ze)表達式(shi)符合(he)POSIX的(de)規范,具(ju)體規范內容可參見 ,目(mu)前(qian) TDengine 使用(yong)的(de)是(shi)(shi) glibc 里面的(de) regex 實(shi)現(xian),使用(yong)正則(ze)表達式(shi)進(jin)行 match 時(shi)是(shi)(shi)區分大小寫的(de)
正則表達使用示例
taos> select distinct location from meters; location | =================== beijing | shanghai | Query OK, 2 row(s) in set (0.003513s) taos> select count(*) from meters; count(*) | ======================== 100000 | Query OK, 1 row(s) in set (0.015054s) taos> select count(*) from meters where location match '^b'; count(*) | ======================== 48000 | Query OK, 1 row(s) in set (0.006977s) taos> select count(*) from meters where location nmatch '^b'; count(*) | ======================== 52000 | Query OK, 1 row(s) in set (0.008188s)使用限制
只能(neng)針對表名 (tbname) 以(yi)及(ji)binary類型的普通列或標(biao)簽進行正則表達式(shi)過濾。
正則匹配字符串長度不能超過 128 字節。可以通過參數 maxRegexStringLen 設置和調整最大(da)允許(xu)的正則匹配字符串,該(gai)參(can)數是客戶(hu)端配置參(can)數,需要(yao)重啟(qi)客戶(hu)端才能生效。
JOIN 子句
從 2.2.0.0 版(ban)本開始,TDengine 對內(nei)連(lian)(lian)接(jie)(jie)(INNER JOIN)中(zhong)的(de)(de)(de)自然(ran)連(lian)(lian)接(jie)(jie)(Natural join)操作實現了完整的(de)(de)(de)支持。也(ye)即(ji)支持“普通(tong)表(biao)(biao)與普通(tong)表(biao)(biao)之(zhi)間”、“超級表(biao)(biao)與超級表(biao)(biao)之(zhi)間”、“子(zi)查詢與子(zi)查詢之(zhi)間”進行自然(ran)連(lian)(lian)接(jie)(jie)。自然(ran)連(lian)(lian)接(jie)(jie)與內(nei)連(lian)(lian)接(jie)(jie)的(de)(de)(de)主要區別是,自然(ran)連(lian)(lian)接(jie)(jie)要求參與連(lian)(lian)接(jie)(jie)的(de)(de)(de)字段在不同(tong)(tong)的(de)(de)(de)表(biao)(biao)/超級表(biao)(biao)中(zhong)必須是同(tong)(tong)名字段。也(ye)即(ji),TDengine 在連(lian)(lian)接(jie)(jie)關系的(de)(de)(de)表(biao)(biao)達中(zhong),要求必須使用同(tong)(tong)名數(shu)據列(lie)/標(biao)簽列(lie)的(de)(de)(de)相等關系。
在(zai)普通表(biao)與(yu)普通表(biao)之間(jian)的 JOIN 操(cao)作中,只能(neng)使用主鍵(jian)時間(jian)戳之間(jian)的相等關系。例如:
SELECT *
FROM temp_tb_1 t1, pressure_tb_1 t2
WHERE t1.ts = t2.ts
在超級表與超級表之間(jian)(jian)的(de)(de) JOIN 操(cao)作中,除了主鍵時間(jian)(jian)戳一(yi)致的(de)(de)條件外,還要求引入能(neng)實現(xian)一(yi)一(yi)對應的(de)(de)標簽列(lie)的(de)(de)相(xiang)等關(guan)系。例(li)如:
SELECT *
FROM temp_stable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;
類似地,也(ye)可以對多個子查詢(xun)的查詢(xun)結果進(jin)行 JOIN 操作(zuo)。
注意(yi),JOIN 操作(zuo)存在如下限制要求(qiu):
- 參與一條語句中 JOIN 操作的表/超級表最多可以有 10 個。
- 在包含 JOIN 操作的查詢語句中不支持 FILL。
- 暫不支持參與 JOIN 操作的表之間聚合后的四則運算。
- 不支持只對其中一部分表做 GROUP BY。
- JOIN 查詢的不同表的過濾條件之間不能為 OR。
- JOIN 查詢要求連接條件不能是普通列,只能針對標簽和主時間字段列(第一列)。
嵌套查詢
“嵌套查(cha)(cha)詢(xun)”又稱為(wei)“子查(cha)(cha)詢(xun)”,也即在(zai)一條 SQL 語句中,“內層查(cha)(cha)詢(xun)”的計(ji)算(suan)結果(guo)可(ke)以(yi)作為(wei)“外層查(cha)(cha)詢(xun)”的計(ji)算(suan)對象來使用。
從 2.2.0.0 版本開(kai)始(shi),TDengine 的(de)查(cha)詢(xun)引擎開(kai)始(shi)支持在(zai) FROM 子(zi)句(ju)中(zhong)使用(yong)非(fei)關聯(lian)子(zi)查(cha)詢(xun)(“非(fei)關聯(lian)”的(de)意思是(shi),子(zi)查(cha)詢(xun)不會用(yong)到(dao)父查(cha)詢(xun)中(zhong)的(de)參數)。也即在(zai)普通 SELECT 語句(ju)的(de) tb_name_list 位置,用(yong)一(yi)個獨立(li)的(de) SELECT 語句(ju)來代替(這(zhe)一(yi) SELECT 語句(ju)被包含在(zai)英文圓括(kuo)號(hao)內),于(yu)是(shi)完(wan)整的(de)嵌套查(cha)詢(xun) SQL 語句(ju)形如:
SELECT ... FROM (SELECT ... FROM ...) ...;
說明:
- 目前僅支持一層嵌套,也即不能在子查詢中再嵌入子查詢。
- 內層查詢的返回結果將作為“虛擬表”供外層查詢使用,此虛擬表可以使用 AS 語法做重命名,以便于外層查詢中方便引用。
- 目前不能在“連續查詢”功能中使用子查詢。
- 在內層和外層查詢中,都支持普通的表間/超級表間 JOIN。內層查詢的計算結果也可以再參與數據子表的 JOIN 操作。
- 目前內層查詢、外層查詢均不支持 UNION 操作。
- 內層查詢支持的功能特性與非嵌套的查詢語句能力是一致的。
- 內層查詢的 ORDER BY 子句一般沒有意義,建議避免這樣的寫法以免無謂的資源消耗。
- 與非嵌套的查詢語句相比,外層查詢所能支持的功能特性存在如下限制:
- 計算函數部分:
- 如果內層查詢的結果數據未提供時間戳,那么計算過程依賴時間戳的函數在外層會無法正常工作。例如:TOP, BOTTOM, FIRST, LAST, DIFF。
- 計算過程需要兩遍掃描的函數,在外層查詢中無法正常工作。例如:此類函數包括:STDDEV, PERCENTILE。
- 外層查詢中不支持 IN 算子,但在內層中可以使用。
- 外層查詢不支持 GROUP BY。
- 計算函數部分:
UNION ALL 子句
SELECT ...
UNION ALL SELECT ...
[UNION ALL SELECT ...]
TDengine 支(zhi)(zhi)持(chi) UNION ALL 操(cao)作符。也(ye)就是(shi)說,如(ru)果多個 SELECT 子句返回(hui)結果集(ji)的(de)結構完全相同(列(lie)名、列(lie)類型、列(lie)數、順序(xu)),那么(me)可以通過(guo) UNION ALL 把這些結果集(ji)合(he)并到一起。目前(qian)只支(zhi)(zhi)持(chi) UNION ALL 模式(shi),也(ye)即在結果集(ji)的(de)合(he)并過(guo)程中是(shi)不去重的(de)。在同一個sql語句中,UNION ALL 最(zui)多支(zhi)(zhi)持(chi)100個。
SQL 示例
-
對于下(xia)面的例子,表tb1用以下(xia)語句創(chuang)建(jian):
CREATE TABLE tb1 (ts TIMESTAMP, col1 INT, col2 FLOAT, col3 BINARY(50)); -
查(cha)詢tb1剛過(guo)去的一個(ge)小時的所有(you)記(ji)錄:
SELECT * FROM tb1 WHERE ts >= NOW - 1h; -
查詢表tb1從2018-06-01 08:00:00.000 到2018-06-02 08:00:00.000時間(jian)范圍,并(bing)且col3的字(zi)符(fu)串是'nny'結尾的記錄,結果按(an)照時間(jian)戳降序:
SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC; -
查詢col1與(yu)col2的和(he),并取名complex, 時(shi)間大于(yu)2018-06-01 08:00:00.000, col2大于(yu)1.2,結果(guo)輸出僅(jin)僅(jin)10條記錄,從第5條開始(shi):
SELECT (col1 + col2) AS 'complex' FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5; -
查詢過去10分鐘的記錄,col2的值大于3.14,并且將結果輸出到文件
/home/testoutpu.csv:SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv;
SQL 函數
聚合函數
TDengine支(zhi)持(chi)針對數據的聚合查詢。提供支(zhi)持(chi)的聚合和選(xuan)擇函數如下:
-
COUNT
SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];功(gong)能說明:統計表(biao)/超級表(biao)中記錄(lu)行(xing)數或某列的(de)非空值個數。
返(fan)回結果數據類型(xing):長整型(xing)INT64。
應(ying)用字段:應(ying)用全部字段。
適用于:表、超級表。
說明:
1)可以使(shi)(shi)用星(xing)號(*)來替代(dai)具體的(de)字(zi)段,使(shi)(shi)用星(xing)號(*)返回全部記錄數量。
2)針對同一表的(不包含NULL值)字段查(cha)詢結(jie)果(guo)均相同。
3)如果統計對象(xiang)是具體的列,則返回(hui)該列中非NULL值(zhi)的記錄數量(liang)。
示例:
taos> SELECT COUNT(*), COUNT(voltage) FROM meters; count(*) | count(voltage) | ================================================ 9 | 9 | Query OK, 1 row(s) in set (0.004475s) taos> SELECT COUNT(*), COUNT(voltage) FROM d1001; count(*) | count(voltage) | ================================================ 3 | 3 | Query OK, 1 row(s) in set (0.001075s) -
AVG
SELECT AVG(field_name) FROM tb_name [WHERE clause];功(gong)能說明:統計表/超(chao)級表中某(mou)列的平均值。
返回(hui)結果數(shu)據類型(xing):雙精度浮(fu)點數(shu)Double。
應用(yong)(yong)字段(duan)(duan):不能應用(yong)(yong)在timestamp、binary、nchar、bool字段(duan)(duan)。
適用于:表、超級表。
示例:
taos> SELECT AVG(current), AVG(voltage), AVG(phase) FROM meters; avg(current) | avg(voltage) | avg(phase) | ==================================================================================== 11.466666751 | 220.444444444 | 0.293333333 | Query OK, 1 row(s) in set (0.004135s) taos> SELECT AVG(current), AVG(voltage), AVG(phase) FROM d1001; avg(current) | avg(voltage) | avg(phase) | ==================================================================================== 11.733333588 | 219.333333333 | 0.316666673 | Query OK, 1 row(s) in set (0.000943s) -
TWA
SELECT TWA(field_name) FROM tb_name WHERE clause;功能說明(ming):時間(jian)加(jia)(jia)權(quan)平均函數(shu)。統計(ji)表中某列在一段時間(jian)內的時間(jian)加(jia)(jia)權(quan)平均。
返回(hui)結果數據類型:雙精度浮點數Double。
應用(yong)字(zi)段(duan):不能應用(yong)在timestamp、binary、nchar、bool類型字(zi)段(duan)。
適用于:表、(超級表)。
說明:從 2.1.3.0 版本開(kai)始,TWA 函數可以(yi)在(zai)由 GROUP BY 劃分出單獨時間線的(de)情況下用于超級表(biao)(也即(ji) GROUP BY tbname)。
-
IRATE
SELECT IRATE(field_name) FROM tb_name WHERE clause;功(gong)能說明:計(ji)算(suan)(suan)瞬時(shi)增(zeng)長率。使用時(shi)間(jian)區間(jian)中最后兩個(ge)樣(yang)本數據來計(ji)算(suan)(suan)瞬時(shi)增(zeng)長速率;如果這兩個(ge)值呈遞減(jian)關系,那么只取最后一個(ge)數用于計(ji)算(suan)(suan),而(er)不是(shi)使用二者差值。
返回結果(guo)數(shu)據(ju)類型(xing):雙精度浮點數(shu)Double。
應用字(zi)段(duan):不能應用在timestamp、binary、nchar、bool類型字(zi)段(duan)。
適用于:表、(超級表)。
說明:(從 2.1.3.0 版本開(kai)始新增此函數(shu))IRATE 可以在由 GROUP BY 劃分出(chu)單獨時(shi)間線的情況下用(yong)于(yu)超(chao)級表(也即 GROUP BY tbname)。
-
SUM
SELECT SUM(field_name) FROM tb_name [WHERE clause];功能說(shuo)明(ming):統計(ji)表(biao)/超級表(biao)中(zhong)某列的和。
返(fan)回結(jie)果(guo)數據類型(xing):雙精度浮點數Double和長整型(xing)INT64。
應用(yong)字段:不能應用(yong)在(zai)timestamp、binary、nchar、bool類(lei)型字段。
適用于:表、超級表。
示例:
taos> SELECT SUM(current), SUM(voltage), SUM(phase) FROM meters; sum(current) | sum(voltage) | sum(phase) | ================================================================================ 103.200000763 | 1984 | 2.640000001 | Query OK, 1 row(s) in set (0.001702s) taos> SELECT SUM(current), SUM(voltage), SUM(phase) FROM d1001; sum(current) | sum(voltage) | sum(phase) | ================================================================================ 35.200000763 | 658 | 0.950000018 | Query OK, 1 row(s) in set (0.000980s) -
STDDEV
SELECT STDDEV(field_name) FROM tb_name [WHERE clause];功能(neng)說明:統計表中(zhong)某列的均方差。
返回結果數(shu)據(ju)類型:雙精(jing)度浮(fu)點(dian)數(shu)Double。
應(ying)用(yong)字段:不能應(ying)用(yong)在timestamp、binary、nchar、bool類型字段。
適用于:表。(從 2.0.15.1 版本開始,本函數也支持超級表)
示例:
taos> SELECT STDDEV(current) FROM d1001; stddev(current) | ============================ 1.020892909 | Query OK, 1 row(s) in set (0.000915s) -
LEASTSQUARES
SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause];功(gong)能說明:統(tong)計表(biao)中(zhong)某列的值(zhi)是(shi)主鍵(jian)(時間戳)的擬合直(zhi)線方(fang)程。start_val是(shi)自變(bian)量初始值(zhi),step_val是(shi)自變(bian)量的步長(chang)值(zhi)。
返(fan)回結果(guo)數據類型:字(zi)符串表達式(斜率, 截距)。
應(ying)用字(zi)段(duan):不能應(ying)用在timestamp、binary、nchar、bool類(lei)型字(zi)段(duan)。
說明:自變量是時(shi)間戳,因變量是該列的(de)值。
適用于:表。
示例:
taos> SELECT LEASTSQUARES(current, 1, 1) FROM d1001; leastsquares(current, 1, 1) | ===================================================== {slop:1.000000, intercept:9.733334} | Query OK, 1 row(s) in set (0.000921s) -
MODE
SELECT MODE(field_name) FROM tb_name [WHERE clause];功能(neng)說明:返(fan)回出現(xian)頻率(lv)最(zui)高的值,若(ruo)存在多(duo)個頻率(lv)相同的最(zui)高值,輸出空。不能(neng)匹配標簽、時間戳輸出。
返(fan)回結果數(shu)據(ju)類型:同應用(yong)的字段。
應用字段:適合(he)于除時間主列(lie)外的任何(he)類(lei)型字段。
支持的版本:2.6.0.x 之(zhi)后的版本。
說明(ming):由于返(fan)(fan)回(hui)數(shu)據量未知,考慮到內存因素,為了函數(shu)可以正常返(fan)(fan)回(hui)結果,建(jian)議不重復的數(shu)據量在(zai)10萬(wan)級別,否則(ze)會(hui)報錯。
示例:
taos> select voltage from d002; voltage | ======================== 1 | 1 | 2 | 19 | Query OK, 4 row(s) in set (0.003545s) taos> select mode(voltage) from d002; mode(voltage) | ======================== 1 | Query OK, 1 row(s) in set (0.019393s) -
HYPERLOGLOG
SELECT HYPERLOGLOG(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:
- 采用hyperloglog算法,返回某列的基數。該算法在數據量很大的情況下,可以明顯降低內存的占用,但是求出來的基數是個估算值,標準誤差(標準誤差是多次實驗,每次的平均數的標準差,不是與真實結果的誤差)為0.81%。
- 在數據量較少的時候該算法不是很準確,可以使用select count(data) from (select unique(col) as data from table) 的方法。
返回結(jie)果類(lei)型(xing):整(zheng)形。
適用數據(ju)類型(xing):適合(he)于任何類型(xing)字段。
支持的版(ban)本:2.6.0.x 之(zhi)后的版(ban)本。
示例:
taos> select dbig from shll; dbig | ======================== 1 | 1 | 1 | NULL | 2 | 19 | NULL | 9 | Query OK, 8 row(s) in set (0.003755s) taos> select hyperloglog(dbig) from shll; hyperloglog(dbig)| ======================== 4 | Query OK, 1 row(s) in set (0.008388s)
選擇函數
在使用所(suo)有(you)的(de)選擇函數(shu)的(de)時(shi)(shi)候,可(ke)以同時(shi)(shi)指定輸出 ts 列(lie)或標(biao)簽(qian)列(lie)(包(bao)括(kuo) tbname),這樣就可(ke)以方便地(di)知道被選出的(de)值是源于哪個數(shu)據行的(de)。
-
MIN
SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];功能說(shuo)明:統計表(biao)/超級表(biao)中某列(lie)的值(zhi)最小值(zhi)。
返回結(jie)果數(shu)據類(lei)型(xing):同應(ying)用的字段。
應用字段:不(bu)能應用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級表。
示例:
taos> SELECT MIN(current), MIN(voltage) FROM meters; min(current) | min(voltage) | ====================================== 10.20000 | 218 | Query OK, 1 row(s) in set (0.001765s) taos> SELECT MIN(current), MIN(voltage) FROM d1001; min(current) | min(voltage) | ====================================== 10.30000 | 218 | Query OK, 1 row(s) in set (0.000950s) -
MAX
SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說(shuo)明:統(tong)計表/超級(ji)表中某列的值(zhi)最大值(zhi)。
返回結果數(shu)據類型:同(tong)應(ying)用的字段。
應(ying)用字段(duan):不能(neng)應(ying)用在timestamp、binary、nchar、bool類型字段(duan)。
適用于:表、超級表。
示例:
taos> SELECT MAX(current), MAX(voltage) FROM meters; max(current) | max(voltage) | ====================================== 13.40000 | 223 | Query OK, 1 row(s) in set (0.001123s) taos> SELECT MAX(current), MAX(voltage) FROM d1001; max(current) | max(voltage) | ====================================== 12.60000 | 221 | Query OK, 1 row(s) in set (0.000987s) -
FIRST
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:統計(ji)表/超級表中某(mou)列的(de)值最先(xian)寫(xie)入的(de)非NULL值。
返回結果數據(ju)類型:同應(ying)用的字段。
應用字(zi)段:所(suo)有字(zi)段。
適用于:表、超級表。
說明:
1)如果要(yao)返回各(ge)個列(lie)的(de)首(shou)個(時間戳(chuo)最小)非NULL值(zhi),可以使用FIRST(*);
2)如果(guo)(guo)結(jie)果(guo)(guo)集中的某(mou)列全部為NULL值,則該列的返回結(jie)果(guo)(guo)也是NULL;
3)如果(guo)結果(guo)集中(zhong)所有(you)列全部為NULL值(zhi),則(ze)不返(fan)回結果(guo)。
示例:
taos> SELECT FIRST(*) FROM meters; first(ts) | first(current) | first(voltage) | first(phase) | ========================================================================================= 2018-10-03 14:38:04.000 | 10.20000 | 220 | 0.23000 | Query OK, 1 row(s) in set (0.004767s) taos> SELECT FIRST(current) FROM d1002; first(current) | ======================= 10.20000 | Query OK, 1 row(s) in set (0.001023s) -
LAST
SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];功能(neng)說明(ming):統計表(biao)/超級表(biao)中(zhong)某(mou)列的值最后寫入的非 NULL 值。
返回結果數據類型:同應用的字段。
應用字(zi)段(duan):所有(you)字(zi)段(duan)。
適用于:表、超級表。
說明:
1)如(ru)果要返回(hui)各個(ge)(ge)列的最后(時間戳(chuo)最大)一個(ge)(ge)非 NULL 值(zhi),可以使(shi)用(yong) LAST(*);
2)如果(guo)(guo)結(jie)果(guo)(guo)集中的某列全部為(wei) NULL 值,則該列的返回結(jie)果(guo)(guo)也(ye)是 NULL;如果(guo)(guo)結(jie)果(guo)(guo)集中所(suo)有列全部為(wei) NULL 值,則不返回結(jie)果(guo)(guo)。
3)在用于超級表時,時間戳完(wan)全一樣且同為(wei)最(zui)大的數據(ju)行(xing)(xing)可能有多(duo)個,那么會從中隨機返回一條,而并不保證多(duo)次運(yun)行(xing)(xing)所(suo)挑選的數據(ju)行(xing)(xing)必(bi)然一致。
示例:
taos> SELECT LAST(*) FROM meters; last(ts) | last(current) | last(voltage) | last(phase) | ======================================================================================== 2018-10-03 14:38:16.800 | 12.30000 | 221 | 0.31000 | Query OK, 1 row(s) in set (0.001452s) taos> SELECT LAST(current) FROM d1002; last(current) | ======================= 10.30000 | Query OK, 1 row(s) in set (0.000843s) -
TOP
SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause];功能說明: 統計表/超級表中某列的值最大 k 個(ge)非 NULL 值。如(ru)果多條(tiao)數據取值一樣,全部取用又會(hui)超(chao)出 k 條(tiao)限(xian)制時(shi),系(xi)統會(hui)從(cong)相同(tong)值中(zhong)隨(sui)機選(xuan)取符合要求的數量(liang)返回。
返(fan)回(hui)結果數據類(lei)型:同應用的字段(duan)。
應用(yong)字段(duan):不能應用(yong)在(zai)timestamp、binary、nchar、bool類型(xing)字段(duan)。
適用于:表、超級表。
說明:
1)k值取值范圍1≤k≤100;
2)系統同時返(fan)回該(gai)記錄關聯的時間戳列;
3)限(xian)制:TOP函數(shu)不(bu)支持FILL子句。
示例:
taos> SELECT TOP(current, 3) FROM meters; ts | top(current, 3) | ================================================= 2018-10-03 14:38:15.000 | 12.60000 | 2018-10-03 14:38:16.600 | 13.40000 | 2018-10-03 14:38:16.800 | 12.30000 | Query OK, 3 row(s) in set (0.001548s) taos> SELECT TOP(current, 2) FROM d1001; ts | top(current, 2) | ================================================= 2018-10-03 14:38:15.000 | 12.60000 | 2018-10-03 14:38:16.800 | 12.30000 | Query OK, 2 row(s) in set (0.000810s) -
BOTTOM
SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];功能說明:統計表/超級表中某列的值最小 k 個非 NULL 值。如果多條(tiao)(tiao)數(shu)據(ju)取值一樣,全部取用又會超出 k 條(tiao)(tiao)限制時,系(xi)統會從相同值中隨機(ji)選取符合要求的數(shu)量返(fan)回(hui)。
返(fan)回結果數(shu)據類型(xing):同應(ying)用的字段。
應(ying)用字段:不能應(ying)用在(zai)timestamp、binary、nchar、bool類型字段。
適用于:表、超級表。
說明:
1)k值取值范圍1≤k≤100;
2)系統(tong)同時返回該記錄關聯的時間戳列;
3)限制:BOTTOM函(han)數不支持FILL子句。
示例:
taos> SELECT BOTTOM(voltage, 2) FROM meters; ts | bottom(voltage, 2) | =============================================== 2018-10-03 14:38:15.000 | 218 | 2018-10-03 14:38:16.650 | 218 | Query OK, 2 row(s) in set (0.001332s) taos> SELECT BOTTOM(current, 2) FROM d1001; ts | bottom(current, 2) | ================================================= 2018-10-03 14:38:05.000 | 10.30000 | 2018-10-03 14:38:16.800 | 12.30000 | Query OK, 2 row(s) in set (0.000793s) -
PERCENTILE
SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];功能說(shuo)明:統計表中(zhong)某(mou)列的值(zhi)百分比(bi)分位(wei)數。
返回結果數據類(lei)型: 雙(shuang)精度浮點數Double。
應(ying)用字段(duan):不(bu)能應(ying)用在timestamp、binary、nchar、bool類(lei)型字段(duan)。
適用于:表。
說明:P值取值范圍0≤P≤100,為0的(de)時(shi)候等同(tong)于MIN,為100的(de)時(shi)候等同(tong)于MAX。
示例:
taos> SELECT PERCENTILE(current, 20) FROM d1001; percentile(current, 20) | ============================ 11.100000191 | Query OK, 1 row(s) in set (0.000787s) -
APERCENTILE
SELECT APERCENTILE(field_name, P[, algo_type]) FROM { tb_name | stb_name } [WHERE clause]功能(neng)說(shuo)明:統計(ji)表/超級表中指定列的(de)值百分比分位數,與PERCENTILE函(han)數相(xiang)似(si),但是返回近似(si)結果。
返回結果(guo)數據類型: 雙精度浮點(dian)數Double。
應用(yong)字段(duan):不(bu)能應用(yong)在timestamp、binary、nchar、bool類型字段(duan)。
適用于:表、超級表。
說明:
P值有效取值范圍0≤P≤100,為 0 的時候等同于 MIN,為 100 的時候等同于MAX;
algo_type的有效輸入:default 和 t-digest。 用于指定計算近似分位數的算法。可不提供第三個參數的輸入,此時將使用 default 的算法進行計算,即 apercentile(column_name, 50, "default") 與 apercentile(column_name, 50) 等價。當使用“t-digest”參數的時候,將使用t-digest方式采樣計算近似分位數。但該參數指定計算算法的功能從2.2.0.x版本開始支持,2.2.0.0之前的版本不支持指定使用算法的功能。嵌(qian)套(tao)子(zi)查詢支持:適用于內層(ceng)查詢和(he)外層(ceng)查詢。
taos> SELECT APERCENTILE(current, 20) FROM d1001; apercentile(current, 20) | ============================ 10.300000191 | Query OK, 1 row(s) in set (0.000645s) taos> select apercentile (count, 80, 'default') from stb1; apercentile (c0, 80, 'default') | ================================== 601920857.210056424 | Query OK, 1 row(s) in set (0.012363s) taos> select apercentile (count, 80, 't-digest') from stb1; apercentile (c0, 80, 't-digest') | =================================== 605869120.966666579 | Query OK, 1 row(s) in set (0.011639s) -
LAST_ROW
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };功能說(shuo)明:返回表(biao)/超級(ji)表(biao)的最后(hou)一條記(ji)錄。
返回(hui)結果數據(ju)類型(xing):同應用的字段。
應用字段:所有字段。
適用于:表、超級表。
限(xian)制(zhi):LAST_ROW() 不能與 INTERVAL 一起(qi)使用。
說明:在用于超級表時,時間戳完全一樣且同為最大的數據行可能有多個,那么會從中隨機返回一條,而并不保證多次運行所挑選的數據行必然一致。
示例:taos> SELECT LAST_ROW(current) FROM meters; last_row(current) | ======================= 12.30000 | Query OK, 1 row(s) in set (0.001238s) taos> SELECT LAST_ROW(current) FROM d1002; last_row(current) | ======================= 10.30000 | Query OK, 1 row(s) in set (0.001042s) -
INTERP [2.3.1及之后的版本]
SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];功(gong)能說(shuo)明(ming):返回表/超級表的指定(ding)時間截面指定(ding)列的記錄值(插值)。
返(fan)回結果數據(ju)類(lei)型:同(tong)字段類(lei)型。
應用字段(duan):數值(zhi)型字段(duan)。
適用于:表、超級表、嵌套查詢。
說明: 1)INTERP用于在指定時間斷(duan)(duan)面獲取(qu)指定列(lie)的記錄值,如果該時間斷(duan)(duan)面不存在符合條件的行(xing)數據(ju),那么會根據(ju) FILL 參數的設定進(jin)行(xing)插值。
2)INTERP的(de)輸入(ru)數據為(wei)指(zhi)定列(lie)的(de)數據,可以(yi)通過條(tiao)件語句(where子句)來對原始(shi)列(lie)數據進行過濾,如果沒有指(zhi)定過濾條(tiao)件則(ze)輸入(ru)為(wei)全部數據。
3)INTERP的輸(shu)出(chu)時(shi)間(jian)(jian)范(fan)圍根(gen)據(ju)(ju)RANGE(timestamp1,timestamp2)字段來指定,需滿足(zu)timestamp1<=timestamp2。其中(zhong)timestamp1(必(bi)選值(zhi)(zhi))為輸(shu)出(chu)時(shi)間(jian)(jian)范(fan)圍的起始值(zhi)(zhi),即(ji)如果(guo)timestamp1時(shi)刻符合插值(zhi)(zhi)條(tiao)(tiao)件(jian)則timestamp1為輸(shu)出(chu)的第一(yi)(yi)條(tiao)(tiao)記錄(lu)(lu),timestamp2(必(bi)選值(zhi)(zhi))為輸(shu)出(chu)時(shi)間(jian)(jian)范(fan)圍的結束值(zhi)(zhi),即(ji)輸(shu)出(chu)的最后一(yi)(yi)條(tiao)(tiao)記錄(lu)(lu)的timestamp不能大于timestamp2。如果(guo)沒有指定RANGE,那(nei)么(me)滿足(zu)過濾(lv)條(tiao)(tiao)件(jian)的輸(shu)入數(shu)據(ju)(ju)中(zhong)第一(yi)(yi)條(tiao)(tiao)記錄(lu)(lu)的timestamp即(ji)為timestamp1,最后一(yi)(yi)條(tiao)(tiao)記錄(lu)(lu)的timestamp即(ji)為timestamp2,同樣(yang)也滿足(zu)timestamp1 <= timestamp2。
4)INTERP根據(ju)EVERY字段(duan)來(lai)確定(ding)輸出時間范圍內的(de)結果條數,即從timestamp1開(kai)始每(mei)隔固定(ding)長度的(de)時間(EVERY值(zhi))進行插值(zhi)。如(ru)果沒(mei)有指定(ding)EVERY,則默認窗口(kou)大小為無窮大,即從timestamp1開(kai)始只有一個窗口(kou)。
5)INTERP根(gen)據(ju)FILL字段(duan)來決(jue)定在每個符(fu)合輸(shu)出條(tiao)件的時刻如何(he)進行(xing)插(cha)值,如果沒有FILL字段(duan)則(ze)默(mo)認不(bu)插(cha)值,即輸(shu)出為(wei)原(yuan)始(shi)記錄值或不(bu)輸(shu)出(原(yuan)始(shi)記錄不(bu)存在)。
6)INTERP只(zhi)能在一個時間序列內(nei)進(jin)行插值,因(yin)此(ci)當(dang)作(zuo)(zuo)用于超級表時必須跟(gen)group by tbname一起使用,當(dang)作(zuo)(zuo)用嵌套查詢外層(ceng)時內(nei)層(ceng)子查詢不能含(han)GROUP BY信息。
7)INTERP的(de)插值結果(guo)不受ORDER BY timestamp的(de)影響,ORDER BY timestamp只影響輸出結果(guo)的(de)排序。
SQL示例(基于文檔中廣泛使(shi)用的電表(biao) schema )
1) 單點線性插值
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:40:00','2017-7-14 18:40:00') FILL(LINEAR);2) 在2017-07-14 18:00:00到2017-07-14 19:00:00間每隔5秒鐘進行取值(zhi)(不(bu)插值(zhi))
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s);3) 在2017-07-14 18:00:00到2017-07-14 19:00:00間每(mei)隔5秒鐘進行(xing)線性插值
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);4.在所有時間范圍內每隔5秒鐘(zhong)進行向后插(cha)值(zhi)
taos> SELECT INTERP(current) FROM t1 EVERY(5s) FILL(NEXT);5.根(gen)據2017-07-14 17:00:00到(dao)2017-07-14 20:00:00間(jian)的(de)數據進(jin)行從2017-07-14 18:00:00到(dao)2017-07-14 19:00:00間(jian)每隔5秒(miao)鐘進(jin)行線性插值(zhi)
taos> SELECT INTERP(current) FROM t1 where ts >= '2017-07-14 17:00:00' and ts <= '2017-07-14 20:00:00' RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR); -
INTERP [2.3.1之前的版本]
SELECT INTERP(field_name) FROM { tb_name | stb_name } WHERE ts='timestamp' [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];功能說明:返回表(biao)/超級(ji)表(biao)的(de)指定(ding)時間截面、指定(ding)字段的(de)記錄。
返(fan)回結(jie)果數(shu)據類型:同字段(duan)類型。
應用字段(duan):數值型字段(duan)。
適用于:表、超級表。
說明:(從 2.0.15.0 版本開始新增此函數)
1)INTERP 必須指定時間斷面,如果該時間斷面不存在直接對應的數據,那么會根據 FILL 參數的設定進行插值。此外,條件語句里面可附帶篩選條件,例如標簽、tbname。
2)INTERP 查詢要求查詢的時間區間必須位于數據集合(表)的所有記錄的時間范圍之內。如果給定的時間戳位于時間范圍之外,即使有插值指令,仍然不返回結果。
3)單個 INTERP 函數查詢只能夠針對一個時間點進行查詢,如果需要返回等時間間隔的斷面數據,可以通過 INTERP 配合 EVERY 的方式來進行查詢處理(而不是使用 INTERVAL),其含義是每隔固定長度的時間進行插值。
示例:taos> SELECT INTERP(*) FROM meters WHERE ts='2017-7-14 18:40:00.004'; interp(ts) | interp(current) | interp(voltage) | interp(phase) | ========================================================================================== 2017-07-14 18:40:00.004 | 9.84020 | 216 | 0.32222 | Query OK, 1 row(s) in set (0.002652s)如果給定(ding)的時間戳無對應(ying)的數據(ju),在不指定(ding)插(cha)值生(sheng)成(cheng)策略的情況下(xia),不會返回(hui)結(jie)果,如果指定(ding)了(le)插(cha)值策略,會根據(ju)插(cha)值策略返回(hui)結(jie)果。
taos> SELECT INTERP(*) FROM meters WHERE tbname IN ('d636') AND ts='2017-7-14 18:40:00.005'; Query OK, 0 row(s) in set (0.004022s) taos> SELECT INTERP(*) FROM meters WHERE tbname IN ('d636') AND ts='2017-7-14 18:40:00.005' FILL(PREV); interp(ts) | interp(current) | interp(voltage) | interp(phase) | ========================================================================================== 2017-07-14 18:40:00.005 | 9.88150 | 217 | 0.32500 | Query OK, 1 row(s) in set (0.003056s)如下所示代碼表示在時間區間
['2017-7-14 18:40:00', '2017-7-14 18:40:00.014']中每隔 5 毫秒 進行一次斷面(mian)計算(suan)。taos> SELECT INTERP(current) FROM d636 WHERE ts>='2017-7-14 18:40:00' AND ts<='2017-7-14 18:40:00.014' EVERY(5a); ts | interp(current) | ================================================= 2017-07-14 18:40:00.000 | 10.04179 | 2017-07-14 18:40:00.010 | 10.16123 | Query OK, 2 row(s) in set (0.003487s) -
TAIL
SELECT TAIL(field_name, k, offset_val) FROM {tb_name | stb_name} [WHERE clause];功(gong)能說明:返回跳過(guo)最后(hou) offset_value個,然后(hou)取連續(xu) k 個記(ji)錄(lu),不忽略 NULL 值。offset_val 可以不輸入。此時(shi)返回最后(hou)的 k 個記(ji)錄(lu)。當有 offset_val 輸入的情(qing)況(kuang)下(xia),該函數(shu)功(gong)能等效于order by ts desc LIMIT k OFFSET offset_val。
參數范(fan)圍:k: [1,100] offset_val: [0,100]。
返回結果數據類型:同應用的(de)字段。
應用字段:適合于除時間主列外的任何類型(xing)字段。
適用于:表、超級表。
支持(chi)版(ban)本(ben):2.6.0.x 之后的版(ban)本(ben)。
示例:
taos> select ts,dbig from tail2; ts | dbig | ================================================== 2021-10-15 00:31:33.000 | 1 | 2021-10-17 00:31:31.000 | NULL | 2021-12-24 00:31:34.000 | 2 | 2022-01-01 08:00:05.000 | 19 | 2022-01-01 08:00:06.000 | NULL | 2022-01-01 08:00:07.000 | 9 | Query OK, 6 row(s) in set (0.001952s) taos> select tail(dbig,2,2) from tail2; ts | tail(dbig,2,2) | ================================================== 2021-12-24 00:31:34.000 | 2 | 2022-01-01 08:00:05.000 | 19 | Query OK, 2 row(s) in set (0.002307s) -
UNIQUE
SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];功(gong)能說明:返回該列(lie)的(de)(de)數值首(shou)次出(chu)現的(de)(de)值。該函數功(gong)能與 distinct 相似,但是可以(yi)匹配標簽(qian)(qian)(qian)(qian)和(he)(he)時間(jian)戳信息(xi)。可以(yi)針對除時間(jian)列(lie)以(yi)外的(de)(de)字段進行(xing)查(cha)詢,可以(yi)匹配標簽(qian)(qian)(qian)(qian)和(he)(he)時間(jian)戳,其中(zhong)的(de)(de)標簽(qian)(qian)(qian)(qian)和(he)(he)時間(jian)戳是第一次出(chu)現時刻的(de)(de)標簽(qian)(qian)(qian)(qian)和(he)(he)時間(jian)戳。
返(fan)回結(jie)果數據類型(xing):同應用的字段(duan)。
應用字(zi)段:適合于除時間類型(xing)以外的字(zi)段。
適用于:表、超級表。
支持版本:2.6.0.x 之后(hou)的版本。
說明:
- 該函數可以應用在普通表和超級表上。不能和窗口操作一起使用,例如 interval/state_window/session_window 。
- 由于返回數據量未知,考慮到內存因素,為了函數可以正常返回結果,建議不重復的數據量在10萬級別,否則會報錯。
示例:
taos> select ts,voltage from unique1; ts | voltage | ================================================== 2021-10-17 00:31:31.000 | 1 | 2022-01-24 00:31:31.000 | 1 | 2021-10-17 00:31:31.000 | 1 | 2021-12-24 00:31:31.000 | 2 | 2022-01-01 08:00:01.000 | 19 | 2021-10-17 00:31:31.000 | NULL | 2022-01-01 08:00:02.000 | NULL | 2022-01-01 08:00:03.000 | 9 | Query OK, 8 row(s) in set (0.003018s) taos> select unique(voltage) from unique1; ts | unique(voltage) | ================================================== 2021-10-17 00:31:31.000 | 1 | 2021-10-17 00:31:31.000 | NULL | 2021-12-24 00:31:31.000 | 2 | 2022-01-01 08:00:01.000 | 19 | 2022-01-01 08:00:03.000 | 9 | Query OK, 5 row(s) in set (0.108458s)
計算函數
-
DIFF
SELECT {DIFF(field_name, ignore_negative) | DIFF(field_name)} FROM tb_name [WHERE clause];功能(neng)說(shuo)明:統(tong)計(ji)表(biao)中(zhong)某(mou)列的(de)值與前一行對應值的(de)差。 ignore_negative 取值為 0|1 , 可以不(bu)填,默認(ren)值為 0. 不(bu)忽(hu)略負(fu)值。ignore_negative為1時表(biao)示忽(hu)略負(fu)數。
返回(hui)結果數(shu)據類型(xing):同應用字段。
應(ying)用字段:不(bu)能應(ying)用在timestamp、binary、nchar、bool類型字段。
適用于:表、(超級表)。
說(shuo)明:輸出結(jie)果行數(shu)(shu)是范圍內總行數(shu)(shu)減(jian)一(yi)(yi),第一(yi)(yi)行沒有(you)結(jie)果輸出。從 2.1.3.0 版本開(kai)始,DIFF 函數(shu)(shu)可以在由(you) GROUP BY 劃(hua)分出單獨時間(jian)線的情(qing)況下用于超級表(也即 GROUP BY tbname)。從2.6.0開(kai)始,DIFF函數(shu)(shu)支持ignore_negative參數(shu)(shu)
示例:
taos> SELECT DIFF(current) FROM d1001; ts | diff(current) | ================================================= 2018-10-03 14:38:15.000 | 2.30000 | 2018-10-03 14:38:16.800 | -0.30000 | Query OK, 2 row(s) in set (0.001162s) -
DERIVATIVE
SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHERE clause];功(gong)能說明:統計表中某列數(shu)值(zhi)的(de)單位變化率。其中單位時間區(qu)間的(de)長度可(ke)以通(tong)過 time_interval 參數(shu)指定,最小可(ke)以是 1 秒(1s);ignore_negative 參數(shu)的(de)值(zhi)可(ke)以是 0 或 1,為(wei) 1 時表示忽略(lve)負值(zhi)。
返回結果數據類型:雙精度浮點(dian)數。
應(ying)用(yong)字(zi)段:不能(neng)應(ying)用(yong)在 timestamp、binary、nchar、bool 類(lei)型(xing)字(zi)段。
適用于:表、(超級表)。
說(shuo)明:(從 2.1.3.0 版本(ben)開始(shi)新(xin)增此(ci)函(han)數(shu))輸(shu)出(chu)結果行(xing)數(shu)是范(fan)圍內總行(xing)數(shu)減一(yi),第(di)一(yi)行(xing)沒有結果輸(shu)出(chu)。DERIVATIVE 函(han)數(shu)可以在(zai)由 GROUP BY 劃分出(chu)單(dan)獨時間線的情況下(xia)用于超級(ji)表(也即(ji) GROUP BY tbname)。
示例:
taos> select derivative(current, 10m, 0) from t1; ts | derivative(current, 10m, 0) | ======================================================== 2021-08-20 10:11:22.790 | 0.500000000 | 2021-08-20 11:11:22.791 | 0.166666620 | 2021-08-20 12:11:22.791 | 0.000000000 | 2021-08-20 13:11:22.792 | 0.166666620 | 2021-08-20 14:11:22.792 | -0.666666667 | Query OK, 5 row(s) in set (0.004883s) -
SPREAD
SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:統計表(biao)/超級(ji)表(biao)中(zhong)某列的最大值和最小值之差(cha)。
返回結(jie)果數據類(lei)型:雙精(jing)度浮點(dian)數。
應用字(zi)段:不能(neng)應用在(zai)binary、nchar、bool類型字(zi)段。
適用于:表、超級表。
說明:可(ke)用于TIMESTAMP字段,此時(shi)表示記(ji)錄的時(shi)間覆(fu)蓋范圍(wei)。
示例:
taos> SELECT SPREAD(voltage) FROM meters; spread(voltage) | ============================ 5.000000000 | Query OK, 1 row(s) in set (0.001792s) taos> SELECT SPREAD(voltage) FROM d1001; spread(voltage) | ============================ 3.000000000 | Query OK, 1 row(s) in set (0.000836s) -
CEIL
SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];功能(neng)說明(ming):獲得(de)指定列(lie)的向上(shang)取整數的結果。
返(fan)回(hui)(hui)結果(guo)類(lei)型:與(yu)指定列的(de)原(yuan)始數(shu)(shu)據(ju)(ju)類(lei)型一致。例如,如果(guo)指定列的(de)原(yuan)始數(shu)(shu)據(ju)(ju)類(lei)型為 Float,那么返(fan)回(hui)(hui)的(de)數(shu)(shu)據(ju)(ju)類(lei)型也為 Float;如果(guo)指定列的(de)原(yuan)始數(shu)(shu)據(ju)(ju)類(lei)型為 Double,那么返(fan)回(hui)(hui)的(de)數(shu)(shu)據(ju)(ju)類(lei)型也為 Double。
適用數(shu)據類型(xing):不能應(ying)用在(zai)(zai) timestamp、binary、nchar、bool 類型(xing)字段(duan)上;在(zai)(zai)超級表查詢中使(shi)用時(shi),不能應(ying)用在(zai)(zai) tag 列(lie),無論 tag 列(lie)的類型(xing)是什(shen)么類型(xing)。
嵌套子查(cha)詢(xun)支持:適(shi)用于內層(ceng)查(cha)詢(xun)和外層(ceng)查(cha)詢(xun)。
說(shuo)明: 支(zhi)持 +、-、*、/ 運(yun)算,如 ceil(col1) + ceil(col2)。 只能與普(pu)通列,選擇(Selection)、投(tou)影(Projection)函(han)數一(yi)起(qi)使用(yong),不能與聚合(Aggregation)函(han)數一(yi)起(qi)使用(yong)。 該函(han)數可(ke)以應(ying)用(yong)在普(pu)通表和超級表上。
-
FLOOR
SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:獲得指定列的向下取整數的結果。
其(qi)他使用說明參見CEIL函數描(miao)述。 -
ROUND
SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:獲得指定列的四舍五入的結果。
其他使用說明參見CEIL函數描述(shu)。 -
CSUM
SELECT CSUM(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:累加和(Cumulative sum),輸出行與輸入行數相(xiang)同。
返(fan)回(hui)(hui)結(jie)果類型: 輸(shu)入列如果是整數(shu)類型返(fan)回(hui)(hui)值為(wei)長整型 (int64_t),浮點數(shu)返(fan)回(hui)(hui)值為(wei)雙精(jing)度浮點數(shu)(Double)。無符(fu)(fu)號整數(shu)類型返(fan)回(hui)(hui)值為(wei)無符(fu)(fu)號長整型(uint64_t)。 返(fan)回(hui)(hui)結(jie)果中(zhong)同時(shi)帶(dai)有每(mei)行記(ji)錄對應的(de)時(shi)間戳(chuo)。
適用數(shu)據類型:不能應(ying)用在 timestamp、binary、nchar、bool 類型字段(duan)上(shang);在超級表查詢中使用時,不能應(ying)用在標(biao)簽之(zhi)上(shang)。
嵌套子查詢支持: 適用于內層查詢和外層查詢。
補充說明: 不支持 +、-、*、/ 運(yun)算,如 csum(col1) + csum(col2)。只能與聚合(Aggregation)函數一起使用。 該函數可(ke)以應用在(zai)普(pu)通表(biao)和超級(ji)表(biao)上(shang)。 使用在(zai)超級(ji)表(biao)上(shang)的時候,需要搭配 Group by tbname使用,將結果強制規(gui)約到(dao)單個時間線(xian)。
支持版本(ben): 從2.3.0.x開(kai)始支持
-
MAVG
SELECT MAVG(field_name, K) FROM { tb_name | stb_name } [WHERE clause]功能說(shuo)明(ming): 計算連(lian)續 k 個值的(de)移動平均數(shu)(shu)(moving average)。如(ru)果輸(shu)(shu)入(ru)行(xing)數(shu)(shu)小于 k,則(ze)無結果輸(shu)(shu)出。參(can)數(shu)(shu) k 的(de)合法輸(shu)(shu)入(ru)范圍是 1≤ k ≤ 1000。
返(fan)回(hui)結(jie)果類型: 返(fan)回(hui)雙精度浮點數類型。
適用(yong)數據類型: 不能(neng)應用(yong)在 timestamp、binary、nchar、bool 類型上(shang);在超級(ji)表查詢中(zhong)使用(yong)時,不能(neng)應用(yong)在標簽之上(shang)。
嵌套子查(cha)詢支持: 適用于內層查(cha)詢和(he)外層查(cha)詢。
補(bu)充說明: 不支(zhi)持 +、-、*、/ 運算,如 mavg(col1, k1) + mavg(col2, k1); 只(zhi)能(neng)與普(pu)通(tong)列,選擇(ze)(Selection)、投影(ying)(Projection)函(han)數(shu)一起(qi)使用(yong),不能(neng)與聚合(Aggregation)函(han)數(shu)一起(qi)使用(yong);該函(han)數(shu)可以應用(yong)在普(pu)通(tong)表和(he)超級(ji)(ji)表上(shang);使用(yong)在超級(ji)(ji)表上(shang)的時(shi)(shi)候(hou),需要搭配(pei) Group by tbname使用(yong),將結果強制(zhi)規約到單個時(shi)(shi)間線。
支持版本: 從2.3.0.x開始支持
-
SAMPLE
SELECT SAMPLE(field_name, K) FROM { tb_name | stb_name } [WHERE clause]功能說明: 獲取數據的(de) k 個(ge)采樣值。參數 k 的(de)合法輸入范圍是 1≤ k ≤ 1000。
返(fan)回結(jie)果類(lei)型: 同(tong)原始數據類(lei)型, 返(fan)回結(jie)果中帶有該行記錄的時(shi)間戳。
適用(yong)(yong)數據類型(xing): 在超級(ji)表查(cha)詢中使(shi)用(yong)(yong)時,不能(neng)應用(yong)(yong)在標簽之上。
嵌套子查(cha)詢支(zhi)持: 適用于(yu)內層查(cha)詢和外層查(cha)詢。
補充(chong)說明: 不能(neng)參與表(biao)達式計算;該函數可以應用在(zai)普(pu)通表(biao)和(he)超級表(biao)上;使用在(zai)超級表(biao)上的時(shi)候,需要搭配 Group by tbname 使用,將結果強制規(gui)約到單個時(shi)間線(xian)。
支持版本: 從2.3.0.x開始支持
-
ASIN
SELECT ASIN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得(de)指定列的反正弦結(jie)果
返回結果類型(xing):DOUBLE。如果輸入值為(wei)(wei)NULL,輸出值也為(wei)(wei)NULL
適用數據(ju)類(lei)型:不(bu)(bu)能(neng)應用在 timestamp、binary、nchar、bool 類(lei)型字段上;在超級表查(cha)詢中(zhong)使用時,不(bu)(bu)能(neng)應用在 tag 列(lie)
嵌套子查詢支持:適用于內層(ceng)查詢和外層(ceng)查詢。
使用說明:
只能與(yu)(yu)普通列(lie),選擇(ze)(Selection)、投影(Projection)函數一(yi)起(qi)使用,不能與(yu)(yu)聚合(Aggregation)函數一(yi)起(qi)使用。
該(gai)函數(shu)可以應用(yong)在普通表(biao)和超級表(biao)上。
版本2.6.0.x后支(zhi)持
-
ACOS
SELECT ACOS(field_name) FROM { tb_name | stb_name } [WHERE clause]功(gong)能說明:獲得(de)指定列的反余(yu)弦結果
返回結果類(lei)型:DOUBLE。如果輸入值為(wei)NULL,輸出(chu)值也為(wei)NULL
適用(yong)數據類(lei)型(xing):不能應用(yong)在(zai) timestamp、binary、nchar、bool 類(lei)型(xing)字段(duan)上(shang);在(zai)超級表(biao)查詢中使用(yong)時(shi),不能應用(yong)在(zai) tag 列
嵌套(tao)子查詢(xun)支持:適用于內層查詢(xun)和外(wai)層查詢(xun)。
使用說明:
只能與普(pu)通(tong)列,選擇(Selection)、投(tou)影(ying)(Projection)函數一(yi)起使(shi)用(yong),不能與聚合(he)(Aggregation)函數一(yi)起使(shi)用(yong)。
該函數可以(yi)應用(yong)在普通表和超級表上(shang)。
版本2.6.0.x后支持
-
ATAN
SELECT ATAN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說(shuo)明:獲得(de)指定列(lie)的反正切結果
返回結果(guo)類型:DOUBLE。如果(guo)輸入值(zhi)為NULL,輸出值(zhi)也(ye)為NULL
適用(yong)(yong)數據(ju)類型:不能應(ying)(ying)用(yong)(yong)在(zai)(zai) timestamp、binary、nchar、bool 類型字(zi)段上;在(zai)(zai)超(chao)級表查詢中使用(yong)(yong)時,不能應(ying)(ying)用(yong)(yong)在(zai)(zai) tag 列(lie)
嵌(qian)套子查(cha)詢支持:適用于(yu)內層查(cha)詢和外層查(cha)詢。
使用說明:
只能與普通列(lie),選擇(Selection)、投影(ying)(Projection)函(han)(han)數(shu)一起使(shi)用,不能與聚合(Aggregation)函(han)(han)數(shu)一起使(shi)用。
該(gai)函數可以應用在普通表和超級表上。
版本2.6.0.x后支(zhi)持
-
SIN
SELECT SIN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能(neng)說明:獲得指定列的正弦(xian)結果
返回結果類型(xing):DOUBLE。如果輸入值(zhi)為(wei)NULL,輸出值(zhi)也為(wei)NULL
適(shi)用(yong)數據類型:不能(neng)應用(yong)在 timestamp、binary、nchar、bool 類型字(zi)段上;在超級表查(cha)詢(xun)中使(shi)用(yong)時,不能(neng)應用(yong)在 tag 列
嵌(qian)套子查詢(xun)支持:適用于內層查詢(xun)和(he)外層查詢(xun)。
使用說明:
只能(neng)與普通(tong)列,選擇(ze)(Selection)、投(tou)影(Projection)函(han)數一起使用,不能(neng)與聚合(Aggregation)函(han)數一起使用。
該(gai)函數可以(yi)應用在普(pu)通表和超級表上(shang)。
版本2.6.0.x后支持
-
COS
SELECT COS(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲(huo)得指定(ding)列的余弦結果
返回結果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適(shi)用(yong)(yong)數據類型(xing):不能(neng)應用(yong)(yong)在(zai) timestamp、binary、nchar、bool 類型(xing)字段上;在(zai)超級表查詢(xun)中(zhong)使(shi)用(yong)(yong)時,不能(neng)應用(yong)(yong)在(zai) tag 列(lie)
嵌套子查詢(xun)支持:適(shi)用于內(nei)層查詢(xun)和外層查詢(xun)。
使用說明:
只能(neng)與普通列(lie),選擇(ze)(Selection)、投影(Projection)函數(shu)一起(qi)使(shi)用,不能(neng)與聚合(Aggregation)函數(shu)一起(qi)使(shi)用。
該函數可以應用在(zai)普(pu)通表和超(chao)級表上。
版本(ben)2.6.0.x后支持
-
TAN
SELECT TAN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲(huo)得指(zhi)定列(lie)的(de)正切結果
返回結果類型:DOUBLE。如果輸入值(zhi)為(wei)NULL,輸出值(zhi)也為(wei)NULL
適用(yong)(yong)(yong)數據類(lei)型(xing):不能(neng)應用(yong)(yong)(yong)在 timestamp、binary、nchar、bool 類(lei)型(xing)字段上;在超級表查(cha)詢(xun)中使(shi)用(yong)(yong)(yong)時,不能(neng)應用(yong)(yong)(yong)在 tag 列(lie)
嵌(qian)套子查(cha)詢支持:適用于內層查(cha)詢和外層查(cha)詢。
使用說明:
只能(neng)與(yu)普通列,選擇(ze)(Selection)、投影(Projection)函數(shu)一(yi)起(qi)使用(yong),不能(neng)與(yu)聚合(Aggregation)函數(shu)一(yi)起(qi)使用(yong)。
該函數可以應用(yong)在普通表(biao)和超級表(biao)上。
版本2.6.0.x后(hou)支持
-
POW
SELECT POW(field_name, power) FROM { tb_name | stb_name } [WHERE clause]功能說明(ming):獲得指定列的指數(shu)為power的冪
返回結(jie)果類型:DOUBLE。如果輸入值為(wei)NULL,輸出值也為(wei)NULL
適用數據類型:不能(neng)應(ying)(ying)用在 timestamp、binary、nchar、bool 類型字(zi)段上(shang);在超級(ji)表查(cha)詢中使(shi)用時,不能(neng)應(ying)(ying)用在 tag 列
嵌套(tao)子查(cha)詢支持:適(shi)用于內層(ceng)查(cha)詢和外層(ceng)查(cha)詢。
使用說明:
只能(neng)與普(pu)通列,選擇(Selection)、投(tou)影(ying)(Projection)函數(shu)一起使(shi)(shi)用(yong),不能(neng)與聚合(Aggregation)函數(shu)一起使(shi)(shi)用(yong)。
該函數可以應用在普通(tong)表和(he)超級表上。
版本2.6.0.x后支持(chi)
-
LOG
SELECT LOG(field_name, base) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得(de)指定列對于底數(shu)base的對數(shu)
返回結果類型:DOUBLE。如果輸入(ru)值為(wei)NULL,輸出值也為(wei)NULL
適用數(shu)據類型(xing):不能應(ying)用在(zai)(zai) timestamp、binary、nchar、bool 類型(xing)字段上;在(zai)(zai)超級表查詢中使用時,不能應(ying)用在(zai)(zai) tag 列
嵌(qian)套(tao)子查詢(xun)支持(chi):適用于內層查詢(xun)和外(wai)層查詢(xun)。
使用說明:
只(zhi)能與普通列,選擇(Selection)、投影(Projection)函(han)數(shu)一起使(shi)用,不能與聚合(he)(Aggregation)函(han)數(shu)一起使(shi)用。
該函(han)數可以應(ying)用在普通表(biao)和(he)超(chao)級表(biao)上。
版(ban)本2.6.0.x后支持(chi)
-
ABS
SELECT ABS(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明(ming):獲得(de)指定列的絕(jue)對值
返回結(jie)果類(lei)(lei)型(xing)(xing):如(ru)果輸(shu)入值(zhi)為整(zheng)數,輸(shu)出值(zhi)是(shi)UBIGINT類(lei)(lei)型(xing)(xing)。如(ru)果輸(shu)入值(zhi)是(shi)FLOAT/DOUBLE數據類(lei)(lei)型(xing)(xing),輸(shu)出值(zhi)是(shi)DOUBLE數據類(lei)(lei)型(xing)(xing)。
適用(yong)數據類(lei)型(xing):不能應用(yong)在 timestamp、binary、nchar、bool 類(lei)型(xing)字(zi)段上;在超(chao)級表查詢中(zhong)使用(yong)時,不能應用(yong)在 tag 列
嵌套子查(cha)(cha)詢支(zhi)持:適用(yong)于內層查(cha)(cha)詢和外層查(cha)(cha)詢。
使用說明:
只能(neng)與普通(tong)列,選擇(Selection)、投影(Projection)函數(shu)一(yi)起使(shi)用,不能(neng)與聚合(Aggregation)函數(shu)一(yi)起使(shi)用。
該函數可(ke)以應用在普通(tong)表和超級表上。
版本2.6.0.x后(hou)支持
-
SQRT
SELECT SQRT(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明(ming):獲得指定(ding)列(lie)的(de)平方根
返回結果類型:DOUBLE。如果輸入值為(wei)NULL,輸出(chu)值也為(wei)NULL
適用數據類型(xing):不能應用在(zai) timestamp、binary、nchar、bool 類型(xing)字段上;在(zai)超級表查詢(xun)中(zhong)使用時,不能應用在(zai) tag 列
嵌套子查詢(xun)支持:適(shi)用于內層(ceng)查詢(xun)和(he)外層(ceng)查詢(xun)。
使用說明:
只能與普通(tong)列,選擇(Selection)、投影(Projection)函數一起(qi)使用(yong),不能與聚合(he)(Aggregation)函數一起(qi)使用(yong)。
該(gai)函數可以應用在普通表(biao)和超級表(biao)上。
版本2.6.0.x后支持
-
CAST
SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:數(shu)據(ju)類型轉換函數(shu),輸入參數(shu)expression支持普通列(lie)、常(chang)量(liang)(liang)、標(biao)量(liang)(liang)函數(shu)及它們之間的四則運算,不支持tag列(lie),只適(shi)用于select子句(ju)中。
返(fan)回(hui)結果類(lei)型(xing):CAST中(zhong)指定的類(lei)型(xing)(type_name)。
適用數(shu)據類型:輸入參數(shu)expression的類型可以是除(chu)JSON外目(mu)前(qian)所有類型字段(BOOL/TINYINT/SMALLINT/INT/BIGINT/FLOAT/DOUBLE/BINARY(M)/TIMESTAMP/NCHAR(M)/TINYINT UNSIGNED/SMALLINT UNSIGNED/INT UNSIGNED/BIGINT UNSIGNED); 輸出目(mu)標類型只支持BIGINT/BINARY(N)/TIMESTAMP/NCHAR(N)/BIGINT UNSIGNED。
說明:
對(dui)于(yu)不(bu)能支持的類型轉換會直接報(bao)錯。
如果(guo)輸入(ru)值(zhi)為NULL則輸出值(zhi)也為NULL。
對于類型支持但某些值無法正確(que)轉(zhuan)換(huan)的(de)(de)情(qing)況(kuang)對應的(de)(de)轉(zhuan)換(huan)后(hou)的(de)(de)值以轉(zhuan)換(huan)函(han)數輸出為準。目前(qian)可(ke)(ke)能(neng)(neng)遇(yu)(yu)(yu)到的(de)(de)幾(ji)種情(qing)況(kuang): 1)BINARY/NCHAR轉(zhuan)BIGINT/BIGINT UNSIGNED時(shi)可(ke)(ke)能(neng)(neng)出現的(de)(de)無效字符情(qing)況(kuang),例(li)如"a"可(ke)(ke)能(neng)(neng)轉(zhuan)為0。 2)有符號數或TIMESTAMP轉(zhuan)BIGINT UNSIGNED可(ke)(ke)能(neng)(neng)遇(yu)(yu)(yu)到的(de)(de)溢(yi)出問題(ti)。 3)BIGINT UNSIGNED轉(zhuan)BIGINT可(ke)(ke)能(neng)(neng)遇(yu)(yu)(yu)到的(de)(de)溢(yi)出問題(ti)。 4)FLOAT/DOUBLE轉(zhuan)BIGINT/BIGINT UNSIGNED可(ke)(ke)能(neng)(neng)遇(yu)(yu)(yu)到的(de)(de)溢(yi)出問題(ti)。 版(ban)本2.6.0.x后(hou)支持
-
CONCAT
SELECT CONCAT(str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]功(gong)能說明:字(zi)符串連接(jie)函(han)數。
返回結(jie)果類(lei)型(xing):同輸入參數類(lei)型(xing),BINARY或者NCHAR。
適用(yong)數據類型:輸入參數或(huo)者全部(bu)(bu)是BINARY格(ge)式(shi)的字符串或(huo)者列(lie),或(huo)者全部(bu)(bu)是NCHAR格(ge)式(shi)的字符串或(huo)者列(lie)。不能應(ying)用(yong)在TAG列(lie)。
說明:
如(ru)果輸(shu)(shu)入值(zhi)為(wei)NULL,輸(shu)(shu)出(chu)值(zhi)為(wei)NULL。 該函數最小參數個(ge)(ge)數為(wei)2個(ge)(ge),最大參數個(ge)(ge)數為(wei)8個(ge)(ge)。 該函數可(ke)以應(ying)用(yong)(yong)在普通(tong)表(biao)和超(chao)級(ji)表(biao)上(shang)。 該函數適用(yong)(yong)于內層查(cha)詢(xun)和外層查(cha)詢(xun)。 版(ban)本2.6.0.x后支持
-
CONCAT_WS
SELECT CONCAT_WS(separator, str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]功能說明(ming):帶(dai)分隔符(fu)的字符(fu)串連接函數。
返(fan)回結(jie)果(guo)類(lei)型:同輸入參(can)數類(lei)型,BINARY或(huo)者NCHAR。
適(shi)用數據(ju)類型:輸入參數或者全(quan)部是BINARY格(ge)式的字符串(chuan)或者列(lie),或者全(quan)部是NCHAR格(ge)式的字符串(chuan)或者列(lie)。不能應用在TAG列(lie)。
說明:
如(ru)果separator值為(wei)(wei)(wei)NULL,輸(shu)(shu)出值為(wei)(wei)(wei)NULL。如(ru)果separator值不(bu)為(wei)(wei)(wei)NULL,其他輸(shu)(shu)入(ru)為(wei)(wei)(wei)NULL,輸(shu)(shu)出為(wei)(wei)(wei)空串 該(gai)函數(shu)(shu)(shu)最小參(can)數(shu)(shu)(shu)個數(shu)(shu)(shu)為(wei)(wei)(wei)3個,最大參(can)數(shu)(shu)(shu)個數(shu)(shu)(shu)為(wei)(wei)(wei)9個。 該(gai)函數(shu)(shu)(shu)可以應用(yong)在普(pu)通表(biao)(biao)和超級表(biao)(biao)上(shang)。 該(gai)函數(shu)(shu)(shu)適(shi)用(yong)于內層查(cha)詢(xun)和外層查(cha)詢(xun)。 版本2.6.0.x后(hou)支持
-
LENGTH
SELECT LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]功能(neng)說明:以字節計(ji)數的字符(fu)串長度。
返回結果(guo)類型(xing):INT。
適(shi)用數(shu)據類型:輸(shu)入參數(shu)是(shi)BINARY類型或者(zhe)NCHAR類型的字符(fu)串(chuan)或者(zhe)列。不能應用在TAG列。
說明:
如果輸(shu)入值為NULL,輸(shu)出值為NULL。 該函數可(ke)以(yi)應(ying)用在普通表和超級表上。 該函數適(shi)用于內層(ceng)查詢和外層(ceng)查詢。 版本2.6.0.x后支(zhi)持
-
CHAR_LENGTH
SELECT CHAR_LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明(ming):以字符計(ji)數的字符串長度。
返回(hui)結果(guo)類型:INT。
適用數(shu)據類(lei)型:輸入參數(shu)是BINARY類(lei)型或者NCHAR類(lei)型的(de)字符串或者列(lie)。不能應用在TAG列(lie)。
說明:
如果輸入值為NULL,輸出值為NULL。 該(gai)函(han)數(shu)(shu)可以應用在普通(tong)表(biao)和超級表(biao)上。 該(gai)函(han)數(shu)(shu)適用于(yu)內(nei)層查詢和外層查詢。 版本2.6.0.x后支持
-
LOWER
SELECT LOWER(str|column) FROM { tb_name | stb_name } [WHERE clause]功能(neng)說(shuo)明:將(jiang)字(zi)(zi)符(fu)串參數值轉換為全(quan)小寫字(zi)(zi)母。
返回結(jie)果(guo)類型:同(tong)輸(shu)入類型。
適用(yong)數據(ju)類型(xing):輸入(ru)參數是BINARY類型(xing)或者(zhe)NCHAR類型(xing)的字符串或者(zhe)列。不能應用(yong)在TAG列。
說明:
如果輸入值(zhi)為NULL,輸出值(zhi)為NULL。 該函數(shu)可(ke)以應用在普通(tong)表(biao)和超級(ji)表(biao)上(shang)。 該函數(shu)適用于內層(ceng)查詢(xun)和外(wai)層(ceng)查詢(xun)。 版本2.6.0.x后支持
-
UPPER
SELECT UPPER(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:將(jiang)字符串參數(shu)值轉換為(wei)全大寫(xie)字母。
返回結果類型(xing):同輸入(ru)類型(xing)。
適(shi)用數(shu)據類型:輸入參數(shu)是BINARY類型或(huo)者NCHAR類型的字符串或(huo)者列。不能(neng)應用在TAG列。
說明:
如(ru)果輸入(ru)值為NULL,輸出值為NULL。 該函數(shu)可以應用在普通表和超級(ji)表上。 該函數(shu)適用于內層查詢(xun)(xun)和外層查詢(xun)(xun)。 版(ban)本2.6.0.x后支持(chi)
-
LTRIM
SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說(shuo)明:返回清除左邊空格后的字(zi)符串。
返回結(jie)果類(lei)型:同輸入類(lei)型。
適用數(shu)據類型:輸入參數(shu)是BINARY類型或(huo)者(zhe)NCHAR類型的字(zi)符串(chuan)或(huo)者(zhe)列(lie)。不能應用在TAG列(lie)。
說明:
如(ru)果(guo)輸(shu)入值為NULL,輸(shu)出值為NULL。 該函數(shu)可以(yi)應用在(zai)普通表(biao)和超級表(biao)上(shang)。 該函數(shu)適用于內層查(cha)詢和外層查(cha)詢。 版本2.6.0.x后支持(chi)
-
RTRIM
SELECT RTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:返回清除右邊空格(ge)后的字(zi)符串。
返回(hui)結果(guo)類型:同(tong)輸(shu)入類型。
適用(yong)數據類型(xing):輸入參數是BINARY類型(xing)或者NCHAR類型(xing)的字(zi)符串或者列。不能應用(yong)在TAG列。
說明:
如果輸入值為NULL,輸出(chu)值為NULL。 該(gai)函數(shu)可以應用在(zai)普通表和超(chao)級表上。 該(gai)函數(shu)適用于內(nei)層(ceng)查(cha)詢和外層(ceng)查(cha)詢。 版本2.6.0.x后(hou)支持
-
SUBSTR
SELECT SUBSTR(str,pos[,len]) FROM { tb_name | stb_name } [WHERE clause]功(gong)能說明:從源(yuan)字(zi)符串(chuan)str中(zhong)的(de)指(zhi)定位(wei)置pos開始取一(yi)個長度為(wei)len的(de)子串(chuan)并返回。
返回結(jie)果類型(xing):同輸入類型(xing)。
適用(yong)數(shu)據類(lei)型(xing):輸入參數(shu)是BINARY類(lei)型(xing)或(huo)者NCHAR類(lei)型(xing)的字符串或(huo)者列。不能(neng)應用(yong)在TAG列。
說明:
如(ru)果輸(shu)(shu)入(ru)值為(wei)(wei)(wei)(wei)NULL,輸(shu)(shu)出值為(wei)(wei)(wei)(wei)NULL。 輸(shu)(shu)入(ru)參數(shu)(shu)pos可以為(wei)(wei)(wei)(wei)正(zheng)數(shu)(shu),也可以為(wei)(wei)(wei)(wei)負數(shu)(shu)。如(ru)果pos是正(zheng)數(shu)(shu),表(biao)示開(kai)始位(wei)置從(cong)(cong)字符串(chuan)開(kai)頭正(zheng)數(shu)(shu)計(ji)算(suan)(suan)。如(ru)果pos為(wei)(wei)(wei)(wei)負數(shu)(shu),表(biao)示開(kai)始位(wei)置從(cong)(cong)字符串(chuan)結尾倒數(shu)(shu)計(ji)算(suan)(suan)。如(ru)果輸(shu)(shu)入(ru)參數(shu)(shu)len被忽略,返回(hui)的子串(chuan)包(bao)含從(cong)(cong)pos開(kai)始的整個字串(chuan)。 該(gai)函(han)數(shu)(shu)可以應用(yong)在(zai)普(pu)通表(biao)和(he)超級表(biao)上。 該(gai)函(han)數(shu)(shu)適用(yong)于內層(ceng)查詢(xun)和(he)外層(ceng)查詢(xun)。 版本2.6.0.x后支持
-
四則運算
SELECT field_name [+|-|*|/|%][Value|field_name] FROM { tb_name | stb_name } [WHERE clause];功(gong)能說明:統計表(biao)/超(chao)級表(biao)中(zhong)某(mou)列或多列間的(de)值加(jia)、減、乘、除、取(qu)余(yu)計算結果。
返回結果(guo)數據(ju)類型:雙精度浮點數。
應用(yong)字段(duan)(duan):不能應用(yong)在timestamp、binary、nchar、bool類型字段(duan)(duan)。
適用于:表、超級表。
說明:
1)支持兩列或多列之間進行計算,可使用(yong)括號(hao)控制計算優先級;
2)NULL字段(duan)不參與計(ji)(ji)算,如(ru)果(guo)參與計(ji)(ji)算的某行中包含(han)NULL,該行的計(ji)(ji)算結果(guo)為NULL。
taos> SELECT current + voltage * phase FROM d1001; (current+(voltage*phase)) | ============================ 78.190000713 | 84.540003240 | 80.810000718 | Query OK, 3 row(s) in set (0.001046s) -
STATECOUNT
SELECT STATECOUNT(field_name, oper, val) FROM { tb_name | stb_name } [WHERE clause];功能說明(ming):返回滿(man)足某個條(tiao)件的連續記錄(lu)的個數(shu)(shu)(shu),結果(guo)(guo)作為(wei)(wei)新的一(yi)列(lie)追加(jia)在每(mei)行后面(mian)。條(tiao)件根據參數(shu)(shu)(shu)計算,如果(guo)(guo)條(tiao)件為(wei)(wei)true則(ze)加(jia)1,條(tiao)件為(wei)(wei)false則(ze)重(zhong)置(zhi)為(wei)(wei)-1,如果(guo)(guo)數(shu)(shu)(shu)據為(wei)(wei)NULL,跳過(guo)該(gai)條(tiao)數(shu)(shu)(shu)據。
參數范圍:
- oper : LT (小于)、GT(大于)、LE(小于等于)、GE(大于等于)、NE(不等于)、EQ(等于),不區分大小寫。
- val : 數值型
返(fan)回結果(guo)類型:整形。
適用數(shu)據類型:不能應用在 timestamp、binary、nchar、bool 類型字(zi)段上。
嵌套子(zi)(zi)查詢(xun)支持:不(bu)支持應用在子(zi)(zi)查詢(xun)上(shang)。
支(zhi)持的版本:2.6.0.x 之后(hou)的版本。
說明:
-
該函(han)數可(ke)以應用在(zai)普(pu)通表(biao)上,在(zai)由(you) GROUP BY 劃分出單獨時間線的情況下用于超(chao)級表(biao)(也(ye)即(ji) GROUP BY tbname)
-
不(bu)能(neng)和窗口操(cao)作一起使用,例如interval/state_window/session_window。
示例:
taos> select ts,dbig from statef2; ts | dbig | ======================================================== 2021-10-15 00:31:33.000000000 | 1 | 2021-10-17 00:31:31.000000000 | NULL | 2021-12-24 00:31:34.000000000 | 2 | 2022-01-01 08:00:05.000000000 | 19 | 2022-01-01 08:00:06.000000000 | NULL | 2022-01-01 08:00:07.000000000 | 9 | Query OK, 6 row(s) in set (0.002977s) taos> select stateCount(dbig,GT,2) from statef2; ts | dbig | statecount(dbig,gt,2) | ================================================================================ 2021-10-15 00:31:33.000000000 | 1 | -1 | 2021-10-17 00:31:31.000000000 | NULL | NULL | 2021-12-24 00:31:34.000000000 | 2 | -1 | 2022-01-01 08:00:05.000000000 | 19 | 1 | 2022-01-01 08:00:06.000000000 | NULL | NULL | 2022-01-01 08:00:07.000000000 | 9 | 2 | Query OK, 6 row(s) in set (0.002791s) -
STATEDURATION
SELECT stateDuration(field_name, oper, val, unit) FROM { tb_name | stb_name } [WHERE clause];功能說明:返(fan)回滿(man)足某個條(tiao)(tiao)件(jian)的(de)連續記錄(lu)(lu)的(de)時間(jian)(jian)長度(du),結果(guo)作為(wei)新的(de)一(yi)列追加在(zai)每(mei)行后面(mian)。條(tiao)(tiao)件(jian)根據參數計算,如果(guo)條(tiao)(tiao)件(jian)為(wei)true則(ze)加上兩(liang)個記錄(lu)(lu)之間(jian)(jian)的(de)時間(jian)(jian)長度(du)(第一(yi)個滿(man)足條(tiao)(tiao)件(jian)的(de)記錄(lu)(lu)時間(jian)(jian)長度(du)記為(wei)0),條(tiao)(tiao)件(jian)為(wei)false則(ze)重置為(wei)-1,如果(guo)數據為(wei)NULL,跳過該(gai)條(tiao)(tiao)數據。
參數范圍:
- oper : LT (小于)、GT(大于)、LE(小于等于)、GE(大于等于)、NE(不等于)、EQ(等于),不區分大小寫。
- val : 數值型
- unit : 時間長度的單位,范圍[1s、1m、1h ],不足一個單位舍去。默認為1s。
返回(hui)結(jie)果類型:整形(xing)。
適用數據(ju)類型:不能應(ying)用在 timestamp、binary、nchar、bool 類型字段上(shang)。
嵌套子(zi)(zi)查詢支(zhi)持:不(bu)支(zhi)持應用(yong)在子(zi)(zi)查詢上。
支持(chi)的(de)(de)版本(ben):2.6.0.x 之后的(de)(de)版本(ben)。
說明:
-
該函數可以應用(yong)在普通(tong)表上,在由 GROUP BY 劃分(fen)出單獨時間(jian)線的情況(kuang)下用(yong)于超級表(也(ye)即 GROUP BY tbname)
-
不能和窗口(kou)操作一起使(shi)用,例如interval/state_window/session_window。
示例:
taos> select ts,dbig from statef2; ts | dbig | ======================================================== 2021-10-15 00:31:33.000000000 | 1 | 2021-10-17 00:31:31.000000000 | NULL | 2021-12-24 00:31:34.000000000 | 2 | 2022-01-01 08:00:05.000000000 | 19 | 2022-01-01 08:00:06.000000000 | NULL | 2022-01-01 08:00:07.000000000 | 9 | Query OK, 6 row(s) in set (0.002407s) taos> select stateDuration(dbig,GT,2) from statef2; ts | dbig | stateduration(dbig,gt,2) | =================================================================================== 2021-10-15 00:31:33.000000000 | 1 | -1 | 2021-10-17 00:31:31.000000000 | NULL | NULL | 2021-12-24 00:31:34.000000000 | 2 | -1 | 2022-01-01 08:00:05.000000000 | 19 | 0 | 2022-01-01 08:00:06.000000000 | NULL | NULL | 2022-01-01 08:00:07.000000000 | 9 | 2 | Query OK, 6 row(s) in set (0.002613s) -
HISTOGRAM
SELECT HISTOGRAM(field_name,bin_type, bin_description, normalized) FROM tb_name [WHERE clause];功(gong)能(neng)說明(ming):統計數據(ju)按照用戶指定區間的分(fen)布。
返回結果數據類型(xing):如歸(gui)一(yi)化參數 normalized 設置為 1,返回結果為雙精度浮點類型(xing) DOUBLE,否(fou)則為長整形(xing) INT64。
應用字段:數值型字段。
適用于:表、(超級表)。
說明: 1)從 2.6.0.0 版(ban)本開始支(zhi)持此函數。 2)bin_type 用戶指定的分桶類型(xing), 有(you)效(xiao)輸入類型(xing)為"user_input“, ”linear_bin", "log_bin"。 3)bin_description 描(miao)(miao)述(shu)如(ru)何生成分桶區間,針對三種桶類型(xing),分別為以下描(miao)(miao)述(shu)格(ge)式(均為 JSON 格(ge)式字符串):
-
"user_input": "[1, 3, 5, 7]" 用戶指(zhi)定 bin 的具(ju)體(ti)數值(zhi)。
-
"linear_bin": "{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}" "start" 表(biao)示數(shu)據起始點(dian),"width" 表(biao)示每(mei)次 bin 偏(pian)移量, "count" 為 bin 的(de)總數(shu),"infinity" 表(biao)示是否添加(-inf, inf)作為區間(jian)起點(dian)跟終(zhong)點(dian), 生成區間(jian)為[-inf, 0.0, 5.0, 10.0, 15.0, 20.0, +inf]。
-
"log_bin": "{"start":1.0, "factor": 2.0, "count": 5, "infinity": true}" "start" 表示(shi)數據起(qi)始點(dian),"factor" 表示(shi)按指數遞(di)增的(de)因子(zi),"count" 為(wei) bin 的(de)總數,"infinity" 表示(shi)是(shi)否(fou)添加(-inf, inf)作為(wei)區間(jian)(jian)起(qi)點(dian)跟終點(dian), 生成區間(jian)(jian)為(wei)[-inf, 1.0, 2.0, 4.0, 8.0, 16.0, +inf]。 4)normalized 是(shi)否(fou)將返回結果歸(gui)一化到 0~1 之間(jian)(jian) 。有效(xiao)輸入為(wei) 0 和 1。
示例:
taos> SELECT HISTOGRAM(voltage, "user_input", "[1,3,5,7]", 1) FROM meters; histogram(voltage, "user_input", "[1,3,5,7]", 1) | ======================================================= {"lower_bin":1, "upper_bin":3, "count":0.333333} | {"lower_bin":3, "upper_bin":5, "count":0.333333} | {"lower_bin":5, "upper_bin":7, "count":0.333333} | Query OK, 3 row(s) in set (0.004273s) taos> SELECT HISTOGRAM(voltage, 'linear_bin', '{"start": 1, "width": 3, "count": 3, "infinity": false}', 0) FROM meters; histogram(voltage, 'linear_bin', '{"start": 1, "width": 3, " | =================================================================== {"lower_bin":1, "upper_bin":4, "count":3} | {"lower_bin":4, "upper_bin":7, "count":3} | {"lower_bin":7, "upper_bin":10, "count":3} | Query OK, 3 row(s) in set (0.004887s) taos> SELECT HISTOGRAM(voltage, 'log_bin', '{"start": 1, "factor": 3, "count": 3, "infinity": true}', 0) FROM meters; histogram(voltage, 'log_bin', '{"start": 1, "factor": 3, "count" | =================================================================== {"lower_bin":-inf, "upper_bin":1, "count":3} | {"lower_bin":1, "upper_bin":3, "count":2} | {"lower_bin":3, "upper_bin":9, "count":6} | {"lower_bin":9, "upper_bin":27, "count":3} | {"lower_bin":27, "upper_bin":inf, "count":1} | -
時間函數
從 2.6.0.0 版本開始,TDengine查詢引擎支持以下時間相關(guan)函數:
-
NOW
SELECT NOW() FROM { tb_name | stb_name } [WHERE clause]; SELECT select_expr FROM { tb_name | stb_name } WHERE ts_col cond_operatior NOW(); INSERT INTO tb_name VALUES (NOW(), ...);功(gong)能說(shuo)明:返回客戶端當(dang)前系統時(shi)間。
返回結(jie)果數據類(lei)型:TIMESTAMP 時間戳類(lei)型。
應用字(zi)段(duan):在 WHERE 或 INSERT 語句中使用時(shi)只能作用于TIMESTAMP類型的(de)字(zi)段(duan)。
適用于:表、超級表。
說明(ming): 1)支(zhi)持時(shi)間(jian)(jian)加減操作,如NOW() + 1s, 支(zhi)持的(de)時(shi)間(jian)(jian)單(dan)位如下: b(納秒(miao))、u(微秒(miao))、a(毫(hao)秒(miao))、s(秒(miao))、m(分)、h(小時(shi))、d(天(tian))、w(周)。 2)返回的(de)時(shi)間(jian)(jian)戳(chuo)精度與當前 DATABASE 設置的(de)時(shi)間(jian)(jian)精度一致(zhi)。
示例:
taos> SELECT NOW() FROM meters; now() | ========================== 2022-02-02 02:02:02.456 | Query OK, 1 row(s) in set (0.002093s) taos> SELECT NOW() + 1h FROM meters; now() + 1h | ========================== 2022-02-02 03:02:02.456 | Query OK, 1 row(s) in set (0.002093s) taos> SELECT COUNT(voltage) FROM d1001 WHERE ts < NOW(); count(voltage) | ============================= 5 | Query OK, 5 row(s) in set (0.004475s) taos> INSERT INTO d1001 VALUES (NOW(), 10.2, 219, 0.32); Query OK, 1 of 1 row(s) in database (0.002210s) -
TODAY
SELECT TODAY() FROM { tb_name | stb_name } [WHERE clause]; SELECT select_expr FROM { tb_name | stb_name } WHERE ts_col cond_operatior TODAY()]; INSERT INTO tb_name VALUES (TODAY(), ...);功能說明(ming):返回客戶端(duan)當日零時的系統時間(jian)。
返回結(jie)果數據類型:TIMESTAMP 時(shi)間戳類型。
應用字段:在 WHERE 或 INSERT 語句中使用時只能(neng)作(zuo)用于 TIMESTAMP 類型的(de)字段。
適用于:表、超級表。
說明: 1)支持時間加(jia)減操作,如(ru)TODAY() + 1s, 支持的時間單位如(ru)下: b(納(na)秒(miao)),u(微秒(miao)),a(毫秒(miao)),s(秒(miao)),m(分(fen)),h(小時),d(天),w(周)。 2)返回的時間戳精度與當(dang)前(qian) DATABASE 設置的時間精度一致。
示例:
taos> SELECT TODAY() FROM meters; today() | ========================== 2022-02-02 00:00:00.000 | Query OK, 1 row(s) in set (0.002093s) taos> SELECT TODAY() + 1h FROM meters; today() + 1h | ========================== 2022-02-02 01:00:00.000 | Query OK, 1 row(s) in set (0.002093s) taos> SELECT COUNT(voltage) FROM d1001 WHERE ts < TODAY(); count(voltage) | ============================= 5 | Query OK, 5 row(s) in set (0.004475s) taos> INSERT INTO d1001 VALUES (TODAY(), 10.2, 219, 0.32); Query OK, 1 of 1 row(s) in database (0.002210s) -
TIMEZONE
SELECT TIMEZONE() FROM { tb_name | stb_name } [WHERE clause];功能說明:返回客戶端當前(qian)時區信息。
返回結果(guo)數(shu)據類型:BINARY 類型。
應用字段:無
適用于:表、超級表。
示例:
taos> SELECT TIMEZONE() FROM meters; timezone() | ================================= UTC (UTC, +0000) | Query OK, 1 row(s) in set (0.002093s) -
TO_ISO8601
SELECT TO_ISO8601(ts_val | ts_col) FROM { tb_name | stb_name } [WHERE clause];功(gong)能(neng)說明:將 UNIX 時間(jian)戳轉換成(cheng)為 ISO8601 標準的日期時間(jian)格式,并(bing)附加客戶端時區信(xin)息(xi)。
返回結果數據類型:BINARY 類型。
應用(yong)字段(duan):UNIX 時間戳(chuo)常量(liang)或(huo)是 TIMESTAMP 類型的列
適用于:表、超級表。
說明:如(ru)果輸入是 UNIX 時(shi)(shi)間(jian)戳常量(liang),返回(hui)(hui)格(ge)式(shi)精(jing)度由(you)時(shi)(shi)間(jian)戳的位數決定(ding),如(ru)果輸入是 TIMSTAMP 類型的列,返回(hui)(hui)格(ge)式(shi)的時(shi)(shi)間(jian)戳精(jing)度與當前(qian) DATABASE 設(she)置的時(shi)(shi)間(jian)精(jing)度一致。
示例:
taos> SELECT TO_ISO8601(1643738400) FROM meters; to_iso8601(1643738400) | ============================== 2022-02-02T02:00:00+0800 | taos> SELECT TO_ISO8601(ts) FROM meters; to_iso8601(ts) | ============================== 2022-02-02T02:00:00+0800 | 2022-02-02T02:00:00+0800 | 2022-02-02T02:00:00+0800 |- TO_UNIXTIMESTAMP
SELECT TO_UNIXTIMESTAMP(datetime_string | ts_col) FROM { tb_name | stb_name } [WHERE clause];功能(neng)說明:將日期時間(jian)格式的字(zi)符串轉換成為(wei) UNIX 時間(jian)戳(chuo)。
返回結果數據類(lei)型:長整型INT64。
應用字(zi)段:字(zi)符(fu)串常(chang)量或(huo)是 BINARY/NCHAR 類型(xing)的列。
適用于:表、超級表。
說明: 1)輸入的日(ri)期時(shi)(shi)間字(zi)符(fu)串(chuan)須(xu)符(fu)合 ISO8601/RFC3339 標(biao)準,無(wu)法轉換的字(zi)符(fu)串(chuan)格(ge)式將(jiang)返回0。 2)返回的時(shi)(shi)間戳精(jing)度與當前 DATABASE 設置的時(shi)(shi)間精(jing)度一致。
示例:
taos> SELECT TO_UNIXTIMESTAMP("2022-02-02T02:00:00.000Z") FROM meters; to_unixtimestamp("2022-02-02T02:00:00.000Z") | ============================================== 1643767200000 | taos> SELECT TO_UNIXTIMESTAMP(col_binary) FROM meters; to_unixtimestamp(col_binary) | ======================================== 1643767200000 | 1643767200000 | 1643767200000 |- TIMETRUNCATE
SELECT TIMETRUNCATE(ts_val | datetime_string | ts_col, time_unit) FROM { tb_name | stb_name } [WHERE clause];功(gong)能說明:將時間戳按照指定(ding)時間單位 time_unit 進行截斷。
返回結果數據類(lei)型:TIMESTAMP 時間戳類(lei)型。
應用字段:UNIX 時(shi)間戳,日(ri)期時(shi)間格式(shi)的字符串,或者 TIMESTAMP 類型的列。
適用于:表、超級表。
說(shuo)明(ming): 1)支持的時(shi)(shi)間單位 time_unit 如下: 1u(微秒),1a(毫(hao)秒),1s(秒),1m(分(fen)),1h(小時(shi)(shi)),1d(天)。 2)返回的時(shi)(shi)間戳精(jing)度與當(dang)前 DATABASE 設置的時(shi)(shi)間精(jing)度一致(zhi)。
示例:
taos> SELECT TIMETRUNCATE(1643738522000, 1h) FROM meters; timetruncate(1643738522000, 1h) | =================================== 2022-02-02 02:00:00.000 | Query OK, 1 row(s) in set (0.001499s) taos> SELECT TIMETRUNCATE("2022-02-02 02:02:02", 1h) FROM meters; timetruncate("2022-02-02 02:02:02", 1h) | =========================================== 2022-02-02 02:00:00.000 | Query OK, 1 row(s) in set (0.003903s) taos> SELECT TIMETRUNCATE(ts, 1h) FROM meters; timetruncate(ts, 1h) | ========================== 2022-02-02 02:00:00.000 | 2022-02-02 02:00:00.000 | 2022-02-02 02:00:00.000 | Query OK, 3 row(s) in set (0.003903s)- TIMEDIFF
SELECT TIMEDIFF(ts_val1 | datetime_string1 | ts_col1, ts_val2 | datetime_string2 | ts_col2 [, time_unit]) FROM { tb_name | stb_name } [WHERE clause];功(gong)能說明:計算兩個時間(jian)戳之間(jian)的(de)差值,并近似到(dao)時間(jian)單位 time_unit 指定的(de)精度。
返回結(jie)果數據類(lei)型:長整型INT64。
應用字段(duan):UNIX 時(shi)間戳,日期時(shi)間格(ge)式的字符串,或者 TIMESTAMP 類(lei)型的列。
適用于:表、超級表。
說明: 1)支持的(de)時間(jian)單位 time_unit 如(ru)下: 1u(微(wei)秒(miao)),1a(毫(hao)秒(miao)),1s(秒(miao)),1m(分(fen)),1h(小(xiao)時),1d(天)。 2)如(ru)果時間(jian)單位 time_unit 未指(zhi)定, 返回的(de)時間(jian)差值(zhi)精度(du)與當前 DATABASE 設(she)置(zhi)的(de)時間(jian)精度(du)一致。
示例:
taos> SELECT TIMEDIFF(1643738400000, 1643742000000) FROM meters; timediff(1643738400000, 1643742000000) | ========================================= 3600000 | Query OK, 1 row(s) in set (0.002553s) taos> SELECT TIMEDIFF(1643738400000, 1643742000000, 1h) FROM meters; timediff(1643738400000, 1643742000000, 1h) | ============================================= 1 | Query OK, 1 row(s) in set (0.003726s) taos> SELECT TIMEDIFF("2022-02-02 03:00:00", "2022-02-02 02:00:00", 1h) FROM meters; timediff("2022-02-02 03:00:00", "2022-02-02 02:00:00", 1h) | ============================================================= 1 | Query OK, 1 row(s) in set (0.001937s) taos> SELECT TIMEDIFF(ts_col1, ts_col2, 1h) FROM meters; timediff(ts_col1, ts_col2, 1h) | =================================== 1 | Query OK, 1 row(s) in set (0.001937s) - TO_UNIXTIMESTAMP
按窗口切分聚合
TDengine 支(zhi)持(chi)按(an)時(shi)間(jian)(jian)段窗(chuang)口(kou)(kou)(kou)(kou)(kou)切分(fen)方式進行(xing)聚合(he)結(jie)(jie)果(guo)查詢(xun),比如溫(wen)度傳感器每(mei)秒采(cai)集(ji)一次(ci)數據,但需(xu)(xu)查詢(xun)每(mei)隔 10 分(fen)鐘(zhong)的溫(wen)度平均值。這種場(chang)景下可以使用窗(chuang)口(kou)(kou)(kou)(kou)(kou)子句來獲(huo)得需(xu)(xu)要的查詢(xun)結(jie)(jie)果(guo)。 窗(chuang)口(kou)(kou)(kou)(kou)(kou)子句用于針對查詢(xun)的數據集(ji)合(he)進行(xing)按(an)照窗(chuang)口(kou)(kou)(kou)(kou)(kou)切分(fen)成為查詢(xun)子集(ji)并進行(xing)聚合(he),窗(chuang)口(kou)(kou)(kou)(kou)(kou)包含時(shi)間(jian)(jian)窗(chuang)口(kou)(kou)(kou)(kou)(kou)(time window)、狀態窗(chuang)口(kou)(kou)(kou)(kou)(kou)(status window)、會話窗(chuang)口(kou)(kou)(kou)(kou)(kou)(session window)三種窗(chuang)口(kou)(kou)(kou)(kou)(kou)。其中時(shi)間(jian)(jian)窗(chuang)口(kou)(kou)(kou)(kou)(kou)又可劃分(fen)為滑動時(shi)間(jian)(jian)窗(chuang)口(kou)(kou)(kou)(kou)(kou)和(he)翻轉(zhuan)時(shi)間(jian)(jian)窗(chuang)口(kou)(kou)(kou)(kou)(kou)。
時間窗口
INTERVAL子句(ju)用(yong)于產生相等(deng)時(shi)(shi)(shi)間(jian)(jian)周期的(de)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou),SLIDING用(yong)以指(zhi)定(ding)(ding)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)向前滑(hua)動(dong)(dong)(dong)的(de)時(shi)(shi)(shi)間(jian)(jian)。每(mei)次執(zhi)(zhi)行的(de)查(cha)詢是一個(ge)時(shi)(shi)(shi)間(jian)(jian)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou),時(shi)(shi)(shi)間(jian)(jian)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)隨著時(shi)(shi)(shi)間(jian)(jian)流動(dong)(dong)(dong)向前滑(hua)動(dong)(dong)(dong)。在定(ding)(ding)義連續查(cha)詢的(de)時(shi)(shi)(shi)候(hou)需要指(zhi)定(ding)(ding)時(shi)(shi)(shi)間(jian)(jian)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)(time window )大(da)小和每(mei)次前向增(zeng)量時(shi)(shi)(shi)間(jian)(jian)(forward sliding times)。如(ru)圖,[t0s, t0e] ,[t1s , t1e], [t2s, t2e] 是分別是執(zhi)(zhi)行三次連續查(cha)詢的(de)時(shi)(shi)(shi)間(jian)(jian)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)范(fan)(fan)圍,窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)的(de)前向滑(hua)動(dong)(dong)(dong)的(de)時(shi)(shi)(shi)間(jian)(jian)范(fan)(fan)圍sliding time標(biao)識 。查(cha)詢過濾、聚合等(deng)操作按照每(mei)個(ge)時(shi)(shi)(shi)間(jian)(jian)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)為獨立的(de)單(dan)位執(zhi)(zhi)行。當SLIDING與INTERVAL相等(deng)的(de)時(shi)(shi)(shi)候(hou),滑(hua)動(dong)(dong)(dong)窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)即為翻(fan)轉窗(chuang)(chuang)(chuang)口(kou)(kou)(kou)。

INTERVAL和SLIDING子句(ju)需要配合聚合和選擇(ze)函數來使用。以(yi)下SQL語句(ju)非法:
SELECT * FROM temp_table INTERVAL(1S)
SLIDING的向(xiang)前滑動的時(shi)間不(bu)能超過一(yi)個窗(chuang)口(kou)的時(shi)間范圍(wei)。以下(xia)語句非法:
SELECT COUNT(*) FROM temp_table INTERVAL(1D) SLIDING(2D)
當 SLIDING 與 INTERVAL 取值(zhi)相等的時候,滑(hua)動(dong)窗口即為翻轉(zhuan)窗口。
- 聚合時間段的窗口寬度由關鍵詞 INTERVAL 指定,最短時間間隔 10 毫秒(10a);并且支持偏移 offset(偏移必須小于間隔),也即時間窗口劃分與“UTC 時刻 0”相比的偏移量。SLIDING 語句用于指定聚合時間段的前向增量,也即每次窗口向前滑動的時長。
- 從 2.1.5.0 版本開始,INTERVAL 語句允許的最短時間間隔調整為 1 微秒(1u),當然如果所查詢的 DATABASE 的時間精度設置為毫秒級,那么允許的最短時間間隔為 1 毫秒(1a)。
- 注意:用到 INTERVAL 語句時,除非極特殊的情況,都要求把客戶端和服務端的 taos.cfg 配置文件中的 timezone 參數配置為相同的取值,以避免時間處理函數頻繁進行跨時區轉換而導致的嚴重性能影響。
狀態窗口
使用(yong)整數(布爾值)或字符串來標識產生記錄時候設備的(de)(de)(de)狀態量(liang)。產生的(de)(de)(de)記錄如果(guo)具有相同(tong)的(de)(de)(de)狀態量(liang)數值則歸屬于同(tong)一個狀態窗(chuang)口,數值改變(bian)后該窗(chuang)口關(guan)閉(bi)。如下圖(tu)所示(shi),根據(ju)狀態量(liang)確定(ding)的(de)(de)(de)狀態窗(chuang)口分別(bie)是(shi)[2019-04-28 14:22:07,2019-04-28 14:22:10]和[2019-04-28 14:22:11,2019-04-28 14:22:12]兩個。(狀態窗(chuang)口暫不支持對超級表使用(yong))

使用STATE_WINDOW來確定狀態窗口劃(hua)分的列。例如:
SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status)
會話窗口
會(hui)話窗口根(gen)據記錄(lu)的(de)時間(jian)(jian)戳(chuo)主(zhu)鍵的(de)值(zhi)來確(que)定是(shi)否(fou)屬于(yu)同一個會(hui)話。如下圖所示,如果設(she)置時間(jian)(jian)戳(chuo)的(de)連(lian)(lian)續(xu)的(de)間(jian)(jian)隔(ge)小于(yu)等于(yu)12秒,則以(yi)下6條記錄(lu)構(gou)成(cheng)2個會(hui)話窗口,分別是(shi):[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因為2019-04-28 14:22:30與2019-04-28 14:23:10之間(jian)(jian)的(de)時間(jian)(jian)間(jian)(jian)隔(ge)是(shi)40秒,超過了連(lian)(lian)續(xu)時間(jian)(jian)間(jian)(jian)隔(ge)(12秒)。

在(zai)tol_value時(shi)間(jian)間(jian)隔(ge)范圍內的結果都認為歸屬于(yu)同一個(ge)窗口,如果連續的兩(liang)條記錄的時(shi)間(jian)超過tol_val,則自動開啟下(xia)一個(ge)窗口。(會(hui)話窗口暫不支持對超級表使(shi)用)
SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION(ts, tol_val)
這種類型的查詢語(yu)法如(ru)下:
SELECT function_list FROM tb_name
[WHERE where_condition]
[SESSION(ts_col, tol_val)]
[STATE_WINDOW(col)]
[INTERVAL(interval [, offset]) [SLIDING sliding]]
[FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]
SELECT function_list FROM stb_name
[WHERE where_condition]
[INTERVAL(interval [, offset]) [SLIDING sliding]]
[FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]
[GROUP BY tags]
-
在聚合(he)查詢中,function_list 位置(zhi)允許使用(yong)聚合(he)和選擇函(han)數,并要(yao)求每個函(han)數僅輸出單個結果(例(li)如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用(yong)具(ju)有多行輸出結果的函(han)數(例(li)如:DIFF 以及四(si)則運算)。
-
此外(wai)也 LAST_ROW 查詢也不能(neng)與窗口(kou)聚合同時出現。
-
標量函數(如(ru):CEIL/FLOOR 等)也不能使用在窗口聚合查詢中。
-
WHERE 語句可以指定查詢的起止時間和其他過濾條件(jian)。
-
FILL 語句(ju)指(zhi)定某一窗(chuang)口(kou)區間數據缺失(shi)的(de)情況下的(de)填充(chong)模(mo)式。填充(chong)模(mo)式包括(kuo)以下幾種:
- 不進行填充:NONE(默認填充模式)。
- VALUE 填充:固定值填充,此時需要指定填充的數值。例如:FILL(VALUE, 1.23)。
- PREV 填充:使用前一個非 NULL 值填充數據。例如:FILL(PREV)。
- NULL 填充:使用 NULL 填充數據。例如:FILL(NULL)。
- LINEAR 填充:根據前后距離最近的非 NULL 值做線性插值填充。例如:FILL(LINEAR)。
- NEXT 填充:使用下一個非 NULL 值填充數據。例如:FILL(NEXT)。
說明:
- 使用 FILL 語句的時候可能生成大量的填充輸出,務必指定查詢的時間區間。針對每次查詢,系統可返回不超過 1 千萬條具有插值的結果。
- 在時間維度聚合中,返回的結果中時間序列嚴格單調遞增。
- 如果查詢對象是超級表,則聚合函數會作用于該超級表下滿足值過濾條件的所有表的數據。如果查詢中沒有使用 GROUP BY 語句,則返回的結果按照時間序列嚴格單調遞增;如果查詢中使用了 GROUP BY 語句分組,則返回結果中每個 GROUP 內不按照時間序列嚴格單調遞增。
時間聚合也常被用于連續查詢場景,可以參考文檔 連續查詢(Continuous Query)。
示例: 智能電表的建表語句如下:
CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT);
針對智能電表采集的(de)數(shu)據(ju),以 10 分(fen)鐘為一個階段,計(ji)算(suan)過去 24 小時的(de)電流數(shu)據(ju)的(de)平(ping)均值(zhi)、最大值(zhi)、電流的(de)中位數(shu)。如果(guo)沒(mei)有計(ji)算(suan)值(zhi),用前一個非 NULL 值(zhi)填充(chong)。使(shi)用的(de)查詢語句如下(xia):
SELECT AVG(current), MAX(current), APERCENTILE(current, 50) FROM meters
WHERE ts>=NOW-1d and ts<=now
INTERVAL(10m)
FILL(PREV);
TAOS SQL 邊界限制
- 數據庫名最大長度為 32。
- 表名最大長度為 192。每行數據最大長度 48K 個字符(2.1.7.0 之前的版本為 16K,每個 BINARY/NCHAR 類型的列還會額外占用 2 個 byte 的存儲位置)
- 列名最大長度為 64,最多允許 1024 列,最少需要 2 列,第一列必須是時間戳。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
- 標簽名最大長度為 64,最多允許 128 個,可以 1 個,一個表中標簽值的總長度不超過 16K 個字符。
- SQL 語句最大長度 1048576 個字符,也可通過客戶端配置參數 maxSQLLength 修改,取值范圍 65480 ~ 1048576。
- SELECT 語句的查詢結果,最多允許返回 1024 列(語句中的函數調用可能也會占用一些列空間),超限時需要顯式指定較少的返回數據列,以避免語句執行報錯。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
- 庫的數目,超級表的數目、表的數目,系統不做限制,僅受系統資源限制。
TAOS SQL 其他約定
GROUP BY的限制
TAOS SQL 支持對標簽、TBNAME 進行 GROUP BY 操作,也(ye)支持普通(tong)列(lie)(lie)進行 GROUP BY,前提(ti)是(shi):僅(jin)限一(yi)列(lie)(lie)且該列(lie)(lie)的唯一(yi)值小于 10 萬個。注意(yi):group by 不支持float,double 類(lei)型。
IS NOT NULL 與不為空的表達式適用范圍
IS NOT NULL 支持所有(you)類型的(de)列。不為空(kong)的(de)表達式為 <>"",僅對非數值類型的(de)列適用。
ORDER BY的限制
- 非超級表只能有一個order by.
- 超級表最多兩個order by, 并且第二個必須為ts.
- order by tag,必須和group by tag一起,并且是同一個tag。 tbname和tag一樣邏輯。 只適用于超級表
- order by 普通列,必須和group by一起或者和top/bottom一起,并且是同一個普通列。 適用于超級表和普通表。如果同時存在 group by和 top/bottom一起,order by優先必須和group by同一列。
- order by ts. 適用于超級表和普通表。
- order by ts同時含有group by時 針對group內部用ts排序
表(列)名合法性說明
TDengine 中的表(biao)(列)名(ming)命名(ming)規則(ze)如下: 只(zhi)能由字母、數字、下劃線構(gou)成,數字不能在首(shou)位,長(chang)度不能超過192字節,不區分大小寫(xie)。這里(li)表(biao)名(ming)稱不包括數據庫名(ming)的前綴和分隔符。
轉(zhuan)(zhuan)義(yi)后表(biao)(列)名(ming)(ming)(ming)規(gui)則: 為了兼(jian)容支持(chi)更多形式(shi)的(de)表(biao)(列)名(ming)(ming)(ming),TDengine 引入新(xin)的(de)轉(zhuan)(zhuan)義(yi)符(fu) "`"。可用讓表(biao)名(ming)(ming)(ming)與關鍵詞(ci)不沖(chong)突,同時(shi)不受限于上述表(biao)名(ming)(ming)(ming)稱合(he)法性約束檢查,轉(zhuan)(zhuan)義(yi)符(fu)不計入表(biao)名(ming)(ming)(ming)稱的(de)長(chang)度(du)。 轉(zhuan)(zhuan)義(yi)后的(de)表(biao)(列)名(ming)(ming)(ming)同樣受到長(chang)度(du)限制(zhi)要求,且長(chang)度(du)計算的(de)時(shi)候(hou)不計算轉(zhuan)(zhuan)義(yi)符(fu)。使(shi)用轉(zhuan)(zhuan)義(yi)字(zi)符(fu)以后,不再對轉(zhuan)(zhuan)義(yi)字(zi)符(fu)中的(de)內(nei)容進行(xing)大小寫統一。
例如(ru): `aBc` 和 `abc` 是不同的(de)表(列)名(ming),但是 abc 和 aBc 是相同的(de)表(列)名(ming)。
需要注(zhu)意(yi)的是轉義字符中的內容必須是可打印字符。
支持(chi)版(ban)(ban)本 支持(chi)轉義符的功能從 2.3.0.1 版(ban)(ban)本開始。
Json類型使用說明
-
語法說明
-
創(chuang)建(jian)json類型tag
create stable s1 (ts timestamp, v1 int) tags (info json) create table s1_1 using s1 tags ('{"k1": "v1"}') -
json取值操作符 ->
select * from s1 where info->'k1' = 'v1' select info->'k1' from s1 -
json key是否(fou)存在(zai)操作符 contains
select * from s1 where info contains 'k2' select * from s1 where info contains 'k1'
-
-
支持的操作
-
在where條件中時,支持函數match/nmatch/between and/like/and/or/is null/is no null,不支持in
select * from s1 where info->'k1' match 'v*'; select * from s1 where info->'k1' like 'v%' and info contains 'k2'; select * from s1 where info is null; select * from s1 where info->'k1' is not null -
支(zhi)持(chi)json tag放(fang)在group by、order by、join子(zi)句、union all以及子(zi)查詢中,比如group by json->'key'
-
支(zhi)持distinct操作(zuo).
select distinct info->'k1' from s1 -
標簽操作
支(zhi)持(chi)修改json標簽值(zhi)(全量覆蓋)
支(zhi)持修改json標(biao)簽名(ming)
不(bu)支(zhi)持添(tian)加json標簽(qian)、刪除json標簽(qian)、修改json標簽(qian)列寬
-
-
其他約束條件
-
只(zhi)有標(biao)簽(qian)列可以(yi)使用json類(lei)型,如果(guo)用json標(biao)簽(qian),標(biao)簽(qian)列只(zhi)能有一個。
-
長(chang)度(du)限制(zhi):json 中(zhong)key的長(chang)度(du)不能超(chao)過256,并且(qie)key必須為可打印ascii字(zi)符;json字(zi)符串(chuan)總長(chang)度(du)不超(chao)過4096個字(zi)節。
-
json格式限制:
- json輸入字符串可以為空("","\t"," "或null)或object,不能為非空的字符串,布爾型和數組。
- object 可為{},如果object為{},則整個json串記為空。key可為"",若key為"",則json串中忽略該k-v對。
- value可以為數字(int/double)或字符串或bool或null,暫不可以為數組。不允許嵌套。
- 若json字符串中出現兩個相同的key,則第一個生效。
- json字符串里暫不支持轉義。
-
當(dang)查詢(xun)json中不存在的key時,返回NULL
-
當json tag作(zuo)為子查詢(xun)結果時,不再(zai)支持上層查詢(xun)繼續(xu)對子查詢(xun)中的json串(chuan)做解析查詢(xun)。
比如暫不支持
select jtag->'key' from (select jtag from stable)不支持
select jtag->'key' from (select jtag from stable) where jtag->'key'>0轉義字符說明
-
-
轉義(yi)字符(fu)表 (轉義(yi)符(fu)的功(gong)能從 2.4.0.4 版本開(kai)始)
字符序列 代表的字符 \'單引號' \"雙引號" \n 換行符 \r 回車符 \t tab符 \\斜杠\ \%% 規則見下 \__ 規則見下 -
轉義字符使用規則
- 標識符里有轉義字符(數據庫名、表名、列名)
- 普通標識符: 直接提示錯誤的標識符,因為標識符規定必須是數字、字母和下劃線,并且不能以數字開頭。
- 反引號``標識符: 保持原樣,不轉義
- 數據里有轉義字符
- 遇到上面定義的轉義字符會轉義(%和_見下面說明),如果沒有匹配的轉義字符會忽略掉轉義符\。
- 對于%和,因為在like里這兩個字符是通配符,所以在模式匹配like里用
\%%和\_表示字符里本身的%和,如果在like模式匹配上下文之外使用\%或\_,則它們的計算結果為字符串\%和\_,而不是%和_。

