| layout | default |
|---|---|
| title | SQL 参考 |
| description | 当前版本真实支持的数据面与控制面 SQL 语法、限制和示例。 |
| permalink | /sql-reference/ |
想直接复制完整场景化示例,可先看 [SQL Cookbook]({{ '/sql-cookbook/' | relative_url }});本页更偏向能力边界与精确语法说明。
定义 measurement schema:
CREATE MEASUREMENT cpu (
host TAG,
region TAG STRING,
usage FIELD FLOAT NULL,
count FIELD INT,
ok FIELD BOOL,
label FIELD STRING NOT NULL
)规则:
TAG列默认为字符串,TAG和TAG STRING等价。FIELD列支持FLOAT、INT、BOOL、STRING、VECTOR(N)、GEOPOINT。- schema 中至少要有一个
FIELD列。 time不属于 schema 定义的一部分。NULL/NOT NULL可作为 DDL 兼容修饰符出现在列类型后;当前仅保留在 SQL AST 中,执行层不把它持久化为 catalog 约束,也不强制NOT NULL。DEFAULT <expr>目前会被 parser 接受,但执行CREATE MEASUREMENT时会返回明确的DEFAULT暂不支持错误。
稀疏字段语义:
- SonnetDB 的 field 是稀疏的:同一个 measurement 的不同时间点可以携带不同 field 集合。
- 如果某个时间点没有写入某个 field,查询该列时结果为
NULL;这表示“该时间点未记录该字段”,不是 schema 约束失败。 - 写入时不要用
DEFAULT或显式NULL表达缺值;请省略该 field,或在应用侧写入具体默认值。
INSERT INTO cpu (time, host, region, usage, count, ok, label)
VALUES
(1713676800000, 'server-01', 'cn-hz', 0.71, 10, TRUE, 'ok'),
(1713676860000, 'server-01', 'cn-hz', 0.73, 11, TRUE, 'ok')规则:
time是保留伪列,表示 Unix 毫秒时间戳。time省略时会使用当前 UTC 毫秒时间。- 每一行至少需要提供一个
FIELD列值。 TAG列必须是字符串字面量。FIELD FLOAT可以接受整数或浮点字面量。- 目标 measurement 不存在时,
INSERT会按列值自动创建 schema;已有 measurement 缺失列时也会自动补齐。 - SQL
INSERT的未知字符串列会推断为TAG,未知非字符串列会推断为FIELD。 - 已有
INT字段遇到浮点值时会提升为FLOAT;已有FLOAT字段接收整数时会转换为浮点保存,不会降级为INT。 NULL不能作为当前INSERT的显式列值;要表达某个 field 在该时间点缺失,请从列列表中省略它。
查询所有列:
SELECT * FROM cpu WHERE host = 'server-01'显式投影:
SELECT time, host, usage
FROM cpu
WHERE host = 'server-01' AND time >= 1713676800000 AND time < 1713677400000
ORDER BY time ASC标量函数投影:
SELECT abs(-usage), round(usage / 3, 2), sqrt(count), log(count, 10), coalesce(label, 'n/a')
FROM cpu
WHERE host = 'server-01'单表别名与限定列名:
SELECT c.time, c.host, c."usage"
FROM cpu AS c
WHERE c.host = 'server-01'
ORDER BY c.time DESC
LIMIT 10兼容常见探活查询的字面量投影:
SELECT 1 AS ok FROM cpu LIMIT 1当前行为:
SELECT *会展开为time + 所有 tag 列 + 所有 field 列。- 支持字面量投影(如
SELECT 1 ... LIMIT 1),会按匹配到的时间轴返回常量列。 - 当某个时间点缺少某个 field 时,结果列会返回
NULL。 - 标量函数当前支持
abs、round、sqrt、log、coalesce。 - 标量函数当前仅支持出现在
SELECT投影中,可嵌套,也可接收算术表达式参数。 - 支持
FROM measurement [AS] alias单表别名,以及alias.column/alias."Column"限定列名;执行前会校验限定符必须匹配当前别名。 - 当前不支持
JOIN。 coalesce(...)只会在当前结果行存在时参与求值;它不会额外扩展原始查询的时间轴。- 结果按时间升序返回。
分页子句(兼容两种风格):
-- SQL 标准风格
SELECT time, host, usage
FROM cpu
WHERE host = 'server-01'
ORDER BY time ASC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- MySQL/PostgreSQL 常见风格
SELECT time, host, usage
FROM cpu
WHERE host = 'server-01'
ORDER BY time DESC
LIMIT 10 OFFSET 20;说明:
- 支持
ORDER BY time [ASC|DESC],排序会在分页前应用;当前要求查询结果中包含time列。 - 支持
OFFSET n(仅跳过,不限制返回行数)。 - 支持
FETCH FIRST|NEXT n ROW|ROWS ONLY。 - 支持
LIMIT n [OFFSET m]兼容语法。 ORDER BY/OFFSET/FETCH/LIMIT作用在最终结果集(投影/聚合之后)。
支持的聚合函数:
countsumminmaxavgfirstlast
示例:
SELECT sum(usage), avg(usage), min(usage), max(usage)
FROM cpu
WHERE host = 'server-01'count(*) 与 SQL 兼容写法 count(1) 也受支持:
SELECT count(*) FROM cpu WHERE host = 'server-01'
SELECT count(1) FROM cpu WHERE host = 'server-01'按时间桶聚合:
SELECT avg(usage) AS mean, count(usage)
FROM cpu
WHERE host = 'server-01'
GROUP BY time(1m)当前限制和真实行为:
- 仅支持
GROUP BY time(duration)。 - 仅可用于聚合查询。
- 不支持
GROUP BY host这类按列分组。 - 结果当前只返回聚合列,不会自动带出桶起始时间列。
- duration 例子:
1000ms、30s、1m。
DELETE FROM cpu
WHERE host = 'server-01' AND time >= 1713676800000 AND time <= 1713677400000也可以只按 tag 或只按时间范围删除:
DELETE FROM cpu WHERE host = 'server-01'
DELETE FROM cpu WHERE time >= 1713676800000 AND time <= 1713677400000当前删除语义:
- 删除底层通过 tombstone 实现,不会原地改写旧 segment。
- 后续查询会过滤 tombstone 覆盖的点。
- compaction 会逐步消化已删除数据。
常见保留策略也可以直接写成相对时间:
DELETE FROM cpu
WHERE time >= now() - 30d虽然解析器支持更多表达式形态,但当前执行器的稳定支持范围是:
- tag 等值条件,例如
host = 'server-01' time的范围比较,例如time >= 1713676800000 AND time < 1713763200000,或者time >= now() - 1d AND time < now() + 1d- 多个条件使用
AND连接
当前不建议在生产示例中使用:
OR- tag 不等式
- field 条件过滤,例如
usage > 0 - 混合聚合列与普通列,例如
SELECT host, sum(usage) ...
这些写法中的不少在当前版本会直接报错。
列出当前数据库中所有 measurement,按字典序升序返回单列 name。
SHOW TABLES 是 SHOW MEASUREMENTS 的兼容别名,便于 DBeaver、DataGrip
等通用 SQL 工具直接探测表清单。
SHOW MEASUREMENTS;
SHOW TABLES; -- 等价| name |
|---|
| cpu |
| mem |
描述指定 measurement 的列结构,按 CREATE MEASUREMENT 声明顺序返回三列:
| 列 | 类型 | 说明 |
|---|---|---|
column_name |
string | 列名 |
column_type |
string | tag 或 field |
data_type |
string | float64 / int64 / boolean / string |
关键字 MEASUREMENT 可省略,DESC 是 DESCRIBE 的兼容别名。
DESCRIBE MEASUREMENT cpu;
DESCRIBE cpu; -- 等价
DESC cpu; -- 等价| column_name | column_type | data_type |
|---|---|---|
| host | tag | string |
| usage | field | float64 |
若指定 measurement 不存在,会抛出 InvalidOperationException。
EXPLAIN 返回一组 key / value 结果行,用于估算查询会扫描的 series、segment、block 与行数。
EXPLAIN SELECT usage
FROM cpu
WHERE host = 'server-01' AND time >= now() - 1d;
EXPLAIN SHOW MEASUREMENTS;
EXPLAIN DESCRIBE MEASUREMENT cpu;当前支持范围:
SELECT ...SHOW MEASUREMENTS/SHOW TABLESDESCRIBE [MEASUREMENT] <name>/DESC <name>
当前不支持对 INSERT、DELETE、CREATE、DROP、用户/授权/Token 控制面 SQL 做 EXPLAIN。
返回字段包括 database、statement_type、measurement、matched_series_count、estimated_segment_count、estimated_block_count、estimated_scanned_rows、estimated_memtable_rows、estimated_segment_rows、has_time_filter 与 tag_filter_count。
控制面 SQL 仅在服务端模式可用。
CREATE USER alice WITH PASSWORD 'pa$$'
CREATE USER admin2 WITH PASSWORD 'secret' SUPERUSER
ALTER USER alice WITH PASSWORD 'new-password'
DROP USER aliceCREATE DATABASE metrics
DROP DATABASE metrics
SHOW DATABASESGRANT READ ON DATABASE metrics TO alice
GRANT WRITE ON DATABASE metrics TO alice
GRANT ADMIN ON DATABASE * TO admin2
REVOKE ON DATABASE metrics FROM aliceSHOW USERS
SHOW GRANTS
SHOW GRANTS FOR alice
SHOW TOKENS
SHOW TOKENS FOR alice
ISSUE TOKEN FOR alice
REVOKE TOKEN 'tok_abcdef'说明:
SHOW TOKENS只返回 Token 元数据,不返回明文。ISSUE TOKEN FOR ...会在结果里一次性返回明文 Token。REVOKE TOKEN 'tok_xxx'按 token id 吊销。
| 端点 | 用途 |
|---|---|
POST /v1/db/{db}/sql |
单条 SQL,主要用于数据面;admin 也可通过它执行部分控制面语句 |
POST /v1/db/{db}/sql/batch |
批量 SQL 脚本 |
POST /v1/sql |
专用控制面 SQL 端点,仅 admin |
readonly:仅查询readwrite:可写入和查询admin:可管理数据库、执行控制面 SQL、进入完整管理能力
- [批量写入]({{ site.docs_baseurl | default: '/help' }}/bulk-ingest/)
- [ADO.NET 参考]({{ site.docs_baseurl | default: '/help' }}/ado-net/)
- [CLI 参考]({{ site.docs_baseurl | default: '/help' }}/cli-reference/)