数据查询
查询语法:
SELECT [DISTINCT] select_expr [, select_expr ...]
FROM {tb_name_list}
[WHERE where_condition]
[INTERVAL [interval_offset,] interval_val]
[FILL fill_val]
[SLIDING fill_val]
[GROUP BY col_list]
[ORDER BY col_list { DESC | ASC }]
[HAVING expr_list]
[SLIMIT limit_val [, SOFFSET offset_val]]
[LIMIT limit_val [, OFFSET offset_val]]
[>> export_file]
SELECT子句
一个选择子句可以是联合查询(UNION)和另一个查询的子查询(SUBQUERY)。
通配符
通配符 * 可以用于代指全部列。对于普通表,结果中只有普通列。
taos> select * from temp_tb_1;
ts | temperature |humidity|status|
============================================================
19-04-28 14:22:07.000| 20.00000 | 34 | 1 |
19-04-28 14:22:08.000| 21.50000 | 38 | 1 |
19-04-28 14:22:09.000| 21.30000 | 38 | 1 |
19-04-28 14:22:10.000| 21.20000 | 38 | 1 |
19-04-28 14:22:11.000| 21.30000 | 35 | 0 |
19-04-28 14:22:12.000| 22.00000 | 34 | 0 |
在针对超级表,通配符包含 标签列 。
taos> select * from temp_stable;
ts | temperature |humidity|status| deviceid | location |
==============================================================================================
19-04-28 14:22:07.000| 21.00000 | 37 | 1 |54197 |beijing |
19-04-28 14:22:07.000| 20.00000 | 34 | 1 |91234 |beijing |
19-04-28 14:22:08.000| 21.50000 | 38 | 1 |91234 |beijing |
19-04-28 14:22:09.000| 21.30000 | 38 | 1 |91234 |beijing |
19-04-28 14:22:10.000| 21.20000 | 38 | 1 |91234 |beijing |
19-04-28 14:22:11.000| 21.30000 | 35 | 0 |91234 |beijing |
19-04-28 14:22:12.000| 22.00000 | 34 | 0 |91234 |beijing |
通配符支持表名前缀,以下两个SQL语句均为返回全部的列:
select * from temp_tb_1;
select temp_tb_1.* from temp_tb_1;
在Join查询中,带前缀的*和不带前缀*返回的结果有差别, *返回全部表的所有列数据(不包含标签),带前缀的通配符,则只返回该表的列数据。
taos> select * from temp_tb_1,temp_tb_2 where temp_tb_1.ts=temp_tb_2.ts;
ts | temperature |humidity|status| ts | temperature |humidity|status|
========================================================================================================================
19-04-28 14:22:07.000| 20.00000 | 34 | 1 | 19-04-28 14:22:07.000| 21.00000 | 37 | 1 |
taos> select temp_tb_1.* from temp_tb_1,temp_tb_2 where temp_tb_1.ts=temp_tb_2.ts;
ts | temperature |humidity|status|
============================================================
19-04-28 14:22:07.000| 20.00000 | 34 | 1 |
在使用SQL函数来进行查询过程中,部分SQL函数支持通配符操作。其中的区别在于: count(\*)
函数只返回一列。first
、last
、last_row
函数则是返回全部列。
taos> select count(*) from temp_tb_1;
count(*) |
======================
1 |
taos> select first(*) from temp_tb_1;
first(ts) | first(temperature) |first(humidity)|first(status)|
==========================================================================
19-04-28 14:22:07.000| 20.00000 | 34 | 1 |
结果集列名
SELECT
子句中,如果不指定返回结果集合的列名,结果集列名称默认使用SELECT
子句中的表达式名称作为列名称。此外,用户可使用AS
来重命名返回结果集合中列的名称。例如:
taos> select ts, ts as primary_key_ts from temp_tb_1;
ts | primary_key_ts |
==============================================
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个。当用户使用了interval
或group by tags
的子句以后,在最后返回结果中会强制返回时间戳列(第一列)和group by子句中的标签列。后续的版本中可以支持关闭group by子句中隐式列的输出,列输出完全由select子句控制。
表(超级表)列表
FROM关键字后面可以是若干个表(超级表)列表,也可以是子查询的结果。 如果没有指定用户的当前数据库,可以在表名称之前使用数据库的名称来指定表所属的数据库。例如:sample.temp_tb_1
方式来跨库使用表。
SELECT * FROM sample.temp_tb_1;
------------------------------
use sample;
SELECT * FROM temp_tb_1;
From子句中列表可以使用别名来让SQL整体更加简单。
SELECT t.ts FROM temp_tb_1 t ;
暂不支持FROM子句的表别名
特殊功能
部分特殊的查询功能可以不使用FROM子句执行。获取当前所在的数据库 database()
taos> SELECT database();
database() |
=================================
sample |
如果登录的时候没有指定默认数据库,且没有使用`use
命令切换数据,则返回NULL。
taos> select database();
database() |
=================================
NULL |
获取服务器和客户端版本号:
SELECT client_version()
SELECT server_version()
服务器状态检测语句。如果服务器正常,返回一个数字(例如 1)。如果服务器异常,返回error code。该SQL语法能兼容连接池对于TDengine状态的检查及第三方工具对于数据库服务器状态的检查。并可以避免出现使用了错误的心跳检测SQL语句导致的连接池连接丢失的问题。
SELECT server_status()
SELECT server_status() AS result
TAOS SQL中特殊关键词
TBNAME: 在超级表查询中可视为一个特殊的标签,代表查询涉及的子表名
_c0: 表示表(超级表)的第一列
小技巧
获取一个超级表所有的子表名及相关的标签信息:
SELECT TBNAME, location FROM temp_stable
统计超级表下辖子表数量:
SELECT COUNT(TBNAME) FROM temp_stable
以上两个查询均只支持在Where条件子句中添加针对标签(TAGS)的过滤条件。例如:
taos> select count(tbname) from temp_stable;
count(tbname) |
======================
2 |
taos> select count(tbname) from temp_stable where deviceid > 60000;
count(tbname) |
======================
1 |
- 可以使用* 返回所有列,或指定列名。可以对数字列进行四则运算,可以给输出的列取列名
- where语句可以使用各种逻辑判断来过滤数字值,或使用通配符来过滤字符串
- 输出结果缺省按首列时间戳升序排序,但可以指定按降序排序(_c0指首列时间戳)。使用ORDER BY对其他字段进行排序为非法操作。
- 参数LIMIT控制输出条数,OFFSET指定从第几条开始输出。LIMIT/OFFSET对结果集的执行顺序在ORDER BY之后。
- 通过”>>”输出结果可以导出到指定文件
支持的条件过滤操作
Operation | Note | Applicable Data Types |
---|---|---|
> | larger than | timestamp and all numeric types |
< | smaller than | timestamp and all numeric types |
>= | larger than or equal to | timestamp and all numeric types |
<= | smaller than or equal to | timestamp and all numeric types |
= | equal to | all types |
<> | not equal to | all types |
% | match with any char sequences | binary nchar |
_ | match with a single char | binary nchar |
- 同时进行多个字段的范围过滤需要使用关键词AND进行连接不同的查询条件,暂不支持OR连接的查询条件。
- 针对某一字段的过滤只支持单一区间的过滤条件。例如:value>20 and value<30是合法的过滤条件, 而Value<20 AND value<>5是非法的过滤条件。
Some Examples
对于下面的例子,表tb1用以下语句创建
CREATE TABLE tb1 (ts timestamp, col1 int, col2 float, col3 binary(50))
查询tb1刚过去的一个小时的所有记录
SELECT * FROM tb1 WHERE ts >= NOW - 1h
查询表tb1从2018-06-01 08:00:00.000 到2018-06-02 08:00:00.000时间范围,并且clo3的字符串是’nny’结尾的记录,结果按照时间戳降序
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条开始
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