数据查询

查询语法:

  1. SELECT [DISTINCT] select_expr [, select_expr ...]
  2. FROM {tb_name_list}
  3. [WHERE where_condition]
  4. [INTERVAL [interval_offset,] interval_val]
  5. [FILL fill_val]
  6. [SLIDING fill_val]
  7. [GROUP BY col_list]
  8. [ORDER BY col_list { DESC | ASC }]
  9. [HAVING expr_list]
  10. [SLIMIT limit_val [, SOFFSET offset_val]]
  11. [LIMIT limit_val [, OFFSET offset_val]]
  12. [>> export_file]

SELECT子句

一个选择子句可以是联合查询(UNION)和另一个查询的子查询(SUBQUERY)。

通配符

通配符 * 可以用于代指全部列。对于普通表,结果中只有普通列。

  1. taos> select * from temp_tb_1;
  2. ts | temperature |humidity|status|
  3. ============================================================
  4. 19-04-28 14:22:07.000| 20.00000 | 34 | 1 |
  5. 19-04-28 14:22:08.000| 21.50000 | 38 | 1 |
  6. 19-04-28 14:22:09.000| 21.30000 | 38 | 1 |
  7. 19-04-28 14:22:10.000| 21.20000 | 38 | 1 |
  8. 19-04-28 14:22:11.000| 21.30000 | 35 | 0 |
  9. 19-04-28 14:22:12.000| 22.00000 | 34 | 0 |

在针对超级表,通配符包含 标签列

  1. taos> select * from temp_stable;
  2. ts | temperature |humidity|status| deviceid | location |
  3. ==============================================================================================
  4. 19-04-28 14:22:07.000| 21.00000 | 37 | 1 |54197 |beijing |
  5. 19-04-28 14:22:07.000| 20.00000 | 34 | 1 |91234 |beijing |
  6. 19-04-28 14:22:08.000| 21.50000 | 38 | 1 |91234 |beijing |
  7. 19-04-28 14:22:09.000| 21.30000 | 38 | 1 |91234 |beijing |
  8. 19-04-28 14:22:10.000| 21.20000 | 38 | 1 |91234 |beijing |
  9. 19-04-28 14:22:11.000| 21.30000 | 35 | 0 |91234 |beijing |
  10. 19-04-28 14:22:12.000| 22.00000 | 34 | 0 |91234 |beijing |

通配符支持表名前缀,以下两个SQL语句均为返回全部的列:

  1. select * from temp_tb_1;
  2. select temp_tb_1.* from temp_tb_1;

在Join查询中,带前缀的*和不带前缀*返回的结果有差别, *返回全部表的所有列数据(不包含标签),带前缀的通配符,则只返回该表的列数据。

  1. taos> select * from temp_tb_1,temp_tb_2 where temp_tb_1.ts=temp_tb_2.ts;
  2. ts | temperature |humidity|status| ts | temperature |humidity|status|
  3. ========================================================================================================================
  4. 19-04-28 14:22:07.000| 20.00000 | 34 | 1 | 19-04-28 14:22:07.000| 21.00000 | 37 | 1 |
  1. taos> select temp_tb_1.* from temp_tb_1,temp_tb_2 where temp_tb_1.ts=temp_tb_2.ts;
  2. ts | temperature |humidity|status|
  3. ============================================================
  4. 19-04-28 14:22:07.000| 20.00000 | 34 | 1 |

在使用SQL函数来进行查询过程中,部分SQL函数支持通配符操作。其中的区别在于: count(\*)函数只返回一列。firstlastlast_row函数则是返回全部列。

  1. taos> select count(*) from temp_tb_1;
  2. count(*) |
  3. ======================
  4. 1 |
  1. taos> select first(*) from temp_tb_1;
  2. first(ts) | first(temperature) |first(humidity)|first(status)|
  3. ==========================================================================
  4. 19-04-28 14:22:07.000| 20.00000 | 34 | 1 |

结果集列名

SELECT子句中,如果不指定返回结果集合的列名,结果集列名称默认使用SELECT子句中的表达式名称作为列名称。此外,用户可使用AS来重命名返回结果集合中列的名称。例如:

  1. taos> select ts, ts as primary_key_ts from temp_tb_1;
  2. ts | primary_key_ts |
  3. ==============================================
  4. 19-04-28 14:22:07.000| 19-04-28 14:22:07.000|

但是针对first(*)last(*)last_row(*)不支持针对单列的重命名。

DISTINCT修饰符*

只能用于修饰标签列(TAGS)的结果,不能用于修饰普通列来获得去重后的结果。并且应用DISTINCT以后,只能进行单列的标签输出。 count(distinct column_name)用以返回近似的不重复结果的数量,该结果是近似值。

隐式结果列

Select_exprs可以是表所属列的列名,也可以是基于列的函数表达式或计算式,数量的上限256个。当用户使用了intervalgroup by tags的子句以后,在最后返回结果中会强制返回时间戳列(第一列)和group by子句中的标签列。后续的版本中可以支持关闭group by子句中隐式列的输出,列输出完全由select子句控制。

表(超级表)列表

FROM关键字后面可以是若干个表(超级表)列表,也可以是子查询的结果。 如果没有指定用户的当前数据库,可以在表名称之前使用数据库的名称来指定表所属的数据库。例如:sample.temp_tb_1 方式来跨库使用表。

  1. SELECT * FROM sample.temp_tb_1;
  2. ------------------------------
  3. use sample;
  4. SELECT * FROM temp_tb_1;

From子句中列表可以使用别名来让SQL整体更加简单。

  1. SELECT t.ts FROM temp_tb_1 t ;

暂不支持FROM子句的表别名

特殊功能

部分特殊的查询功能可以不使用FROM子句执行。获取当前所在的数据库 database()

  1. taos> SELECT database();
  2. database() |
  3. =================================
  4. sample |

如果登录的时候没有指定默认数据库,且没有使用`use命令切换数据,则返回NULL。

  1. taos> select database();
  2. database() |
  3. =================================
  4. NULL |

获取服务器和客户端版本号:

  1. SELECT client_version()
  2. SELECT server_version()

服务器状态检测语句。如果服务器正常,返回一个数字(例如 1)。如果服务器异常,返回error code。该SQL语法能兼容连接池对于TDengine状态的检查及第三方工具对于数据库服务器状态的检查。并可以避免出现使用了错误的心跳检测SQL语句导致的连接池连接丢失的问题。

  1. SELECT server_status()
  2. SELECT server_status() AS result

TAOS SQL中特殊关键词

TBNAME: 在超级表查询中可视为一个特殊的标签,代表查询涉及的子表名
_c0: 表示表(超级表)的第一列

小技巧

获取一个超级表所有的子表名及相关的标签信息:

  1. SELECT TBNAME, location FROM temp_stable

统计超级表下辖子表数量:

  1. SELECT COUNT(TBNAME) FROM temp_stable

以上两个查询均只支持在Where条件子句中添加针对标签(TAGS)的过滤条件。例如:

  1. taos> select count(tbname) from temp_stable;
  2. count(tbname) |
  3. ======================
  4. 2 |
  5. taos> select count(tbname) from temp_stable where deviceid > 60000;
  6. count(tbname) |
  7. ======================
  8. 1 |
  • 可以使用* 返回所有列,或指定列名。可以对数字列进行四则运算,可以给输出的列取列名
  • where语句可以使用各种逻辑判断来过滤数字值,或使用通配符来过滤字符串
  • 输出结果缺省按首列时间戳升序排序,但可以指定按降序排序(_c0指首列时间戳)。使用ORDER BY对其他字段进行排序为非法操作。
  • 参数LIMIT控制输出条数,OFFSET指定从第几条开始输出。LIMIT/OFFSET对结果集的执行顺序在ORDER BY之后。
  • 通过”>>”输出结果可以导出到指定文件

支持的条件过滤操作

OperationNoteApplicable Data Types
>larger thantimestamp and all numeric types
<smaller thantimestamp and all numeric types
>=larger than or equal totimestamp and all numeric types
<=smaller than or equal totimestamp and all numeric types
=equal toall types
<>not equal toall types
%match with any char sequencesbinary nchar
_match with a single charbinary nchar
  1. 同时进行多个字段的范围过滤需要使用关键词AND进行连接不同的查询条件,暂不支持OR连接的查询条件。
  2. 针对某一字段的过滤只支持单一区间的过滤条件。例如:value>20 and value<30是合法的过滤条件, 而Value<20 AND value<>5是非法的过滤条件。

Some Examples

  • 对于下面的例子,表tb1用以下语句创建

    1. CREATE TABLE tb1 (ts timestamp, col1 int, col2 float, col3 binary(50))
  • 查询tb1刚过去的一个小时的所有记录

    1. SELECT * FROM tb1 WHERE ts >= NOW - 1h
  • 查询表tb1从2018-06-01 08:00:00.000 到2018-06-02 08:00:00.000时间范围,并且clo3的字符串是’nny’结尾的记录,结果按照时间戳降序

    1. 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, 时间大于2018-06-01 08:00:00.000, col2大于1.2,结果输出仅仅10条记录,从第5条开始

    1. 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.

    1. SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv