TAOS SQL
本文檔說明 TAOS SQL 支持的語法規(guī)則、主要查詢功能、支持的 SQL 查詢函數(shù),以及常用技巧等內(nèi)容。閱讀本文檔需要讀者具有基本的 SQL 語言的基礎(chǔ)。
TAOS SQL 是用戶對(duì) TDengine 進(jìn)行數(shù)據(jù)寫入和查詢的主要工具。TAOS SQL 為了便于用戶快速上手,在一定程度上提供類似于標(biāo)準(zhǔn) SQL 類似的風(fēng)格和模式。嚴(yán)格意義上,TAOS SQL 并不是也不試圖提供 SQL 標(biāo)準(zhǔn)的語法。此外,由于 TDengine 針對(duì)的時(shí)序性結(jié)構(gòu)化數(shù)據(jù)不提供刪除功能,因此在 TAO SQL 中不提供數(shù)據(jù)刪除的相關(guān)功能。
TAOS SQL 目前僅支持 DESCRIBE 關(guān)鍵字的縮寫,DESCRIBE 可以縮寫為 DESC。
本章節(jié) SQL 語法遵循如下約定:
- < > 里的內(nèi)容是用戶需要輸入的,但不要輸入 <> 本身
- [ ] 表示內(nèi)容為可選項(xiàng),但不能輸入 [] 本身
- | 表示多選一,選擇其中一個(gè)即可,但不能輸入 | 本身
- … 表示前面的項(xiàng)可重復(fù)多個(gè)
為更好地說明 SQL 語法的規(guī)則及其特點(diǎn),本文假設(shè)存在一個(gè)數(shù)據(jù)集。以智能電表(meters)為例,假設(shè)每個(gè)智能電表采集電流、電壓、相位三個(gè)量。其建模如下:
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 |
數(shù)據(jù)集包含 4 個(gè)智能電表的數(shù)據(jù),按照 TDengine 的建模規(guī)則,對(duì)應(yīng) 4 個(gè)子表,其名稱分別是 d1001, d1002, d1003, d1004。
支持的數(shù)據(jù)類型
使用 TDengine,最重要的是時(shí)間戳。創(chuàng)建并插入記錄、查詢歷史記錄的時(shí)候,均需要指定時(shí)間戳。時(shí)間戳有如下規(guī)則:
- 時(shí)間格式為
YYYY-MM-DD HH:mm:ss.MS,默認(rèn)時(shí)間分辨率為毫秒。比如:2017-08-12 18:25:58.128 - 內(nèi)部函數(shù) now 是客戶端的當(dāng)前時(shí)間
- 插入記錄時(shí),如果時(shí)間戳為 now,插入數(shù)據(jù)時(shí)使用提交這條記錄的客戶端的當(dāng)前時(shí)間
- Epoch Time:時(shí)間戳也可以是一個(gè)長(zhǎng)整數(shù),表示從格林威治時(shí)間 1970-01-01 00:00:00.000 (UTC/GMT) 開始的毫秒數(shù)(相應(yīng)地,如果所在 Database 的時(shí)間精度設(shè)置為“微秒”,則長(zhǎng)整型格式的時(shí)間戳含義也就對(duì)應(yīng)于從格林威治時(shí)間 1970-01-01 00:00:00.000 (UTC/GMT) 開始的微秒數(shù);納秒精度的邏輯也是類似的。)
- 時(shí)間可以加減,比如 now-2h,表明查詢時(shí)刻向前推 2 個(gè)小時(shí)(最近 2 小時(shí))。數(shù)字后面的時(shí)間單位可以是 b(納秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小時(shí))、d(天)、w(周)。 比如
select * from t1 where ts > now-2w and ts <= now-1w,表示查詢兩周前整整一周的數(shù)據(jù)。在指定降采樣操作(down sampling)的時(shí)間窗口(interval)時(shí),時(shí)間單位還可以使用 n(自然月) 和 y(自然年)。
TDengine 缺省的時(shí)間戳是毫秒精度,但通過在 CREATE DATABASE 時(shí)傳遞的 PRECISION 參數(shù)就可以支持微秒和納秒。(從 2.1.5.0 版本開始支持納秒精度)
CREATE DATABASE db_name PRECISION 'ns';
在TDengine中,普通表的數(shù)據(jù)模型中可使用以下 10 種數(shù)據(jù)類型。
| # | 類型 | Bytes | 說明 |
|---|---|---|---|
| 1 | TIMESTAMP | 8 | 時(shí)間戳。缺省精度毫秒,可支持微秒和納秒。從格林威治時(shí)間 1970-01-01 00:00:00.000 (UTC/GMT) 開始,計(jì)時(shí)不能早于該時(shí)間。(從 2.0.18.0 版本開始,已經(jīng)去除了這一時(shí)間范圍限制)(從 2.1.5.0 版本開始支持納秒精度) |
| 2 | INT | 4 | 整型,范圍 [-2^31+1, 2^31-1], -2^31 用作 NULL |
| 3 | BIGINT | 8 | 長(zhǎng)整型,范圍 [-2^63+1, 2^63-1], -2^63 用于 NULL |
| 4 | FLOAT | 4 | 浮點(diǎn)型,有效位數(shù) 6-7,范圍 [-3.4E38, 3.4E38] |
| 5 | DOUBLE | 8 | 雙精度浮點(diǎn)型,有效位數(shù) 15-16,范圍 [-1.7E308, 1.7E308] |
| 6 | BINARY | 自定義 | 記錄單字節(jié)字符串,建議只用于處理 ASCII 可見字符,中文等多字節(jié)字符需使用 nchar。理論上,最長(zhǎng)可以有 16374 字節(jié)。binary 僅支持字符串輸入,字符串兩端需使用單引號(hào)引用。使用時(shí)須指定大小,如 binary(20) 定義了最長(zhǎng)為 20 個(gè)單字節(jié)字符的字符串,每個(gè)字符占 1 byte 的存儲(chǔ)空間,總共固定占用 20 bytes 的空間,此時(shí)如果用戶字符串超出 20 字節(jié)將會(huì)報(bào)錯(cuò)。對(duì)于字符串內(nèi)的單引號(hào),可以用轉(zhuǎn)義字符反斜線加單引號(hào)來表示,即 \’。 |
| 7 | SMALLINT | 2 | 短整型, 范圍 [-32767, 32767], -32768 用于 NULL |
| 8 | TINYINT | 1 | 單字節(jié)整型,范圍 [-127, 127], -128 用于 NULL |
| 9 | BOOL | 1 | 布爾型,{true, false} |
| 10 | NCHAR | 自定義 | 記錄包含多字節(jié)字符在內(nèi)的字符串,如中文字符。每個(gè) nchar 字符占用 4 bytes 的存儲(chǔ)空間。字符串兩端使用單引號(hào)引用,字符串內(nèi)的單引號(hào)需用轉(zhuǎn)義字符 \’。nchar 使用時(shí)須指定字符串大小,類型為 nchar(10) 的列表示此列的字符串最多存儲(chǔ) 10 個(gè) nchar 字符,會(huì)固定占用 40 bytes 的空間。如果用戶字符串長(zhǎng)度超出聲明長(zhǎng)度,將會(huì)報(bào)錯(cuò)。 |
| 11 | JSON | json數(shù)據(jù)類型, 只有tag類型可以是json格式 |
Tips:
- TDengine 對(duì) SQL 語句中的英文字符不區(qū)分大小寫,自動(dòng)轉(zhuǎn)化為小寫執(zhí)行。因此用戶大小寫敏感的字符串及密碼,需要使用單引號(hào)將字符串引起來。
- 注意,雖然 Binary 類型在底層存儲(chǔ)上支持字節(jié)型的二進(jìn)制字符,但不同編程語言對(duì)二進(jìn)制數(shù)據(jù)的處理方式并不保證一致,因此建議在 Binary 類型中只存儲(chǔ) ASCII 可見字符,而避免存儲(chǔ)不可見字符。多字節(jié)的數(shù)據(jù),例如中文字符,則需要使用 nchar 類型進(jìn)行保存。如果強(qiáng)行使用 Binary 類型保存中文字符,雖然有時(shí)也能正常讀寫,但并不帶有字符集信息,很容易出現(xiàn)數(shù)據(jù)亂碼甚至數(shù)據(jù)損壞等情況。
- 注意,SQL語句中的數(shù)值類型將依據(jù)是否存在小數(shù)點(diǎn),或使用科學(xué)計(jì)數(shù)法表示,來判斷數(shù)值類型是否為整型或者浮點(diǎn)型,因此在使用時(shí)要注意相應(yīng)類型越界的情況。例如,9999999999999999999會(huì)認(rèn)為超過長(zhǎng)整型的上邊界而溢出,而9999999999999999999.0會(huì)被認(rèn)為是有效的浮點(diǎn)數(shù)。
數(shù)據(jù)庫(kù)管理
-
創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1];說明:
1) KEEP是該數(shù)據(jù)庫(kù)的數(shù)據(jù)保留多長(zhǎng)天數(shù),缺省是3650天(10年),數(shù)據(jù)庫(kù)會(huì)自動(dòng)刪除超過時(shí)限的數(shù)據(jù);
2) UPDATE 標(biāo)志數(shù)據(jù)庫(kù)支持更新相同時(shí)間戳數(shù)據(jù);(從 2.1.7.0 版本開始此參數(shù)支持設(shè)為 2,表示允許部分列更新,也即更新數(shù)據(jù)行時(shí)未被設(shè)置的列會(huì)保留原值。)(從 2.0.8.0 版本開始支持此參數(shù)。注意此參數(shù)不能通過
ALTER DATABASE指令進(jìn)行修改。)1) UPDATE設(shè)為0時(shí),表示不允許更新數(shù)據(jù),后發(fā)送的相同時(shí)間戳的數(shù)據(jù)會(huì)被直接丟棄; 2) UPDATE設(shè)為1時(shí),表示更新全部列數(shù)據(jù),即如果更新一個(gè)數(shù)據(jù)行,其中某些列沒有提供取值,那么這些列會(huì)被設(shè)為 NULL; 3) UPDATE設(shè)為2時(shí),表示支持更新部分列數(shù)據(jù),即如果更新一個(gè)數(shù)據(jù)行,其中某些列沒有提供取值,那么這些列會(huì)保持原有數(shù)據(jù)行中的對(duì)應(yīng)值; 4) 更多關(guān)于UPDATE參數(shù)的用法,請(qǐng)參考[FAQ](http://www.fjzmyy.cn/cn/documentation/faq)。3) 數(shù)據(jù)庫(kù)名最大長(zhǎng)度為32;
4) 一條SQL 語句的最大長(zhǎng)度為65480個(gè)字符;
5) 數(shù)據(jù)庫(kù)還有更多與存儲(chǔ)相關(guān)的配置參數(shù),請(qǐng)參見 服務(wù)端配置 章節(jié)。
-
顯示系統(tǒng)當(dāng)前參數(shù)
SHOW VARIABLES; -
使用數(shù)據(jù)庫(kù)
USE db_name;使用/切換數(shù)據(jù)庫(kù)(在 RESTful 連接方式下無效)。
-
刪除數(shù)據(jù)庫(kù)
DROP DATABASE [IF EXISTS] db_name;刪除數(shù)據(jù)庫(kù)。指定 Database 所包含的全部數(shù)據(jù)表將被刪除,謹(jǐn)慎使用!
-
修改數(shù)據(jù)庫(kù)參數(shù)
ALTER DATABASE db_name COMP 2;COMP 參數(shù)是指修改數(shù)據(jù)庫(kù)文件壓縮標(biāo)志位,缺省值為 2,取值范圍為 [0, 2]。0 表示不壓縮,1 表示一階段壓縮,2 表示兩階段壓縮。
ALTER DATABASE db_name REPLICA 2;REPLICA 參數(shù)是指修改數(shù)據(jù)庫(kù)副本數(shù),取值范圍 [1, 3]。在集群中使用,副本數(shù)必須小于或等于 DNODE 的數(shù)目。
ALTER DATABASE db_name KEEP 365;KEEP 參數(shù)是指修改數(shù)據(jù)文件保存的天數(shù),缺省值為 3650,取值范圍 [days, 365000],必須大于或等于 days 參數(shù)值。
ALTER DATABASE db_name QUORUM 2;QUORUM 參數(shù)是指數(shù)據(jù)寫入成功所需要的確認(rèn)數(shù),取值范圍 [1, 2]。對(duì)于異步復(fù)制,quorum 設(shè)為 1,具有 master 角色的虛擬節(jié)點(diǎn)自己確認(rèn)即可。對(duì)于同步復(fù)制,quorum 設(shè)為 2。原則上,Quorum >= 1 并且 Quorum <= replica(副本數(shù)),這個(gè)參數(shù)在啟動(dòng)一個(gè)同步模塊實(shí)例時(shí)需要提供。
ALTER DATABASE db_name BLOCKS 100;BLOCKS 參數(shù)是每個(gè) VNODE (TSDB) 中有多少 cache 大小的內(nèi)存塊,因此一個(gè) VNODE 的用的內(nèi)存大小粗略為(cache * blocks)。取值范圍 [3, 10000]。
ALTER DATABASE db_name CACHELAST 0;CACHELAST 參數(shù)控制是否在內(nèi)存中緩存子表的最近數(shù)據(jù)。缺省值為 0,取值范圍 [0, 1, 2, 3]。其中 0 表示不緩存,1 表示緩存子表最近一行數(shù)據(jù),2 表示緩存子表每一列的最近的非 NULL 值,3 表示同時(shí)打開緩存最近行和列功能。(從 2.0.11.0 版本開始支持參數(shù)值 [0, 1],從 2.1.2.0 版本開始支持參數(shù)值 [0, 1, 2, 3]。)
說明:緩存最近行,將顯著改善 LAST_ROW 函數(shù)的性能表現(xiàn);緩存每列的最近非 NULL 值,將顯著改善無特殊影響(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函數(shù)的性能表現(xiàn)。Tips: 以上所有參數(shù)修改后都可以用show databases來確認(rèn)是否修改成功。另外,從 2.1.3.0 版本開始,修改這些參數(shù)后無需重啟服務(wù)器即可生效。
-
顯示系統(tǒng)所有數(shù)據(jù)庫(kù)
SHOW DATABASES; -
顯示一個(gè)數(shù)據(jù)庫(kù)的創(chuàng)建語句
SHOW CREATE DATABASE db_name;常用于數(shù)據(jù)庫(kù)遷移。對(duì)一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù),返回其創(chuàng)建語句;在另一個(gè)集群中執(zhí)行該語句,就能得到一個(gè)設(shè)置完全相同的 Database。
表管理
-
創(chuàng)建數(shù)據(jù)表
CREATE TABLE [IF NOT EXISTS] tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]);說明:
1) 表的第一個(gè)字段必須是 TIMESTAMP,并且系統(tǒng)自動(dòng)將其設(shè)為主鍵;
2) 表名最大長(zhǎng)度為 192;
3) 表的每行長(zhǎng)度不能超過 48K 個(gè)字符(2.1.7.0 之前的版本為 16K,每個(gè) BINARY/NCHAR 類型的列還會(huì)額外占用 2 個(gè) byte 的存儲(chǔ)位置)
4) 子表名只能由字母、數(shù)字和下劃線組成,且不能以數(shù)字開頭,不區(qū)分大小寫
5) 使用數(shù)據(jù)類型 binary 或 nchar,需指定其最長(zhǎng)的字節(jié)數(shù),如 binary(20),表示 20 字節(jié);
6) 為了兼容支持更多形式的表名,TDengine 引入新的轉(zhuǎn)義符 "`",可以讓表名與關(guān)鍵詞不沖突,同時(shí)不受限于上述表名稱合法性約束檢查。但是同樣具有長(zhǎng)度限制要求。使用轉(zhuǎn)義字符以后,不再對(duì)轉(zhuǎn)義字符中的內(nèi)容進(jìn)行大小寫統(tǒng)一。 例如:`aBc` 和 `abc` 是不同的表名,但是 abc 和 aBc 是相同的表名。 需要注意的是轉(zhuǎn)義字符中的內(nèi)容必須是可打印字符。 上述的操作邏輯和約束要求與MySQL數(shù)據(jù)的操作一致。 從 2.3.0.0 版本開始支持這種方式。
-
以超級(jí)表為模板創(chuàng)建數(shù)據(jù)表
CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name TAGS (tag_value1, ...);以指定的超級(jí)表為模板,指定 TAGS 的值來創(chuàng)建數(shù)據(jù)表。
-
以超級(jí)表為模板創(chuàng)建數(shù)據(jù)表,并指定具體的 TAGS 列
CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...);以指定的超級(jí)表為模板,指定一部分 TAGS 列的值來創(chuàng)建數(shù)據(jù)表(沒被指定的 TAGS 列會(huì)設(shè)為空值)。
說明:從 2.0.17.0 版本開始支持這種方式。在之前的版本中,不允許指定 TAGS 列,而必須顯式給出所有 TAGS 列的取值。 -
批量創(chuàng)建數(shù)據(jù)表
CREATE TABLE [IF NOT EXISTS] tb_name1 USING stb_name TAGS (tag_value1, ...) [IF NOT EXISTS] tb_name2 USING stb_name TAGS (tag_value2, ...) ...;以更快的速度批量創(chuàng)建大量數(shù)據(jù)表(服務(wù)器端 2.0.14 及以上版本)。
說明:
1)批量建表方式要求數(shù)據(jù)表必須以超級(jí)表為模板。
2)在不超出 SQL 語句長(zhǎng)度限制的前提下,單條語句中的建表數(shù)量建議控制在 1000~3000 之間,將會(huì)獲得比較理想的建表速度。
-
刪除數(shù)據(jù)表
DROP TABLE [IF EXISTS] tb_name; -
顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有數(shù)據(jù)表信息
SHOW TABLES [LIKE tb_name_wildcar];顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有數(shù)據(jù)表信息。
-
顯示一個(gè)數(shù)據(jù)表的創(chuàng)建語句
SHOW CREATE TABLE tb_name;常用于數(shù)據(jù)庫(kù)遷移。對(duì)一個(gè)已經(jīng)存在的數(shù)據(jù)表,返回其創(chuàng)建語句;在另一個(gè)集群中執(zhí)行該語句,就能得到一個(gè)結(jié)構(gòu)完全相同的數(shù)據(jù)表。
-
在線修改顯示字符寬度
SET MAX_BINARY_DISPLAY_WIDTH <nn>;如顯示的內(nèi)容后面以...結(jié)尾時(shí),表示該內(nèi)容已被截?cái)?,可通過本命令修改顯示字符寬度以顯示完整的內(nèi)容。
-
獲取表的結(jié)構(gòu)信息
DESCRIBE tb_name; -
表增加列
ALTER TABLE tb_name ADD COLUMN field_name data_type;說明:
1) 列的最大個(gè)數(shù)為1024,最小個(gè)數(shù)為2;(從 2.1.7.0 版本開始,改為最多允許 4096 列)
2) 列名最大長(zhǎng)度為64。
-
表刪除列
ALTER TABLE tb_name DROP COLUMN field_name;如果表是通過超級(jí)表創(chuàng)建,更改表結(jié)構(gòu)的操作只能對(duì)超級(jí)表進(jìn)行。同時(shí)針對(duì)超級(jí)表的結(jié)構(gòu)更改對(duì)所有通過該結(jié)構(gòu)創(chuàng)建的表生效。對(duì)于不是通過超級(jí)表創(chuàng)建的表,可以直接修改表結(jié)構(gòu)。
-
表修改列寬
ALTER TABLE tb_name MODIFY COLUMN field_name data_type(length);如果數(shù)據(jù)列的類型是可變長(zhǎng)格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改小)。(2.1.3.0 版本新增)
如果表是通過超級(jí)表創(chuàng)建,更改表結(jié)構(gòu)的操作只能對(duì)超級(jí)表進(jìn)行。同時(shí)針對(duì)超級(jí)表的結(jié)構(gòu)更改對(duì)所有通過該結(jié)構(gòu)創(chuàng)建的表生效。對(duì)于不是通過超級(jí)表創(chuàng)建的表,可以直接修改表結(jié)構(gòu)。
超級(jí)表STable管理
注意:在 2.0.15.0 及以后的版本中,開始支持 STABLE 保留字。也即,在本節(jié)后文的指令說明中,CREATE、DROP、ALTER 三個(gè)指令在老版本中保留字需寫作 TABLE 而不是 STABLE。
-
創(chuàng)建超級(jí)表
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]);創(chuàng)建 STable,與創(chuàng)建表的 SQL 語法相似,但需要指定 TAGS 字段的名稱和類型。
說明:
1) TAGS 列的數(shù)據(jù)類型不能是 timestamp 類型;(從 2.1.3.0 版本開始,TAGS 列中支持使用 timestamp 類型,但需注意在 TAGS 中的 timestamp 列寫入數(shù)據(jù)時(shí)需要提供給定值,而暫不支持四則運(yùn)算,例如
NOW + 10s這類表達(dá)式)2) TAGS 列名不能與其他列名相同;
3) TAGS 列名不能為預(yù)留關(guān)鍵字(參見:參數(shù)限制與保留關(guān)鍵字 章節(jié));
4) TAGS 最多允許 128 個(gè),至少 1 個(gè),總長(zhǎng)度不超過 16 KB。
-
刪除超級(jí)表
DROP STABLE [IF EXISTS] stb_name;刪除 STable 會(huì)自動(dòng)刪除通過 STable 創(chuàng)建的子表。
-
顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有超級(jí)表信息
SHOW STABLES [LIKE tb_name_wildcard];查看數(shù)據(jù)庫(kù)內(nèi)全部 STable,及其相關(guān)信息,包括 STable 的名稱、創(chuàng)建時(shí)間、列數(shù)量、標(biāo)簽(TAG)數(shù)量、通過該 STable 建表的數(shù)量。
-
顯示一個(gè)超級(jí)表的創(chuàng)建語句
SHOW CREATE STABLE stb_name;常用于數(shù)據(jù)庫(kù)遷移。對(duì)一個(gè)已經(jīng)存在的超級(jí)表,返回其創(chuàng)建語句;在另一個(gè)集群中執(zhí)行該語句,就能得到一個(gè)結(jié)構(gòu)完全相同的超級(jí)表。
-
獲取超級(jí)表的結(jié)構(gòu)信息
DESCRIBE stb_name; -
超級(jí)表增加列
ALTER STABLE stb_name ADD COLUMN field_name data_type; -
超級(jí)表刪除列
ALTER STABLE stb_name DROP COLUMN field_name; -
超級(jí)表修改列寬
ALTER STABLE stb_name MODIFY COLUMN field_name data_type(length);如果數(shù)據(jù)列的類型是可變長(zhǎng)格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改?。?。(2.1.3.0 版本新增)
超級(jí)表 STable 中 TAG 管理
-
添加標(biāo)簽
ALTER STABLE stb_name ADD TAG new_tag_name tag_type;為 STable 增加一個(gè)新的標(biāo)簽,并指定新標(biāo)簽的類型。標(biāo)簽總數(shù)不能超過 128 個(gè),總長(zhǎng)度不超過 16K 個(gè)字符。
-
刪除標(biāo)簽
ALTER STABLE stb_name DROP TAG tag_name;刪除超級(jí)表的一個(gè)標(biāo)簽,從超級(jí)表刪除某個(gè)標(biāo)簽后,該超級(jí)表下的所有子表也會(huì)自動(dòng)刪除該標(biāo)簽。
-
修改標(biāo)簽名
ALTER STABLE stb_name CHANGE TAG old_tag_name new_tag_name;修改超級(jí)表的標(biāo)簽名,從超級(jí)表修改某個(gè)標(biāo)簽名后,該超級(jí)表下的所有子表也會(huì)自動(dòng)更新該標(biāo)簽名。
-
修改標(biāo)簽列寬度
ALTER STABLE stb_name MODIFY TAG tag_name data_type(length);如果標(biāo)簽的類型是可變長(zhǎng)格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改?。?。(2.1.3.0 版本新增)
-
修改子表標(biāo)簽值
ALTER TABLE tb_name SET TAG tag_name=new_tag_value;說明:除了更新標(biāo)簽的值的操作是針對(duì)子表進(jìn)行,其他所有的標(biāo)簽操作(添加標(biāo)簽、刪除標(biāo)簽等)均只能作用于 STable,不能對(duì)單個(gè)子表操作。對(duì) STable 添加標(biāo)簽以后,依托于該 STable 建立的所有表將自動(dòng)增加了一個(gè)標(biāo)簽,所有新增標(biāo)簽的默認(rèn)值都是 NULL。
數(shù)據(jù)寫入
寫入語法:
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
...];
詳細(xì)描述及示例:
-
插入一條或多條記錄
指定已經(jīng)創(chuàng)建好的數(shù)據(jù)子表的表名,并通過 VALUES 關(guān)鍵字提供一行或多行數(shù)據(jù),即可向數(shù)據(jù)庫(kù)寫入這些數(shù)據(jù)。例如,執(zhí)行如下語句可以寫入一行記錄:INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);或者,可以通過如下語句寫入兩行記錄:
INSERT INTO d1001 VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32) (1626164208000, 10.15, 217, 0.33);注意:
1)在第二個(gè)例子中,兩行記錄的首列時(shí)間戳使用了不同格式的寫法。其中字符串格式的時(shí)間戳寫法不受所在 DATABASE 的時(shí)間精度設(shè)置影響;而長(zhǎng)整形格式的時(shí)間戳寫法會(huì)受到所在 DATABASE 的時(shí)間精度設(shè)置影響——例子中的時(shí)間戳在毫秒精度下可以寫作 1626164208000,而如果是在微秒精度設(shè)置下就需要寫為 1626164208000000,納秒精度設(shè)置下需要寫為 1626164208000000000。
2)在使用“插入多條記錄”方式寫入數(shù)據(jù)時(shí),不能把第一列的時(shí)間戳取值都設(shè)為 NOW,否則會(huì)導(dǎo)致語句中的多條記錄使用相同的時(shí)間戳,于是就可能出現(xiàn)相互覆蓋以致這些數(shù)據(jù)行無法全部被正確保存。其原因在于,NOW 函數(shù)在執(zhí)行中會(huì)被解析為所在 SQL 語句的實(shí)際執(zhí)行時(shí)間,出現(xiàn)在同一語句中的多個(gè) NOW 標(biāo)記也就會(huì)被替換為完全相同的時(shí)間戳取值。
3)允許插入的最老記錄的時(shí)間戳,是相對(duì)于當(dāng)前服務(wù)器時(shí)間,減去配置的 keep 值(數(shù)據(jù)保留的天數(shù));允許插入的最新記錄的時(shí)間戳,是相對(duì)于當(dāng)前服務(wù)器時(shí)間,加上配置的 days 值(數(shù)據(jù)文件存儲(chǔ)數(shù)據(jù)的時(shí)間跨度,單位為天)。keep 和 days 都是可以在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定的,缺省值分別是 3650 天和 10 天。 -
插入記錄,數(shù)據(jù)對(duì)應(yīng)到指定的列
向數(shù)據(jù)子表中插入記錄時(shí),無論插入一行還是多行,都可以讓數(shù)據(jù)對(duì)應(yīng)到指定的列。對(duì)于 SQL 語句中沒有出現(xiàn)的列,數(shù)據(jù)庫(kù)將自動(dòng)填充為 NULL。主鍵(時(shí)間戳)不能為 NULL。例如:INSERT INTO d1001 (ts, current, phase) VALUES ('2021-07-13 14:06:33.196', 10.27, 0.31);說明:如果不指定列,也即使用全列模式——那么在 VALUES 部分提供的數(shù)據(jù),必須為數(shù)據(jù)表的每個(gè)列都顯式地提供數(shù)據(jù)。全列模式寫入速度會(huì)遠(yuǎn)快于指定列,因此建議盡可能采用全列寫入方式,此時(shí)空列可以填入 NULL。
-
向多個(gè)表插入記錄
可以在一條語句中,分別向多個(gè)表插入一條或多條記錄,并且也可以在插入過程中指定列。例如: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); -
插入記錄時(shí)自動(dòng)建表
如果用戶在寫數(shù)據(jù)時(shí)并不確定某個(gè)表是否存在,此時(shí)可以在寫入數(shù)據(jù)時(shí)使用自動(dòng)建表語法來創(chuàng)建不存在的表,若該表已存在則不會(huì)建立新表。自動(dòng)建表時(shí),要求必須以超級(jí)表為模板,并寫明數(shù)據(jù)表的 TAGS 取值。例如:INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);也可以在自動(dòng)建表時(shí),只是指定部分 TAGS 列的取值,未被指定的 TAGS 列將置為 NULL。例如:
INSERT INTO d21001 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33);自動(dòng)建表語法也支持在一條語句中向多個(gè)表插入記錄。例如:
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);說明:在 2.0.20.5 版本之前,在使用自動(dòng)建表語法并指定列時(shí),子表的列名必須緊跟在子表名稱后面,而不能如例子里那樣放在 TAGS 和 VALUES 之間。從 2.0.20.5 版本開始,兩種寫法都可以,但不能在一條 SQL 語句中混用,否則會(huì)報(bào)語法錯(cuò)誤。
-
插入來自文件的數(shù)據(jù)記錄
除了使用 VALUES 關(guān)鍵字插入一行或多行數(shù)據(jù)外,也可以把要寫入的數(shù)據(jù)放在 CSV 文件中(英文逗號(hào)分隔、英文單引號(hào)括住每個(gè)值)供 SQL 指令讀取。其中 CSV 文件無需表頭。例如,如果 /tmp/csvfile.csv 文件的內(nèi)容為:'2021-07-13 14:07:34.630', '10.2', '219', '0.32' '2021-07-13 14:07:35.779', '10.15', '217', '0.33'那么通過如下指令可以把這個(gè)文件中的數(shù)據(jù)寫入子表中:
INSERT INTO d1001 FILE '/tmp/csvfile.csv'; -
插入來自文件的數(shù)據(jù)記錄,并自動(dòng)建表
從 2.1.5.0 版本開始,支持在插入來自 CSV 文件的數(shù)據(jù)時(shí),以超級(jí)表為模板來自動(dòng)創(chuàng)建不存在的數(shù)據(jù)表。例如:INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile.csv';也可以在一條語句中向多個(gè)表以自動(dòng)建表的方式插入記錄。例如:
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';
歷史記錄寫入:可使用IMPORT或者INSERT命令,IMPORT的語法,功能與INSERT完全一樣。
說明:針對(duì) insert 類型的 SQL 語句,我們采用的流式解析策略,在發(fā)現(xiàn)后面的錯(cuò)誤之前,前面正確的部分 SQL 仍會(huì)執(zhí)行。下面的 SQL 中,INSERT 語句是無效的,但是 d1001 仍會(huì)被創(chuàng)建。
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)
數(shù)據(jù)查詢
查詢語法:
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];
通配符
通配符 * 可以用于代指全部列。對(duì)于普通表,結(jié)果中只有普通列。
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)
在針對(duì)超級(jí)表,通配符包含 標(biāo)簽列 。
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)
通配符支持表名前綴,以下兩個(gè)SQL語句均為返回全部的列:
SELECT * FROM d1001;
SELECT d1001.* FROM d1001;
在JOIN查詢中,帶前綴的*和不帶前綴*返回的結(jié)果有差別, *返回全部表的所有列數(shù)據(jù)(不包含標(biāo)簽),帶前綴的通配符,則只返回該表的列數(shù)據(jù)。
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函數(shù)來進(jìn)行查詢的過程中,部分SQL函數(shù)支持通配符操作。其中的區(qū)別在于:
count(*)函數(shù)只返回一列。first、last、last_row函數(shù)則是返回全部列。
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)
標(biāo)簽列
從 2.0.14 版本開始,支持在普通表的查詢中指定 標(biāo)簽列,且標(biāo)簽列的值會(huì)與普通列的數(shù)據(jù)一起返回。
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)
注意:普通表的通配符 * 中并不包含 標(biāo)簽列。
獲取標(biāo)簽列或普通列的去重取值
從 2.0.15.0 版本開始,支持在超級(jí)表查詢標(biāo)簽列時(shí),指定 DISTINCT 關(guān)鍵字,這樣將返回指定標(biāo)簽列的所有不重復(fù)取值。注意,在 2.1.6.0 版本之前,DISTINCT 只支持處理單個(gè)標(biāo)簽列,而從 2.1.6.0 版本開始,DISTINCT 可以對(duì)多個(gè)標(biāo)簽列進(jìn)行處理,輸出這些標(biāo)簽列取值不重復(fù)的組合。
SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;
從 2.1.7.0 版本開始,DISTINCT 也支持對(duì)數(shù)據(jù)子表或普通表進(jìn)行處理,也即支持獲取單個(gè)普通列的不重復(fù)取值,或多個(gè)普通列取值的不重復(fù)組合。
SELECT DISTINCT col_name [, col_name ...] FROM tb_name;
說明:
- cfg 文件中的配置參數(shù) maxNumOfDistinctRes 將對(duì) DISTINCT 能夠輸出的數(shù)據(jù)行數(shù)進(jìn)行限制。其最小值是 100000,最大值是 100000000,默認(rèn)值是 10000000。如果實(shí)際計(jì)算結(jié)果超出了這個(gè)限制,那么會(huì)僅輸出這個(gè)數(shù)量范圍內(nèi)的部分。
- 由于浮點(diǎn)數(shù)天然的精度機(jī)制原因,在特定情況下,對(duì) FLOAT 和 DOUBLE 列使用 DISTINCT 并不能保證輸出值的完全唯一性。
- 在當(dāng)前版本下,DISTINCT 不能在嵌套查詢的子查詢中使用,也不能與聚合函數(shù)、GROUP BY、或 JOIN 在同一條語句中混用。
結(jié)果集列名
SELECT子句中,如果不指定返回結(jié)果集合的列名,結(jié)果集列名稱默認(rèn)使用SELECT子句中的表達(dá)式名稱作為列名稱。此外,用戶可使用AS來重命名返回結(jié)果集合中列的名稱。例如:
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)
但是針對(duì)first(*)、last(*)、last_row(*)不支持針對(duì)單列的重命名。
隱式結(jié)果列
Select_exprs可以是表所屬列的列名,也可以是基于列的函數(shù)表達(dá)式或計(jì)算式,數(shù)量的上限256個(gè)。當(dāng)用戶使用了interval或group by tags的子句以后,在最后返回結(jié)果中會(huì)強(qiáng)制返回時(shí)間戳列(第一列)和group by子句中的標(biāo)簽列。后續(xù)的版本中可以支持關(guān)閉group by子句中隱式列的輸出,列輸出完全由select子句控制。
表(超級(jí)表)列表
FROM關(guān)鍵字后面可以是若干個(gè)表(超級(jí)表)列表,也可以是子查詢的結(jié)果。
如果沒有指定用戶的當(dāng)前數(shù)據(jù)庫(kù),可以在表名稱之前使用數(shù)據(jù)庫(kù)的名稱來指定表所屬的數(shù)據(jù)庫(kù)。例如:power.d1001 方式來跨庫(kù)使用表。
SELECT * FROM power.d1001;
------------------------------
USE power;
SELECT * FROM d1001;
特殊功能
部分特殊的查詢功能可以不使用FROM子句執(zhí)行。獲取當(dāng)前所在的數(shù)據(jù)庫(kù) database():
taos> SELECT DATABASE();
database() |
=================================
power |
Query OK, 1 row(s) in set (0.000079s)
如果登錄的時(shí)候沒有指定默認(rèn)數(shù)據(jù)庫(kù),且沒有使用USE命令切換數(shù)據(jù),則返回NULL。
taos> SELECT DATABASE();
database() |
=================================
NULL |
Query OK, 1 row(s) in set (0.000184s)
獲取服務(wù)器和客戶端版本號(hào):
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)
服務(wù)器狀態(tài)檢測(cè)語句。如果服務(wù)器正常,返回一個(gè)數(shù)字(例如 1)。如果服務(wù)器異常,返回error code。該SQL語法能兼容連接池對(duì)于TDengine狀態(tài)的檢查及第三方工具對(duì)于數(shù)據(jù)庫(kù)服務(wù)器狀態(tài)的檢查。并可以避免出現(xiàn)使用了錯(cuò)誤的心跳檢測(cè)SQL語句導(dǎo)致的連接池連接丟失的問題。
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)
函數(shù)_block_dist()使用說明
語法
SELECT _block_dist() FROM { tb_name | stb_name }
功能說明:獲得指定的(超級(jí))表的數(shù)據(jù)塊分布信息
返回結(jié)果類型:字符串。
適用數(shù)據(jù)類型:不能輸入任何參數(shù)。
嵌套子查詢支持:不支持子查詢或嵌套查詢。
說明:
返回 FROM 子句中輸入的表或超級(jí)表的數(shù)據(jù)塊分布情況。不支持查詢條件。
返回的結(jié)果是該表或超級(jí)表的數(shù)據(jù)塊所包含的行數(shù)的數(shù)據(jù)分布直方圖。
返回結(jié)果如下:
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、查詢的(超級(jí))表所包含的存儲(chǔ)在文件中的數(shù)據(jù)塊(data block)中所包含的數(shù)據(jù)行的數(shù)量分布直方圖信息:5%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 95%, 99% 的數(shù)值;
2、所有數(shù)據(jù)塊中,包含行數(shù)最少的數(shù)據(jù)塊所包含的行數(shù)量, 其中的 Min 指標(biāo) 392 行。
3、所有數(shù)據(jù)塊中,包含行數(shù)最多的數(shù)據(jù)塊所包含的行數(shù)量, 其中的 Max 指標(biāo) 800 行。
4、所有數(shù)據(jù)塊行數(shù)的算數(shù)平均值 666行(其中的 Avg 項(xiàng))。
5、所有數(shù)據(jù)塊中行數(shù)分布的均方差為 2.17 ( stddev )。
6、數(shù)據(jù)塊包含的行的總數(shù)為 2000 行(Rows)。
7、數(shù)據(jù)塊總數(shù)是 3 個(gè)數(shù)據(jù)塊 (Blocks)。
8、數(shù)據(jù)塊占用磁盤空間大小 5.44 Kb (size)。
9、壓縮后的數(shù)據(jù)塊的大小除以原始數(shù)據(jù)的所獲得的壓縮比例: 23%(Comp),及壓縮后的數(shù)據(jù)規(guī)模是原始數(shù)據(jù)規(guī)模的 23%。
10、內(nèi)存中存在的數(shù)據(jù)行數(shù)是0,表示內(nèi)存中沒有數(shù)據(jù)緩存。
11、獲取數(shù)據(jù)塊信息的過程中讀取頭文件的時(shí)間開銷 1 微秒(SeekHeaderTime)。
支持版本:指定計(jì)算算法的功能從2.1.0.x 版本開始,2.1.0.0之前的版本不支持指定使用算法的功能。
TAOS SQL中特殊關(guān)鍵詞
TBNAME: 在超級(jí)表查詢中可視為一個(gè)特殊的標(biāo)簽,代表查詢涉及的子表名
_c0: 表示表(超級(jí)表)的第一列 _qstart,_qstop,_qduration: 表示查詢過濾窗口的起始,結(jié)束以及持續(xù)時(shí)間(從 2.6.0.0 版本開始支持) _wstart,_wstop,_wduration: 窗口切分聚合查詢(例如 interval/session window/state window)中表示每個(gè)切分窗口的起始,結(jié)束以及持續(xù)時(shí)間(從 2.6.0.0 版本開始支持)
小技巧
獲取一個(gè)超級(jí)表所有的子表名及相關(guān)的標(biāo)簽信息:
SELECT TBNAME, location FROM meters;
統(tǒng)計(jì)超級(jí)表下轄子表數(shù)量:
SELECT COUNT(TBNAME) FROM meters;
以上兩個(gè)查詢均只支持在WHERE條件子句中添加針對(duì)標(biāo)簽(TAGS)的過濾條件。例如:
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)
- 可以使用 * 返回所有列,或指定列名??梢詫?duì)數(shù)字列進(jìn)行四則運(yùn)算,可以給輸出的列取列名。
- 暫不支持含列名的四則運(yùn)算表達(dá)式用于條件過濾算子(例如,不支持
where a*2>6;,但可以寫where a>6/2;)。 - 暫不支持含列名的四則運(yùn)算表達(dá)式作為 SQL 函數(shù)的應(yīng)用對(duì)象(例如,不支持
select min(2*a) from t;,但可以寫select 2*min(a) from t;)。
- 暫不支持含列名的四則運(yùn)算表達(dá)式用于條件過濾算子(例如,不支持
- WHERE 語句可以使用各種邏輯判斷來過濾數(shù)字值,或使用通配符來過濾字符串。
- 輸出結(jié)果缺省按首列時(shí)間戳升序排序,但可以指定按降序排序( _c0 指首列時(shí)間戳)。使用 ORDER BY 對(duì)其他字段進(jìn)行排序,排序結(jié)果順序不確定。
- 參數(shù) LIMIT 控制輸出條數(shù),OFFSET 指定從第幾條開始輸出。LIMIT/OFFSET 對(duì)結(jié)果集的執(zhí)行順序在 ORDER BY 之后。且
LIMIT 5 OFFSET 2可以簡(jiǎn)寫為LIMIT 2, 5。- 在有 GROUP BY 子句的情況下,LIMIT 參數(shù)控制的是每個(gè)分組中至多允許輸出的條數(shù)。
- 參數(shù) SLIMIT 控制由 GROUP BY 指令劃分的分組中,至多允許輸出幾個(gè)分組的數(shù)據(jù)。且
SLIMIT 5 SOFFSET 2可以簡(jiǎn)寫為SLIMIT 2, 5。 - 通過 “>>” 輸出結(jié)果可以導(dǎo)出到指定文件。
支持的條件過濾操作
| 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 |
-
<> 算子也可以寫為 != ,請(qǐng)注意,這個(gè)算子不能用于數(shù)據(jù)表第一列的 timestamp 字段。
-
like 算子使用通配符字符串進(jìn)行匹配檢查。
- 在通配符字符串中:'%'(百分號(hào))匹配 0 到任意個(gè)字符;'_'(下劃線)匹配單個(gè)任意ASCII字符。
- 如果希望匹配字符串中原本就帶有的 _(下劃線)字符,那么可以在通配符字符串中寫作
\_,也即加一個(gè)反斜線來進(jìn)行轉(zhuǎn)義。(從 2.2.0.0 版本開始支持) - 通配符字符串最長(zhǎng)不能超過 20 字節(jié)。(從 2.1.6.1 版本開始,通配符字符串的長(zhǎng)度放寬到了 100 字節(jié),并可以通過 taos.cfg 中的 maxWildCardsLength 參數(shù)來配置這一長(zhǎng)度限制。但不建議使用太長(zhǎng)的通配符字符串,將有可能嚴(yán)重影響 LIKE 操作的執(zhí)行性能。)
-
同時(shí)進(jìn)行多個(gè)字段的范圍過濾,需要使用關(guān)鍵詞 AND 來連接不同的查詢條件,暫不支持 OR 連接的不同列之間的查詢過濾條件。
- 從 2.3.0.0 版本開始,已支持完整的同一列和/或不同列間的 AND/OR 運(yùn)算。
-
針對(duì)單一字段的過濾,如果是時(shí)間過濾條件,則一條語句中只支持設(shè)定一個(gè);但針對(duì)其他的(普通)列或標(biāo)簽列,則可以使用
OR關(guān)鍵字進(jìn)行組合條件的查詢過濾。例如:((value > 20 AND value < 30) OR (value < 12))。- 從 2.3.0.0 版本開始,允許使用多個(gè)時(shí)間過濾條件,但首列時(shí)間戳的過濾運(yùn)算結(jié)果只能包含一個(gè)區(qū)間。
-
從 2.0.17.0 版本開始,條件過濾開始支持 BETWEEN AND 語法,例如
WHERE col2 BETWEEN 1.5 AND 3.25表示查詢條件為“1.5 ≤ col2 ≤ 3.25”。 -
從 2.1.4.0 版本開始,條件過濾開始支持 IN 算子,例如
WHERE city IN ('Beijing', 'Shanghai')。說明:BOOL 類型寫作{true, false}或{0, 1}均可,但不能寫作 0、1 之外的整數(shù);FLOAT 和 DOUBLE 類型會(huì)受到浮點(diǎn)數(shù)精度影響,集合內(nèi)的值在精度范圍內(nèi)認(rèn)為和數(shù)據(jù)行的值完全相等才能匹配成功;TIMESTAMP 類型支持非主鍵的列。 -
從2.3.0.0版本開始,條件過濾開始支持正則表達(dá)式,關(guān)鍵字 match/nmatch 不區(qū)分大小寫。
語法
WHERE (column|tag|tbname) match/MATCH/nmatch/NMATCH regex
match/MATCH 匹配正則表達(dá)式
nmatch/NMATCH 不匹配正則表達(dá)式
正則表達(dá)式規(guī)范
確保使用的正則表達(dá)式符合POSIX的規(guī)范,具體規(guī)范內(nèi)容可參見 Regular Expressions,目前 TDengine 使用的是 glibc 里面的 regex 實(shí)現(xiàn),使用正則表達(dá)式進(jìn)行 match 時(shí)是區(qū)分大小寫的
正則表達(dá)使用示例
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)使用限制
只能針對(duì)表名 (tbname) 以及binary類型的普通列或標(biāo)簽進(jìn)行正則表達(dá)式過濾。
正則匹配字符串長(zhǎng)度不能超過 128 字節(jié)??梢酝ㄟ^參數(shù) maxRegexStringLen 設(shè)置和調(diào)整最大允許的正則匹配字符串,該參數(shù)是客戶端配置參數(shù),需要重啟客戶端才能生效。
JOIN 子句
從 2.2.0.0 版本開始,TDengine 對(duì)內(nèi)連接(INNER JOIN)中的自然連接(Natural join)操作實(shí)現(xiàn)了完整的支持。也即支持“普通表與普通表之間”、“超級(jí)表與超級(jí)表之間”、“子查詢與子查詢之間”進(jìn)行自然連接。自然連接與內(nèi)連接的主要區(qū)別是,自然連接要求參與連接的字段在不同的表/超級(jí)表中必須是同名字段。也即,TDengine 在連接關(guān)系的表達(dá)中,要求必須使用同名數(shù)據(jù)列/標(biāo)簽列的相等關(guān)系。
在普通表與普通表之間的 JOIN 操作中,只能使用主鍵時(shí)間戳之間的相等關(guān)系。例如:
SELECT *
FROM temp_tb_1 t1, pressure_tb_1 t2
WHERE t1.ts = t2.ts
在超級(jí)表與超級(jí)表之間的 JOIN 操作中,除了主鍵時(shí)間戳一致的條件外,還要求引入能實(shí)現(xiàn)一一對(duì)應(yīng)的標(biāo)簽列的相等關(guān)系。例如:
SELECT *
FROM temp_stable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;
類似地,也可以對(duì)多個(gè)子查詢的查詢結(jié)果進(jìn)行 JOIN 操作。
注意,JOIN 操作存在如下限制要求:
- 參與一條語句中 JOIN 操作的表/超級(jí)表最多可以有 10 個(gè)。
- 在包含 JOIN 操作的查詢語句中不支持 FILL。
- 暫不支持參與 JOIN 操作的表之間聚合后的四則運(yùn)算。
- 不支持只對(duì)其中一部分表做 GROUP BY。
- JOIN 查詢的不同表的過濾條件之間不能為 OR。
- JOIN 查詢要求連接條件不能是普通列,只能針對(duì)標(biāo)簽和主時(shí)間字段列(第一列)。
嵌套查詢
“嵌套查詢”又稱為“子查詢”,也即在一條 SQL 語句中,“內(nèi)層查詢”的計(jì)算結(jié)果可以作為“外層查詢”的計(jì)算對(duì)象來使用。
從 2.2.0.0 版本開始,TDengine 的查詢引擎開始支持在 FROM 子句中使用非關(guān)聯(lián)子查詢(“非關(guān)聯(lián)”的意思是,子查詢不會(huì)用到父查詢中的參數(shù))。也即在普通 SELECT 語句的 tb_name_list 位置,用一個(gè)獨(dú)立的 SELECT 語句來代替(這一 SELECT 語句被包含在英文圓括號(hào)內(nèi)),于是完整的嵌套查詢 SQL 語句形如:
SELECT ... FROM (SELECT ... FROM ...) ...;
說明:
- 目前僅支持一層嵌套,也即不能在子查詢中再嵌入子查詢。
- 內(nèi)層查詢的返回結(jié)果將作為“虛擬表”供外層查詢使用,此虛擬表可以使用 AS 語法做重命名,以便于外層查詢中方便引用。
- 目前不能在“連續(xù)查詢”功能中使用子查詢。
- 在內(nèi)層和外層查詢中,都支持普通的表間/超級(jí)表間 JOIN。內(nèi)層查詢的計(jì)算結(jié)果也可以再參與數(shù)據(jù)子表的 JOIN 操作。
- 目前內(nèi)層查詢、外層查詢均不支持 UNION 操作。
- 內(nèi)層查詢支持的功能特性與非嵌套的查詢語句能力是一致的。
- 內(nèi)層查詢的 ORDER BY 子句一般沒有意義,建議避免這樣的寫法以免無謂的資源消耗。
- 與非嵌套的查詢語句相比,外層查詢所能支持的功能特性存在如下限制:
- 計(jì)算函數(shù)部分:
- 如果內(nèi)層查詢的結(jié)果數(shù)據(jù)未提供時(shí)間戳,那么計(jì)算過程依賴時(shí)間戳的函數(shù)在外層會(huì)無法正常工作。例如:TOP, BOTTOM, FIRST, LAST, DIFF。
- 計(jì)算過程需要兩遍掃描的函數(shù),在外層查詢中無法正常工作。例如:此類函數(shù)包括:STDDEV, PERCENTILE。
- 外層查詢中不支持 IN 算子,但在內(nèi)層中可以使用。
- 外層查詢不支持 GROUP BY。
- 計(jì)算函數(shù)部分:
UNION ALL 子句
SELECT ...
UNION ALL SELECT ...
[UNION ALL SELECT ...]
TDengine 支持 UNION ALL 操作符。也就是說,如果多個(gè) SELECT 子句返回結(jié)果集的結(jié)構(gòu)完全相同(列名、列類型、列數(shù)、順序),那么可以通過 UNION ALL 把這些結(jié)果集合并到一起。目前只支持 UNION ALL 模式,也即在結(jié)果集的合并過程中是不去重的。在同一個(gè)sql語句中,UNION ALL 最多支持100個(gè)。
SQL 示例
-
對(duì)于下面的例子,表tb1用以下語句創(chuàng)建:
CREATE TABLE tb1 (ts TIMESTAMP, col1 INT, col2 FLOAT, col3 BINARY(50)); -
查詢tb1剛過去的一個(gè)小時(shí)的所有記錄:
SELECT * FROM tb1 WHERE ts >= NOW - 1h; -
查詢表tb1從2018-06-01 08:00:00.000 到2018-06-02 08:00:00.000時(shí)間范圍,并且col3的字符串是'nny'結(jié)尾的記錄,結(jié)果按照時(shí)間戳降序:
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與col2的和,并取名complex, 時(shí)間大于2018-06-01 08:00:00.000, col2大于1.2,結(jié)果輸出僅僅10條記錄,從第5條開始:
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,并且將結(jié)果輸出到文件
/home/testoutpu.csv:SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv;
SQL 函數(shù)
聚合函數(shù)
TDengine支持針對(duì)數(shù)據(jù)的聚合查詢。提供支持的聚合和選擇函數(shù)如下:
-
COUNT
SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];功能說明:統(tǒng)計(jì)表/超級(jí)表中記錄行數(shù)或某列的非空值個(gè)數(shù)。
返回結(jié)果數(shù)據(jù)類型:長(zhǎng)整型INT64。
應(yīng)用字段:應(yīng)用全部字段。
適用于:表、超級(jí)表。
說明:
1)可以使用星號(hào)(*)來替代具體的字段,使用星號(hào)(*)返回全部記錄數(shù)量。
2)針對(duì)同一表的(不包含NULL值)字段查詢結(jié)果均相同。
3)如果統(tǒng)計(jì)對(duì)象是具體的列,則返回該列中非NULL值的記錄數(shù)量。
示例:
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];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的平均值。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool字段。
適用于:表、超級(jí)表。
示例:
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;功能說明:時(shí)間加權(quán)平均函數(shù)。統(tǒng)計(jì)表中某列在一段時(shí)間內(nèi)的時(shí)間加權(quán)平均。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、(超級(jí)表)。
說明:從 2.1.3.0 版本開始,TWA 函數(shù)可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。
-
IRATE
SELECT IRATE(field_name) FROM tb_name WHERE clause;功能說明:計(jì)算瞬時(shí)增長(zhǎng)率。使用時(shí)間區(qū)間中最后兩個(gè)樣本數(shù)據(jù)來計(jì)算瞬時(shí)增長(zhǎng)速率;如果這兩個(gè)值呈遞減關(guān)系,那么只取最后一個(gè)數(shù)用于計(jì)算,而不是使用二者差值。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、(超級(jí)表)。
說明:(從 2.1.3.0 版本開始新增此函數(shù))IRATE 可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。
-
SUM
SELECT SUM(field_name) FROM tb_name [WHERE clause];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的和。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double和長(zhǎng)整型INT64。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
示例:
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];功能說明:統(tǒng)計(jì)表中某列的均方差。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表。(從 2.0.15.1 版本開始,本函數(shù)也支持超級(jí)表)
示例:
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];功能說明:統(tǒng)計(jì)表中某列的值是主鍵(時(shí)間戳)的擬合直線方程。start_val是自變量初始值,step_val是自變量的步長(zhǎng)值。
返回結(jié)果數(shù)據(jù)類型:字符串表達(dá)式(斜率, 截距)。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
說明:自變量是時(shí)間戳,因變量是該列的值。
適用于:表。
示例:
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];功能說明:返回出現(xiàn)頻率最高的值,若存在多個(gè)頻率相同的最高值,輸出空。不能匹配標(biāo)簽、時(shí)間戳輸出。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:適合于除時(shí)間主列外的任何類型字段。
支持的版本:2.6.0.x 之后的版本。
說明:由于返回?cái)?shù)據(jù)量未知,考慮到內(nèi)存因素,為了函數(shù)可以正常返回結(jié)果,建議不重復(fù)的數(shù)據(jù)量在10萬級(jí)別,否則會(huì)報(bào)錯(cuò)。
示例:
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算法,返回某列的基數(shù)。該算法在數(shù)據(jù)量很大的情況下,可以明顯降低內(nèi)存的占用,但是求出來的基數(shù)是個(gè)估算值,標(biāo)準(zhǔn)誤差(標(biāo)準(zhǔn)誤差是多次實(shí)驗(yàn),每次的平均數(shù)的標(biāo)準(zhǔn)差,不是與真實(shí)結(jié)果的誤差)為0.81%。
- 在數(shù)據(jù)量較少的時(shí)候該算法不是很準(zhǔn)確,可以使用select count(data) from (select unique(col) as data from table) 的方法。
返回結(jié)果類型:整形。
適用數(shù)據(jù)類型:適合于任何類型字段。
支持的版本:2.6.0.x 之后的版本。
示例:
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)
選擇函數(shù)
在使用所有的選擇函數(shù)的時(shí)候,可以同時(shí)指定輸出 ts 列或標(biāo)簽列(包括 tbname),這樣就可以方便地知道被選出的值是源于哪個(gè)數(shù)據(jù)行的。
-
MIN
SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最小值。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
示例:
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];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最大值。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
示例:
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];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最先寫入的非NULL值。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:所有字段。
適用于:表、超級(jí)表。
說明:
1)如果要返回各個(gè)列的首個(gè)(時(shí)間戳最?。┓荖ULL值,可以使用FIRST(*);
2)如果結(jié)果集中的某列全部為NULL值,則該列的返回結(jié)果也是NULL;
3)如果結(jié)果集中所有列全部為NULL值,則不返回結(jié)果。
示例:
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];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最后寫入的非 NULL 值。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:所有字段。
適用于:表、超級(jí)表。
說明:
1)如果要返回各個(gè)列的最后(時(shí)間戳最大)一個(gè)非 NULL 值,可以使用 LAST(*);
2)如果結(jié)果集中的某列全部為 NULL 值,則該列的返回結(jié)果也是 NULL;如果結(jié)果集中所有列全部為 NULL 值,則不返回結(jié)果。
3)在用于超級(jí)表時(shí),時(shí)間戳完全一樣且同為最大的數(shù)據(jù)行可能有多個(gè),那么會(huì)從中隨機(jī)返回一條,而并不保證多次運(yùn)行所挑選的數(shù)據(jù)行必然一致。
示例:
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];功能說明: 統(tǒng)計(jì)表/超級(jí)表中某列的值最大 k 個(gè)非 NULL 值。如果多條數(shù)據(jù)取值一樣,全部取用又會(huì)超出 k 條限制時(shí),系統(tǒng)會(huì)從相同值中隨機(jī)選取符合要求的數(shù)量返回。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
說明:
1)k值取值范圍1≤k≤100;
2)系統(tǒng)同時(shí)返回該記錄關(guān)聯(lián)的時(shí)間戳列;
3)限制:TOP函數(shù)不支持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];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最小 k 個(gè)非 NULL 值。如果多條數(shù)據(jù)取值一樣,全部取用又會(huì)超出 k 條限制時(shí),系統(tǒng)會(huì)從相同值中隨機(jī)選取符合要求的數(shù)量返回。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
說明:
1)k值取值范圍1≤k≤100;
2)系統(tǒng)同時(shí)返回該記錄關(guān)聯(lián)的時(shí)間戳列;
3)限制:BOTTOM函數(shù)不支持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];功能說明:統(tǒng)計(jì)表中某列的值百分比分位數(shù)。
返回結(jié)果數(shù)據(jù)類型: 雙精度浮點(diǎn)數(shù)Double。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表。
說明:P值取值范圍0≤P≤100,為0的時(shí)候等同于MIN,為100的時(shí)候等同于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]功能說明:統(tǒng)計(jì)表/超級(jí)表中指定列的值百分比分位數(shù),與PERCENTILE函數(shù)相似,但是返回近似結(jié)果。
返回結(jié)果數(shù)據(jù)類型: 雙精度浮點(diǎn)數(shù)Double。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
說明:
P值有效取值范圍0≤P≤100,為 0 的時(shí)候等同于 MIN,為 100 的時(shí)候等同于MAX;
algo_type的有效輸入:default 和 t-digest。 用于指定計(jì)算近似分位數(shù)的算法??刹惶峁┑谌齻€(gè)參數(shù)的輸入,此時(shí)將使用 default 的算法進(jìn)行計(jì)算,即 apercentile(column_name, 50, "default") 與 apercentile(column_name, 50) 等價(jià)。當(dāng)使用“t-digest”參數(shù)的時(shí)候,將使用t-digest方式采樣計(jì)算近似分位數(shù)。但該參數(shù)指定計(jì)算算法的功能從2.2.0.x版本開始支持,2.2.0.0之前的版本不支持指定使用算法的功能。嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
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 };功能說明:返回表/超級(jí)表的最后一條記錄。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:所有字段。
適用于:表、超級(jí)表。
限制:LAST_ROW() 不能與 INTERVAL 一起使用。
說明:在用于超級(jí)表時(shí),時(shí)間戳完全一樣且同為最大的數(shù)據(jù)行可能有多個(gè),那么會(huì)從中隨機(jī)返回一條,而并不保證多次運(yùn)行所挑選的數(shù)據(jù)行必然一致。
示例: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})];功能說明:返回表/超級(jí)表的指定時(shí)間截面指定列的記錄值(插值)。
返回結(jié)果數(shù)據(jù)類型:同字段類型。
應(yīng)用字段:數(shù)值型字段。
適用于:表、超級(jí)表、嵌套查詢。
說明: 1)INTERP用于在指定時(shí)間斷面獲取指定列的記錄值,如果該時(shí)間斷面不存在符合條件的行數(shù)據(jù),那么會(huì)根據(jù) FILL 參數(shù)的設(shè)定進(jìn)行插值。
2)INTERP的輸入數(shù)據(jù)為指定列的數(shù)據(jù),可以通過條件語句(where子句)來對(duì)原始列數(shù)據(jù)進(jìn)行過濾,如果沒有指定過濾條件則輸入為全部數(shù)據(jù)。
3)INTERP的輸出時(shí)間范圍根據(jù)RANGE(timestamp1,timestamp2)字段來指定,需滿足timestamp1<=timestamp2。其中timestamp1(必選值)為輸出時(shí)間范圍的起始值,即如果timestamp1時(shí)刻符合插值條件則timestamp1為輸出的第一條記錄,timestamp2(必選值)為輸出時(shí)間范圍的結(jié)束值,即輸出的最后一條記錄的timestamp不能大于timestamp2。如果沒有指定RANGE,那么滿足過濾條件的輸入數(shù)據(jù)中第一條記錄的timestamp即為timestamp1,最后一條記錄的timestamp即為timestamp2,同樣也滿足timestamp1 <= timestamp2。
4)INTERP根據(jù)EVERY字段來確定輸出時(shí)間范圍內(nèi)的結(jié)果條數(shù),即從timestamp1開始每隔固定長(zhǎng)度的時(shí)間(EVERY值)進(jìn)行插值。如果沒有指定EVERY,則默認(rèn)窗口大小為無窮大,即從timestamp1開始只有一個(gè)窗口。
5)INTERP根據(jù)FILL字段來決定在每個(gè)符合輸出條件的時(shí)刻如何進(jìn)行插值,如果沒有FILL字段則默認(rèn)不插值,即輸出為原始記錄值或不輸出(原始記錄不存在)。
6)INTERP只能在一個(gè)時(shí)間序列內(nèi)進(jìn)行插值,因此當(dāng)作用于超級(jí)表時(shí)必須跟group by tbname一起使用,當(dāng)作用嵌套查詢外層時(shí)內(nèi)層子查詢不能含GROUP BY信息。
7)INTERP的插值結(jié)果不受ORDER BY timestamp的影響,ORDER BY timestamp只影響輸出結(jié)果的排序。
SQL示例(基于文檔中廣泛使用的電表 schema )
1) 單點(diǎn)線性插值
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秒鐘進(jìn)行取值(不插值)
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間每隔5秒鐘進(jìn)行線性插值
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);4.在所有時(shí)間范圍內(nèi)每隔5秒鐘進(jìn)行向后插值
taos> SELECT INTERP(current) FROM t1 EVERY(5s) FILL(NEXT);5.根據(jù)2017-07-14 17:00:00到2017-07-14 20:00:00間的數(shù)據(jù)進(jìn)行從2017-07-14 18:00:00到2017-07-14 19:00:00間每隔5秒鐘進(jìn)行線性插值
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})];功能說明:返回表/超級(jí)表的指定時(shí)間截面、指定字段的記錄。
返回結(jié)果數(shù)據(jù)類型:同字段類型。
應(yīng)用字段:數(shù)值型字段。
適用于:表、超級(jí)表。
說明:(從 2.0.15.0 版本開始新增此函數(shù))
1)INTERP 必須指定時(shí)間斷面,如果該時(shí)間斷面不存在直接對(duì)應(yīng)的數(shù)據(jù),那么會(huì)根據(jù) FILL 參數(shù)的設(shè)定進(jìn)行插值。此外,條件語句里面可附帶篩選條件,例如標(biāo)簽、tbname。
2)INTERP 查詢要求查詢的時(shí)間區(qū)間必須位于數(shù)據(jù)集合(表)的所有記錄的時(shí)間范圍之內(nèi)。如果給定的時(shí)間戳位于時(shí)間范圍之外,即使有插值指令,仍然不返回結(jié)果。
3)單個(gè) INTERP 函數(shù)查詢只能夠針對(duì)一個(gè)時(shí)間點(diǎn)進(jìn)行查詢,如果需要返回等時(shí)間間隔的斷面數(shù)據(jù),可以通過 INTERP 配合 EVERY 的方式來進(jìn)行查詢處理(而不是使用 INTERVAL),其含義是每隔固定長(zhǎng)度的時(shí)間進(jìn)行插值。
示例: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)如果給定的時(shí)間戳無對(duì)應(yīng)的數(shù)據(jù),在不指定插值生成策略的情況下,不會(huì)返回結(jié)果,如果指定了插值策略,會(huì)根據(jù)插值策略返回結(jié)果。
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)如下所示代碼表示在時(shí)間區(qū)間
['2017-7-14 18:40:00', '2017-7-14 18:40:00.014']中每隔 5 毫秒 進(jìn)行一次斷面計(jì)算。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];功能說明:返回跳過最后 offset_value個(gè),然后取連續(xù) k 個(gè)記錄,不忽略 NULL 值。offset_val 可以不輸入。此時(shí)返回最后的 k 個(gè)記錄。當(dāng)有 offset_val 輸入的情況下,該函數(shù)功能等效于order by ts desc LIMIT k OFFSET offset_val。
參數(shù)范圍:k: [1,100] offset_val: [0,100]。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:適合于除時(shí)間主列外的任何類型字段。
適用于:表、超級(jí)表。
支持版本:2.6.0.x 之后的版本。
示例:
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];功能說明:返回該列的數(shù)值首次出現(xiàn)的值。該函數(shù)功能與 distinct 相似,但是可以匹配標(biāo)簽和時(shí)間戳信息??梢葬槍?duì)除時(shí)間列以外的字段進(jìn)行查詢,可以匹配標(biāo)簽和時(shí)間戳,其中的標(biāo)簽和時(shí)間戳是第一次出現(xiàn)時(shí)刻的標(biāo)簽和時(shí)間戳。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。
應(yīng)用字段:適合于除時(shí)間類型以外的字段。
適用于:表、超級(jí)表。
支持版本:2.6.0.x 之后的版本。
說明:
- 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。不能和窗口操作一起使用,例如 interval/state_window/session_window 。
- 由于返回?cái)?shù)據(jù)量未知,考慮到內(nèi)存因素,為了函數(shù)可以正常返回結(jié)果,建議不重復(fù)的數(shù)據(jù)量在10萬級(jí)別,否則會(huì)報(bào)錯(cuò)。
示例:
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)
計(jì)算函數(shù)
-
DIFF
SELECT {DIFF(field_name, ignore_negative) | DIFF(field_name)} FROM tb_name [WHERE clause];功能說明:統(tǒng)計(jì)表中某列的值與前一行對(duì)應(yīng)值的差。 ignore_negative 取值為 0|1 , 可以不填,默認(rèn)值為 0. 不忽略負(fù)值。ignore_negative為1時(shí)表示忽略負(fù)數(shù)。
返回結(jié)果數(shù)據(jù)類型:同應(yīng)用字段。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、(超級(jí)表)。
說明:輸出結(jié)果行數(shù)是范圍內(nèi)總行數(shù)減一,第一行沒有結(jié)果輸出。從 2.1.3.0 版本開始,DIFF 函數(shù)可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。從2.6.0開始,DIFF函數(shù)支持ignore_negative參數(shù)
示例:
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];功能說明:統(tǒng)計(jì)表中某列數(shù)值的單位變化率。其中單位時(shí)間區(qū)間的長(zhǎng)度可以通過 time_interval 參數(shù)指定,最小可以是 1 秒(1s);ignore_negative 參數(shù)的值可以是 0 或 1,為 1 時(shí)表示忽略負(fù)值。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)。
應(yīng)用字段:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段。
適用于:表、(超級(jí)表)。
說明:(從 2.1.3.0 版本開始新增此函數(shù))輸出結(jié)果行數(shù)是范圍內(nèi)總行數(shù)減一,第一行沒有結(jié)果輸出。DERIVATIVE 函數(shù)可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 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];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的最大值和最小值之差。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)。
應(yīng)用字段:不能應(yīng)用在binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
說明:可用于TIMESTAMP字段,此時(shí)表示記錄的時(shí)間覆蓋范圍。
示例:
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];功能說明:獲得指定列的向上取整數(shù)的結(jié)果。
返回結(jié)果類型:與指定列的原始數(shù)據(jù)類型一致。例如,如果指定列的原始數(shù)據(jù)類型為 Float,那么返回的數(shù)據(jù)類型也為 Float;如果指定列的原始數(shù)據(jù)類型為 Double,那么返回的數(shù)據(jù)類型也為 Double。
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列,無論 tag 列的類型是什么類型。
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
說明: 支持 +、-、*、/ 運(yùn)算,如 ceil(col1) + ceil(col2)。 只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
-
FLOOR
SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:獲得指定列的向下取整數(shù)的結(jié)果。
其他使用說明參見CEIL函數(shù)描述。 -
ROUND
SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];功能說明:獲得指定列的四舍五入的結(jié)果。
其他使用說明參見CEIL函數(shù)描述。 -
CSUM
SELECT CSUM(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:累加和(Cumulative sum),輸出行與輸入行數(shù)相同。
返回結(jié)果類型: 輸入列如果是整數(shù)類型返回值為長(zhǎng)整型 (int64_t),浮點(diǎn)數(shù)返回值為雙精度浮點(diǎn)數(shù)(Double)。無符號(hào)整數(shù)類型返回值為無符號(hào)長(zhǎng)整型(uint64_t)。 返回結(jié)果中同時(shí)帶有每行記錄對(duì)應(yīng)的時(shí)間戳。
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在標(biāo)簽之上。
嵌套子查詢支持: 適用于內(nèi)層查詢和外層查詢。
補(bǔ)充說明: 不支持 +、-、*、/ 運(yùn)算,如 csum(col1) + csum(col2)。只能與聚合(Aggregation)函數(shù)一起使用。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 使用在超級(jí)表上的時(shí)候,需要搭配 Group by tbname使用,將結(jié)果強(qiáng)制規(guī)約到單個(gè)時(shí)間線。
支持版本: 從2.3.0.x開始支持
-
MAVG
SELECT MAVG(field_name, K) FROM { tb_name | stb_name } [WHERE clause]功能說明: 計(jì)算連續(xù) k 個(gè)值的移動(dòng)平均數(shù)(moving average)。如果輸入行數(shù)小于 k,則無結(jié)果輸出。參數(shù) k 的合法輸入范圍是 1≤ k ≤ 1000。
返回結(jié)果類型: 返回雙精度浮點(diǎn)數(shù)類型。
適用數(shù)據(jù)類型: 不能應(yīng)用在 timestamp、binary、nchar、bool 類型上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在標(biāo)簽之上。
嵌套子查詢支持: 適用于內(nèi)層查詢和外層查詢。
補(bǔ)充說明: 不支持 +、-、*、/ 運(yùn)算,如 mavg(col1, k1) + mavg(col2, k1); 只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用;該函數(shù)可以應(yīng)用在普通表和超級(jí)表上;使用在超級(jí)表上的時(shí)候,需要搭配 Group by tbname使用,將結(jié)果強(qiáng)制規(guī)約到單個(gè)時(shí)間線。
支持版本: 從2.3.0.x開始支持
-
SAMPLE
SELECT SAMPLE(field_name, K) FROM { tb_name | stb_name } [WHERE clause]功能說明: 獲取數(shù)據(jù)的 k 個(gè)采樣值。參數(shù) k 的合法輸入范圍是 1≤ k ≤ 1000。
返回結(jié)果類型: 同原始數(shù)據(jù)類型, 返回結(jié)果中帶有該行記錄的時(shí)間戳。
適用數(shù)據(jù)類型: 在超級(jí)表查詢中使用時(shí),不能應(yīng)用在標(biāo)簽之上。
嵌套子查詢支持: 適用于內(nèi)層查詢和外層查詢。
補(bǔ)充說明: 不能參與表達(dá)式計(jì)算;該函數(shù)可以應(yīng)用在普通表和超級(jí)表上;使用在超級(jí)表上的時(shí)候,需要搭配 Group by tbname 使用,將結(jié)果強(qiáng)制規(guī)約到單個(gè)時(shí)間線。
支持版本: 從2.3.0.x開始支持
-
ASIN
SELECT ASIN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的反正弦結(jié)果
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
ACOS
SELECT ACOS(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的反余弦結(jié)果
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
ATAN
SELECT ATAN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的反正切結(jié)果
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
SIN
SELECT SIN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的正弦結(jié)果
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
COS
SELECT COS(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的余弦結(jié)果
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
TAN
SELECT TAN(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的正切結(jié)果
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
POW
SELECT POW(field_name, power) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的指數(shù)為power的冪
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
LOG
SELECT LOG(field_name, base) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列對(duì)于底數(shù)base的對(duì)數(shù)
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
ABS
SELECT ABS(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的絕對(duì)值
返回結(jié)果類型:如果輸入值為整數(shù),輸出值是UBIGINT類型。如果輸入值是FLOAT/DOUBLE數(shù)據(jù)類型,輸出值是DOUBLE數(shù)據(jù)類型。
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
SQRT
SELECT SQRT(field_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:獲得指定列的平方根
返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列
嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。
使用說明:
只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。
該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。
版本2.6.0.x后支持
-
CAST
SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]功能說明:數(shù)據(jù)類型轉(zhuǎn)換函數(shù),輸入?yún)?shù)expression支持普通列、常量、標(biāo)量函數(shù)及它們之間的四則運(yùn)算,不支持tag列,只適用于select子句中。
返回結(jié)果類型:CAST中指定的類型(type_name)。
適用數(shù)據(jù)類型:輸入?yún)?shù)expression的類型可以是除JSON外目前所有類型字段(BOOL/TINYINT/SMALLINT/INT/BIGINT/FLOAT/DOUBLE/BINARY(M)/TIMESTAMP/NCHAR(M)/TINYINT UNSIGNED/SMALLINT UNSIGNED/INT UNSIGNED/BIGINT UNSIGNED); 輸出目標(biāo)類型只支持BIGINT/BINARY(N)/TIMESTAMP/NCHAR(N)/BIGINT UNSIGNED。
說明:
對(duì)于不能支持的類型轉(zhuǎn)換會(huì)直接報(bào)錯(cuò)。
如果輸入值為NULL則輸出值也為NULL。
對(duì)于類型支持但某些值無法正確轉(zhuǎn)換的情況對(duì)應(yīng)的轉(zhuǎn)換后的值以轉(zhuǎn)換函數(shù)輸出為準(zhǔn)。目前可能遇到的幾種情況: 1)BINARY/NCHAR轉(zhuǎn)BIGINT/BIGINT UNSIGNED時(shí)可能出現(xiàn)的無效字符情況,例如"a"可能轉(zhuǎn)為0。 2)有符號(hào)數(shù)或TIMESTAMP轉(zhuǎn)BIGINT UNSIGNED可能遇到的溢出問題。 3)BIGINT UNSIGNED轉(zhuǎn)BIGINT可能遇到的溢出問題。 4)FLOAT/DOUBLE轉(zhuǎn)BIGINT/BIGINT UNSIGNED可能遇到的溢出問題。 版本2.6.0.x后支持
-
CONCAT
SELECT CONCAT(str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]功能說明:字符串連接函數(shù)。
返回結(jié)果類型:同輸入?yún)?shù)類型,BINARY或者NCHAR。
適用數(shù)據(jù)類型:輸入?yún)?shù)或者全部是BINARY格式的字符串或者列,或者全部是NCHAR格式的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)最小參數(shù)個(gè)數(shù)為2個(gè),最大參數(shù)個(gè)數(shù)為8個(gè)。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
CONCAT_WS
SELECT CONCAT_WS(separator, str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]功能說明:帶分隔符的字符串連接函數(shù)。
返回結(jié)果類型:同輸入?yún)?shù)類型,BINARY或者NCHAR。
適用數(shù)據(jù)類型:輸入?yún)?shù)或者全部是BINARY格式的字符串或者列,或者全部是NCHAR格式的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果separator值為NULL,輸出值為NULL。如果separator值不為NULL,其他輸入為NULL,輸出為空串 該函數(shù)最小參數(shù)個(gè)數(shù)為3個(gè),最大參數(shù)個(gè)數(shù)為9個(gè)。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
LENGTH
SELECT LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:以字節(jié)計(jì)數(shù)的字符串長(zhǎng)度。
返回結(jié)果類型:INT。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
CHAR_LENGTH
SELECT CHAR_LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:以字符計(jì)數(shù)的字符串長(zhǎng)度。
返回結(jié)果類型:INT。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
LOWER
SELECT LOWER(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:將字符串參數(shù)值轉(zhuǎn)換為全小寫字母。
返回結(jié)果類型:同輸入類型。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
UPPER
SELECT UPPER(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:將字符串參數(shù)值轉(zhuǎn)換為全大寫字母。
返回結(jié)果類型:同輸入類型。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
LTRIM
SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:返回清除左邊空格后的字符串。
返回結(jié)果類型:同輸入類型。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
RTRIM
SELECT RTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]功能說明:返回清除右邊空格后的字符串。
返回結(jié)果類型:同輸入類型。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
SUBSTR
SELECT SUBSTR(str,pos[,len]) FROM { tb_name | stb_name } [WHERE clause]功能說明:從源字符串str中的指定位置pos開始取一個(gè)長(zhǎng)度為len的子串并返回。
返回結(jié)果類型:同輸入類型。
適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。
說明:
如果輸入值為NULL,輸出值為NULL。 輸入?yún)?shù)pos可以為正數(shù),也可以為負(fù)數(shù)。如果pos是正數(shù),表示開始位置從字符串開頭正數(shù)計(jì)算。如果pos為負(fù)數(shù),表示開始位置從字符串結(jié)尾倒數(shù)計(jì)算。如果輸入?yún)?shù)len被忽略,返回的子串包含從pos開始的整個(gè)字串。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持
-
四則運(yùn)算
SELECT field_name [+|-|*|/|%][Value|field_name] FROM { tb_name | stb_name } [WHERE clause];功能說明:統(tǒng)計(jì)表/超級(jí)表中某列或多列間的值加、減、乘、除、取余計(jì)算結(jié)果。
返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)。
應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。
適用于:表、超級(jí)表。
說明:
1)支持兩列或多列之間進(jìn)行計(jì)算,可使用括號(hào)控制計(jì)算優(yōu)先級(jí);
2)NULL字段不參與計(jì)算,如果參與計(jì)算的某行中包含NULL,該行的計(jì)算結(jié)果為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];功能說明:返回滿足某個(gè)條件的連續(xù)記錄的個(gè)數(shù),結(jié)果作為新的一列追加在每行后面。條件根據(jù)參數(shù)計(jì)算,如果條件為true則加1,條件為false則重置為-1,如果數(shù)據(jù)為NULL,跳過該條數(shù)據(jù)。
參數(shù)范圍:
- oper : LT (小于)、GT(大于)、LE(小于等于)、GE(大于等于)、NE(不等于)、EQ(等于),不區(qū)分大小寫。
- val : 數(shù)值型
返回結(jié)果類型:整形。
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上。
嵌套子查詢支持:不支持應(yīng)用在子查詢上。
支持的版本:2.6.0.x 之后的版本。
說明:
-
該函數(shù)可以應(yīng)用在普通表上,在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)
-
不能和窗口操作一起使用,例如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];功能說明:返回滿足某個(gè)條件的連續(xù)記錄的時(shí)間長(zhǎng)度,結(jié)果作為新的一列追加在每行后面。條件根據(jù)參數(shù)計(jì)算,如果條件為true則加上兩個(gè)記錄之間的時(shí)間長(zhǎng)度(第一個(gè)滿足條件的記錄時(shí)間長(zhǎng)度記為0),條件為false則重置為-1,如果數(shù)據(jù)為NULL,跳過該條數(shù)據(jù)。
參數(shù)范圍:
- oper : LT (小于)、GT(大于)、LE(小于等于)、GE(大于等于)、NE(不等于)、EQ(等于),不區(qū)分大小寫。
- val : 數(shù)值型
- unit : 時(shí)間長(zhǎng)度的單位,范圍[1s、1m、1h ],不足一個(gè)單位舍去。默認(rèn)為1s。
返回結(jié)果類型:整形。
適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上。
嵌套子查詢支持:不支持應(yīng)用在子查詢上。
支持的版本:2.6.0.x 之后的版本。
說明:
-
該函數(shù)可以應(yīng)用在普通表上,在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)
-
不能和窗口操作一起使用,例如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];功能說明:統(tǒng)計(jì)數(shù)據(jù)按照用戶指定區(qū)間的分布。
返回結(jié)果數(shù)據(jù)類型:如歸一化參數(shù) normalized 設(shè)置為 1,返回結(jié)果為雙精度浮點(diǎn)類型 DOUBLE,否則為長(zhǎng)整形 INT64。
應(yīng)用字段:數(shù)值型字段。
適用于:表、(超級(jí)表)。
說明: 1)從 2.6.0.0 版本開始支持此函數(shù)。 2)bin_type 用戶指定的分桶類型, 有效輸入類型為"user_input“, ”linear_bin", "log_bin"。 3)bin_description 描述如何生成分桶區(qū)間,針對(duì)三種桶類型,分別為以下描述格式(均為 JSON 格式字符串):
-
"user_input": "[1, 3, 5, 7]" 用戶指定 bin 的具體數(shù)值。
-
"linear_bin": "{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}" "start" 表示數(shù)據(jù)起始點(diǎn),"width" 表示每次 bin 偏移量, "count" 為 bin 的總數(shù),"infinity" 表示是否添加(-inf, inf)作為區(qū)間起點(diǎn)跟終點(diǎn), 生成區(qū)間為[-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" 表示數(shù)據(jù)起始點(diǎn),"factor" 表示按指數(shù)遞增的因子,"count" 為 bin 的總數(shù),"infinity" 表示是否添加(-inf, inf)作為區(qū)間起點(diǎn)跟終點(diǎn), 生成區(qū)間為[-inf, 1.0, 2.0, 4.0, 8.0, 16.0, +inf]。 4)normalized 是否將返回結(jié)果歸一化到 0~1 之間 。有效輸入為 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} | -
時(shí)間函數(shù)
從 2.6.0.0 版本開始,TDengine查詢引擎支持以下時(shí)間相關(guān)函數(shù):
-
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(), ...);功能說明:返回客戶端當(dāng)前系統(tǒng)時(shí)間。
返回結(jié)果數(shù)據(jù)類型:TIMESTAMP 時(shí)間戳類型。
應(yīng)用字段:在 WHERE 或 INSERT 語句中使用時(shí)只能作用于TIMESTAMP類型的字段。
適用于:表、超級(jí)表。
說明: 1)支持時(shí)間加減操作,如NOW() + 1s, 支持的時(shí)間單位如下: b(納秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小時(shí))、d(天)、w(周)。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。
示例:
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(), ...);功能說明:返回客戶端當(dāng)日零時(shí)的系統(tǒng)時(shí)間。
返回結(jié)果數(shù)據(jù)類型:TIMESTAMP 時(shí)間戳類型。
應(yīng)用字段:在 WHERE 或 INSERT 語句中使用時(shí)只能作用于 TIMESTAMP 類型的字段。
適用于:表、超級(jí)表。
說明: 1)支持時(shí)間加減操作,如TODAY() + 1s, 支持的時(shí)間單位如下: b(納秒),u(微秒),a(毫秒),s(秒),m(分),h(小時(shí)),d(天),w(周)。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。
示例:
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];功能說明:返回客戶端當(dāng)前時(shí)區(qū)信息。
返回結(jié)果數(shù)據(jù)類型:BINARY 類型。
應(yīng)用字段:無
適用于:表、超級(jí)表。
示例:
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];功能說明:將 UNIX 時(shí)間戳轉(zhuǎn)換成為 ISO8601 標(biāo)準(zhǔn)的日期時(shí)間格式,并附加客戶端時(shí)區(qū)信息。
返回結(jié)果數(shù)據(jù)類型:BINARY 類型。
應(yīng)用字段:UNIX 時(shí)間戳常量或是 TIMESTAMP 類型的列
適用于:表、超級(jí)表。
說明:如果輸入是 UNIX 時(shí)間戳常量,返回格式精度由時(shí)間戳的位數(shù)決定,如果輸入是 TIMSTAMP 類型的列,返回格式的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。
示例:
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];功能說明:將日期時(shí)間格式的字符串轉(zhuǎn)換成為 UNIX 時(shí)間戳。
返回結(jié)果數(shù)據(jù)類型:長(zhǎng)整型INT64。
應(yīng)用字段:字符串常量或是 BINARY/NCHAR 類型的列。
適用于:表、超級(jí)表。
說明: 1)輸入的日期時(shí)間字符串須符合 ISO8601/RFC3339 標(biāo)準(zhǔn),無法轉(zhuǎn)換的字符串格式將返回0。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。
示例:
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];功能說明:將時(shí)間戳按照指定時(shí)間單位 time_unit 進(jìn)行截?cái)唷?/p>
返回結(jié)果數(shù)據(jù)類型:TIMESTAMP 時(shí)間戳類型。
應(yīng)用字段:UNIX 時(shí)間戳,日期時(shí)間格式的字符串,或者 TIMESTAMP 類型的列。
適用于:表、超級(jí)表。
說明: 1)支持的時(shí)間單位 time_unit 如下: 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小時(shí)),1d(天)。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。
示例:
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];功能說明:計(jì)算兩個(gè)時(shí)間戳之間的差值,并近似到時(shí)間單位 time_unit 指定的精度。
返回結(jié)果數(shù)據(jù)類型:長(zhǎng)整型INT64。
應(yīng)用字段:UNIX 時(shí)間戳,日期時(shí)間格式的字符串,或者 TIMESTAMP 類型的列。
適用于:表、超級(jí)表。
說明: 1)支持的時(shí)間單位 time_unit 如下: 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小時(shí)),1d(天)。 2)如果時(shí)間單位 time_unit 未指定, 返回的時(shí)間差值精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。
示例:
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 支持按時(shí)間段窗口切分方式進(jìn)行聚合結(jié)果查詢,比如溫度傳感器每秒采集一次數(shù)據(jù),但需查詢每隔 10 分鐘的溫度平均值。這種場(chǎng)景下可以使用窗口子句來獲得需要的查詢結(jié)果。 窗口子句用于針對(duì)查詢的數(shù)據(jù)集合進(jìn)行按照窗口切分成為查詢子集并進(jìn)行聚合,窗口包含時(shí)間窗口(time window)、狀態(tài)窗口(status window)、會(huì)話窗口(session window)三種窗口。其中時(shí)間窗口又可劃分為滑動(dòng)時(shí)間窗口和翻轉(zhuǎn)時(shí)間窗口。
時(shí)間窗口
INTERVAL子句用于產(chǎn)生相等時(shí)間周期的窗口,SLIDING用以指定窗口向前滑動(dòng)的時(shí)間。每次執(zhí)行的查詢是一個(gè)時(shí)間窗口,時(shí)間窗口隨著時(shí)間流動(dòng)向前滑動(dòng)。在定義連續(xù)查詢的時(shí)候需要指定時(shí)間窗口(time window )大小和每次前向增量時(shí)間(forward sliding times)。如圖,[t0s, t0e] ,[t1s , t1e], [t2s, t2e] 是分別是執(zhí)行三次連續(xù)查詢的時(shí)間窗口范圍,窗口的前向滑動(dòng)的時(shí)間范圍sliding time標(biāo)識(shí) 。查詢過濾、聚合等操作按照每個(gè)時(shí)間窗口為獨(dú)立的單位執(zhí)行。當(dāng)SLIDING與INTERVAL相等的時(shí)候,滑動(dòng)窗口即為翻轉(zhuǎn)窗口。

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

使用STATE_WINDOW來確定狀態(tài)窗口劃分的列。例如:
SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status)
會(huì)話窗口
會(huì)話窗口根據(jù)記錄的時(shí)間戳主鍵的值來確定是否屬于同一個(gè)會(huì)話。如下圖所示,如果設(shè)置時(shí)間戳的連續(xù)的間隔小于等于12秒,則以下6條記錄構(gòu)成2個(gè)會(huì)話窗口,分別是:[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因?yàn)?019-04-28 14:22:30與2019-04-28 14:23:10之間的時(shí)間間隔是40秒,超過了連續(xù)時(shí)間間隔(12秒)。

在tol_value時(shí)間間隔范圍內(nèi)的結(jié)果都認(rèn)為歸屬于同一個(gè)窗口,如果連續(xù)的兩條記錄的時(shí)間超過tol_val,則自動(dòng)開啟下一個(gè)窗口。(會(huì)話窗口暫不支持對(duì)超級(jí)表使用)
SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION(ts, tol_val)
這種類型的查詢語法如下:
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]
-
在聚合查詢中,function_list 位置允許使用聚合和選擇函數(shù),并要求每個(gè)函數(shù)僅輸出單個(gè)結(jié)果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行輸出結(jié)果的函數(shù)(例如:DIFF 以及四則運(yùn)算)。
-
此外也 LAST_ROW 查詢也不能與窗口聚合同時(shí)出現(xiàn)。
-
標(biāo)量函數(shù)(如:CEIL/FLOOR 等)也不能使用在窗口聚合查詢中。
-
WHERE 語句可以指定查詢的起止時(shí)間和其他過濾條件。
-
FILL 語句指定某一窗口區(qū)間數(shù)據(jù)缺失的情況下的填充模式。填充模式包括以下幾種:
- 不進(jìn)行填充:NONE(默認(rèn)填充模式)。
- VALUE 填充:固定值填充,此時(shí)需要指定填充的數(shù)值。例如:FILL(VALUE, 1.23)。
- PREV 填充:使用前一個(gè)非 NULL 值填充數(shù)據(jù)。例如:FILL(PREV)。
- NULL 填充:使用 NULL 填充數(shù)據(jù)。例如:FILL(NULL)。
- LINEAR 填充:根據(jù)前后距離最近的非 NULL 值做線性插值填充。例如:FILL(LINEAR)。
- NEXT 填充:使用下一個(gè)非 NULL 值填充數(shù)據(jù)。例如:FILL(NEXT)。
說明:
- 使用 FILL 語句的時(shí)候可能生成大量的填充輸出,務(wù)必指定查詢的時(shí)間區(qū)間。針對(duì)每次查詢,系統(tǒng)可返回不超過 1 千萬條具有插值的結(jié)果。
- 在時(shí)間維度聚合中,返回的結(jié)果中時(shí)間序列嚴(yán)格單調(diào)遞增。
- 如果查詢對(duì)象是超級(jí)表,則聚合函數(shù)會(huì)作用于該超級(jí)表下滿足值過濾條件的所有表的數(shù)據(jù)。如果查詢中沒有使用 GROUP BY 語句,則返回的結(jié)果按照時(shí)間序列嚴(yán)格單調(diào)遞增;如果查詢中使用了 GROUP BY 語句分組,則返回結(jié)果中每個(gè) GROUP 內(nèi)不按照時(shí)間序列嚴(yán)格單調(diào)遞增。
時(shí)間聚合也常被用于連續(xù)查詢場(chǎng)景,可以參考文檔 連續(xù)查詢(Continuous Query)。
示例: 智能電表的建表語句如下:
CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT);
針對(duì)智能電表采集的數(shù)據(jù),以 10 分鐘為一個(gè)階段,計(jì)算過去 24 小時(shí)的電流數(shù)據(jù)的平均值、最大值、電流的中位數(shù)。如果沒有計(jì)算值,用前一個(gè)非 NULL 值填充。使用的查詢語句如下:
SELECT AVG(current), MAX(current), APERCENTILE(current, 50) FROM meters
WHERE ts>=NOW-1d and ts<=now
INTERVAL(10m)
FILL(PREV);
TAOS SQL 邊界限制
- 數(shù)據(jù)庫(kù)名最大長(zhǎng)度為 32。
- 表名最大長(zhǎng)度為 192。每行數(shù)據(jù)最大長(zhǎng)度 48K 個(gè)字符(2.1.7.0 之前的版本為 16K,每個(gè) BINARY/NCHAR 類型的列還會(huì)額外占用 2 個(gè) byte 的存儲(chǔ)位置)
- 列名最大長(zhǎng)度為 64,最多允許 1024 列,最少需要 2 列,第一列必須是時(shí)間戳。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
- 標(biāo)簽名最大長(zhǎng)度為 64,最多允許 128 個(gè),可以 1 個(gè),一個(gè)表中標(biāo)簽值的總長(zhǎng)度不超過 16K 個(gè)字符。
- SQL 語句最大長(zhǎng)度 1048576 個(gè)字符,也可通過客戶端配置參數(shù) maxSQLLength 修改,取值范圍 65480 ~ 1048576。
- SELECT 語句的查詢結(jié)果,最多允許返回 1024 列(語句中的函數(shù)調(diào)用可能也會(huì)占用一些列空間),超限時(shí)需要顯式指定較少的返回?cái)?shù)據(jù)列,以避免語句執(zhí)行報(bào)錯(cuò)。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
- 庫(kù)的數(shù)目,超級(jí)表的數(shù)目、表的數(shù)目,系統(tǒng)不做限制,僅受系統(tǒng)資源限制。
TAOS SQL 其他約定
GROUP BY的限制
TAOS SQL 支持對(duì)標(biāo)簽、TBNAME 進(jìn)行 GROUP BY 操作,也支持普通列進(jìn)行 GROUP BY,前提是:僅限一列且該列的唯一值小于 10 萬個(gè)。注意:group by 不支持float,double 類型。
IS NOT NULL 與不為空的表達(dá)式適用范圍
IS NOT NULL 支持所有類型的列。不為空的表達(dá)式為 <>"",僅對(duì)非數(shù)值類型的列適用。
ORDER BY的限制
- 非超級(jí)表只能有一個(gè)order by.
- 超級(jí)表最多兩個(gè)order by, 并且第二個(gè)必須為ts.
- order by tag,必須和group by tag一起,并且是同一個(gè)tag。 tbname和tag一樣邏輯。 只適用于超級(jí)表
- order by 普通列,必須和group by一起或者和top/bottom一起,并且是同一個(gè)普通列。 適用于超級(jí)表和普通表。如果同時(shí)存在 group by和 top/bottom一起,order by優(yōu)先必須和group by同一列。
- order by ts. 適用于超級(jí)表和普通表。
- order by ts同時(shí)含有g(shù)roup by時(shí) 針對(duì)group內(nèi)部用ts排序
表(列)名合法性說明
TDengine 中的表(列)名命名規(guī)則如下: 只能由字母、數(shù)字、下劃線構(gòu)成,數(shù)字不能在首位,長(zhǎng)度不能超過192字節(jié),不區(qū)分大小寫。這里表名稱不包括數(shù)據(jù)庫(kù)名的前綴和分隔符。
轉(zhuǎn)義后表(列)名規(guī)則: 為了兼容支持更多形式的表(列)名,TDengine 引入新的轉(zhuǎn)義符 "`"??捎米尡砻c關(guān)鍵詞不沖突,同時(shí)不受限于上述表名稱合法性約束檢查,轉(zhuǎn)義符不計(jì)入表名稱的長(zhǎng)度。 轉(zhuǎn)義后的表(列)名同樣受到長(zhǎng)度限制要求,且長(zhǎng)度計(jì)算的時(shí)候不計(jì)算轉(zhuǎn)義符。使用轉(zhuǎn)義字符以后,不再對(duì)轉(zhuǎn)義字符中的內(nèi)容進(jìn)行大小寫統(tǒng)一。
例如: `aBc` 和 `abc` 是不同的表(列)名,但是 abc 和 aBc 是相同的表(列)名。
需要注意的是轉(zhuǎn)義字符中的內(nèi)容必須是可打印字符。
支持版本 支持轉(zhuǎn)義符的功能從 2.3.0.1 版本開始。
Json類型使用說明
-
語法說明
-
創(chuàng)建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是否存在操作符 contains
select * from s1 where info contains 'k2' select * from s1 where info contains 'k1'
-
-
支持的操作
-
在where條件中時(shí),支持函數(shù)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 -
支持json tag放在group by、order by、join子句、union all以及子查詢中,比如group by json->'key'
-
支持distinct操作.
select distinct info->'k1' from s1 -
標(biāo)簽操作
支持修改json標(biāo)簽值(全量覆蓋)
支持修改json標(biāo)簽名
不支持添加json標(biāo)簽、刪除json標(biāo)簽、修改json標(biāo)簽列寬
-
-
其他約束條件
-
只有標(biāo)簽列可以使用json類型,如果用json標(biāo)簽,標(biāo)簽列只能有一個(gè)。
-
長(zhǎng)度限制:json 中key的長(zhǎng)度不能超過256,并且key必須為可打印ascii字符;json字符串總長(zhǎng)度不超過4096個(gè)字節(jié)。
-
json格式限制:
- json輸入字符串可以為空("","\t"," "或null)或object,不能為非空的字符串,布爾型和數(shù)組。
- object 可為{},如果object為{},則整個(gè)json串記為空。key可為"",若key為"",則json串中忽略該k-v對(duì)。
- value可以為數(shù)字(int/double)或字符串或bool或null,暫不可以為數(shù)組。不允許嵌套。
- 若json字符串中出現(xiàn)兩個(gè)相同的key,則第一個(gè)生效。
- json字符串里暫不支持轉(zhuǎn)義。
-
當(dāng)查詢json中不存在的key時(shí),返回NULL
-
當(dāng)json tag作為子查詢結(jié)果時(shí),不再支持上層查詢繼續(xù)對(duì)子查詢中的json串做解析查詢。
比如暫不支持
select jtag->'key' from (select jtag from stable)不支持
select jtag->'key' from (select jtag from stable) where jtag->'key'>0轉(zhuǎn)義字符說明
-
-
轉(zhuǎn)義字符表 (轉(zhuǎn)義符的功能從 2.4.0.4 版本開始)
字符序列 代表的字符 \'單引號(hào)' \"雙引號(hào)" \n 換行符 \r 回車符 \t tab符 \\斜杠\ \%% 規(guī)則見下 \__ 規(guī)則見下 -
轉(zhuǎn)義字符使用規(guī)則
- 標(biāo)識(shí)符里有轉(zhuǎn)義字符(數(shù)據(jù)庫(kù)名、表名、列名)
- 普通標(biāo)識(shí)符: 直接提示錯(cuò)誤的標(biāo)識(shí)符,因?yàn)闃?biāo)識(shí)符規(guī)定必須是數(shù)字、字母和下劃線,并且不能以數(shù)字開頭。
- 反引號(hào)``標(biāo)識(shí)符: 保持原樣,不轉(zhuǎn)義
- 數(shù)據(jù)里有轉(zhuǎn)義字符
- 遇到上面定義的轉(zhuǎn)義字符會(huì)轉(zhuǎn)義(%和_見下面說明),如果沒有匹配的轉(zhuǎn)義字符會(huì)忽略掉轉(zhuǎn)義符\。
- 對(duì)于%和,因?yàn)樵趌ike里這兩個(gè)字符是通配符,所以在模式匹配like里用
\%%和\_表示字符里本身的%和,如果在like模式匹配上下文之外使用\%或\_,則它們的計(jì)算結(jié)果為字符串\%和\_,而不是%和_。

