SQL
GreptimeDB 在查询数据时支持完整的 SQL
语法。
在这篇文档中,我们将使用 monitor
表中的数据作为示例来演示如何查询数据 。关于如何创建 monitor
表格并向其中插入数据,请参考表管理和写入数据。
基础查询
通过 SELECT
语句来查询数据。例如,下面的查询返回 monitor
表中的所有数据:
SELECT * FROM monitor;
查询结果如下:
+-----------+---------------------+------+--------+
| host | ts | cpu | memory |
+-----------+---------------------+------+--------+
| 127.0.0.1 | 2022-11-03 03:39:57 | 0.1 | 0.4 |
| 127.0.0.1 | 2022-11-03 03:39:58 | 0.5 | 0.2 |
| 127.0.0.2 | 2022-11-03 03:39:58 | 0.2 | 0.3 |
+-----------+---------------------+------+--------+
3 rows in set (0.00 sec)
SELECT
字段列表中也支持使用函数。
例如,你可以使用 count()
函数来获取表中的总行数:
SELECT count(*) FROM monitor;
+-----------------+
| COUNT(UInt8(1)) |
+-----------------+
| 3 |
+-----------------+
使用函数 avg()
返回某个字段的平均值:
SELECT avg(cpu) FROM monitor;
+---------------------+
| AVG(monitor.cpu) |
+---------------------+
| 0.26666666666666666 |
+---------------------+
1 row in set (0.00 sec)
你还可以只返回函数的结果,例如从时间戳中提取一年中的第几天。
SQL 语句中的 DOY
是 day of the year
的缩写:
SELECT date_part('DOY', '2021-07-01 00:00:00');
结果:
+----------------------------------------------------+
| date_part(Utf8("DOY"),Utf8("2021-07-01 00:00:00")) |
+----------------------------------------------------+
| 182 |
+----------------------------------------------------+
1 row in set (0.003 sec)
请参考 SELECT 和 Functions 获取更多信息。
限制返回的行数
时间序列数据通常是海量的。
为了节省带宽和提高查询性能,你可以使用 LIMIT
语句来限制 SELECT
语句返回的行数。
例如,下面的查询限制返回的行数为 10:
SELECT * FROM monitor LIMIT 10;
过滤数据
你可以使用 WHERE
子句来过滤 SELECT
语句返回的行。
时序数据库中常见的场景是按照标签或时间索引来过滤数据。
例如,按照标签 host
来过滤数据:
SELECT * FROM monitor WHERE host='127.0.0.1';
按照时间索引 ts
来过滤数据,返回 2022-11-03 03:39:57
之后的数据:
SELECT * FROM monitor WHERE ts > '2022-11-03 03:39:57';
你可以使用 AND
关键字来组合多个约束条件:
SELECT * FROM monitor WHERE host='127.0.0.1' AND ts > '2022-11-03 03:39:57';
使用时间索引过滤数据
按照时间索引来过滤数据是时序数据库的一个关键特性。
当处理 Unix 时间值时,数据库会默认将其类型认定为相关列的值类型。
例如,当 monitor
表中的 ts
列的值类型为 TimestampMillisecond
时,
你可以使用下面的查询来过滤数据:
Unix 时间值 1667446797000
表示一个以毫秒为单位的时间戳。
SELECT * FROM monitor WHERE ts > 1667446797000;
当处理时间精度为非默认类型的 Unix 时间值时,你需要使用 ::
语法来指定时间的类型。
这样可以确保数据库正确地识别时间的类型。
例如 1667446797
表示一个以秒为单位的时间戳,不是 ts
列默认的毫秒时间戳。
你需要使用 ::TimestampSecond
语法来指定它的类型为 TimestampSecond
来告知数据库 1667446797
应该被视为以秒为单位的时间戳。
SELECT * FROM monitor WHERE ts > 1667446797::TimestampSecond;
请参考数据类型 获取更多时间类型。
对于标准的 RFC3339
或 ISO8601
字符串,由于其具备明确的精度,你可以直接在过滤条件中使用它们:
SELECT * FROM monitor WHERE ts > '2022-07-25 10:32:16.408';