关系数据查询
关系数据库支持使用 SQL 语句完成简单查询以及与其他结构组合形成的更复杂的选择查询。具体 SQL 语法格式,参见 SQL 参考。
创建查询
简单 SELECT 子句是读取和处理现有数据的主要 SQL 语法。当用作独立语句时,简单 SELECT 子句也称为 SELECT 语句。但是,它也是一个选择子句,可以与其他结构组合以形成更复杂的选择查询。KWDB 支持通过 SET CLUSTER SETTING sql.auto_limit.quantity = <value> 配置 SQL 查询结果的返回行数。
KWDB 支持在查询中对列类型为时间戳、时间戳常量以及结果类型为时间戳的函数和表达式进行时间加减运算,运算结果支持使用大于号(>)、小于号(<)、等号(=)、大于等于号(>=)、小于等于号(<=)进行比较。运算中可以包含 interval 常量、其他时间戳列以及结果类型为 interval、timestamp 或 timstamptz 的函数和表达式。如果运算符两边均为 timestamp 或 timestamptz 类型,则只支持减法运算,差值对应的纳秒数不得超过 INT64 范围,对应的天数不得超过 106751 天。超出范围时,系统将显示为 106751 days 23:47:16.854776。
加减运算中,interval 常量支持的单位包括毫秒(ms)、秒(s)、分(m)、小时(h)、天(d)、周(w)、月(mon)、年(y)。目前,KWDB 不支持复合时间格式,如 1d1h。
毫秒、秒、分、小时的取值范围受纳秒最大值(INT64)范围限制。下表列出具体支持的取值范围:
| 单位 | 取值范围 |
|---|---|
| 毫秒(ms) | [-9,223,372,036,854, 9,223,372,036,854] |
| 秒(s) | [-9,223,372,036, 9,223,372,036] |
| 分(m) | [-153,722,867, 153,722,867] |
| 小时(h) | [-2,562,047, 2,562,047] |
天、周、月、年的取值范围受加减计算结果的限制。计算结果对应的毫秒数不得超过 INT64 范围。
说明
时间加减表达式支持出现在以下位置:
SELECT列表:例如SELECT ts+1h FROM table1;将返回表中时间戳列加上 1 小时后的结果。WHERE子句:例如SELECT * FROM table1 WHERE ts+1h > now();将返回表中时间戳列加上 1 小时后大于当前时间的数据。ORDER BY子句:例如SELECT * FROM table1 ORDER BY ts+1h;将按时间戳列加上 1 小时后的值进行排序。HAVING子句:例如SELECT MAX(ts) FROM table1 GROUP BY ts HAVING ts+1h > now();将筛选出满足条件的分组结果。- 参数类型为 timestamp 的函数调用:例如
SELECT CAST(ts+1h AS timestamp) FROM table1;可以将时间戳列加上 1 小时后的结果转换为 timestamp 类型。 - 使用比较运算符的表示连接条件:例如
SELECT * FROM table1,table2 WHERE table1.ts+1h > table2.ts;表示在连接两个表时使用时间加减条件。
前提条件
用户拥有目标表的 SELECT 权限。
语法格式
有关关系数据查询的语法格式,参见 SQL 参考。
参数说明
有关关系数据查询的参数说明,参见 SQL 参考。
语法示例
以下示例假设已经创建 accounts 表并写入数据。
-- 1. 创建 accounts 表。
CREATE TABLE accounts(id INT8 DEFAULT unique_rowid() PRIMARY KEY, name STRING, balance DECIMAL, enabled BOOL);
CREATE TABLE
-- 2. 写入数据。
INSERT INTO accounts VALUES (1, 'lily', 10000.5, true), (2, 'ruarc', 20000.75, true), (3, 'tullia', 30000, false), (4, 'arturo', 45000, false);
INSERT 4
检索特定列。
以下示例检索
accounts表 中balance < 21000的数据。SELECT id FROM accounts WHERE balance < 21000; id -- 1 2 (2 rows)检索所有列。
以下示例检索
accounts表的所有列。SELECT * FROM accounts; id|name |balance |enabled --+------+--------+------- 1 |lily |10000.5 |t 2 |ruarc |20000.75|t 3 |tullia|30000 |f 4 |arturo|45000 |f (4 rows)使用单个条件过滤表。
以下示例过滤
accounts表中balance < 21000的数据。SELECT id FROM accounts WHERE balance < 21000; id -- 1 2 (2 rows)使用多个条件过滤表。
以下示例过滤
accounts表中balance > 25000且enabled = false的数据。SELECT * FROM accounts WHERE balance > 25000 AND enabled = false; id|name |balance|enabled --+------+-------+------- 3 |tullia|30000 |f 4 |arturo|45000 |f (2 rows)查询无重复的行。缺少主键或者唯一性约束的列可能存在相同的值。
以下示例查询
accounts表中无重复的行。-- 1. 向 accounts 表中写入数据。 INSERT INTO accounts VALUES (5, 'lily', 50000.5, true); INSERT 1 -- 查询 accounts 表中 enabled=true 的数据。 SELECT name FROM accounts WHERE enabled=true; name ----- lily ruarc lily (3 rows)使用
DISTINCT进行去重查询。以下示例使用
DISTINCT关键字对accounts表进行去重查询。SELECT DISTINCT name FROM accounts WHERE enabled=true; name ----- lily ruarc (2 rows)使用多个条件过滤表。
以下示例使用
WHERE IN(<逗号分隔的值列表>)子句查询accounts表中指定列的值。SELECT name FROM accounts WHERE balance in (10000.5, 20000.75); name ----- lily ruarc (2 rows)修改输出列的名称。
以下示例查询
accounts表的name列,并使用AS关键字将输出列的列名指定为n。SELECT name AS n, balance FROM accounts WHERE enabled=true; n |balance -----+-------- lily |10000.5 ruarc|20000.75 lily |50000.5 (3 rows)查询字符串值。
在
SELECT语句中使用LIKE关键字在列中搜索部分匹配的字符串,支持以下通配符:%:匹配0个或多个任意字符。_:匹配1个任意字符。[charlist]:匹配字符列charlist中的任意字符。charlist或[!charlist]:不匹配字符列charlist中的任意字符。
以下示例查询
accounts表中含有li字符的数据。SELECT * FROM accounts WHERE name LIKE '%li%'; id|name |balance|enabled --+------+-------+------- 1 |lily |10000.5|t 3 |tullia|30000 |f 5 |lily |50000.5|t (3 rows)在整个列上使用聚合函数,计算数据。
以下示例查询
accounts表中bakance值最小的数据。SELECT MIN(balance) FROM accounts; min ------- 10000.5 (1 row)KWDB 支持把聚合函数检索到的值作为
WHERE子句表达式的一部分。SELECT id, name, balance FROM accounts WHERE balance = (SELECT MIN(balance) FROM accounts); id|name|balance --+----+------- 1 |lily|10000.5 (1 row)在检索出的行数据上进行聚合函数操作。
以下示例对
accounts表的数据进行过滤,然后对查询结果的balance值进行求和计算。SELECT SUM(balance) FROM accounts WHERE enabled=true; SUM -------- 80001.75 (1 row)筛选加入聚合函数中的列。
以下示例使用
FILTER(WHERE<BOOLEAN 表达式>)过滤accounts表中由聚合函数处理的行。<BOOLEAN 表达式>是FILTER子句的布尔表达式。那些返回FALSE或NULL的值不会被输入到聚合函数中。SELECT count(*) AS unfiltered, count(*) FILTER (WHERE balance > 15000) AS filtered FROM accounts; unfiltered|filtered ----------+-------- 5 |4 (1 row)将检索到的行分组,然后对每组数据执行聚合函数。
以下示例查询
accounts表,使用GROUP BY子句对查询结果进行分组,然后在每行上执行聚合函数。SELECT enabled AS state, SUM(balance) AS state_balance FROM accounts GROUP BY enabled; state|state_balance -----+------------- t |80001.75 f |75000 (2 rows)过滤聚合组。
以下示例查询
accounts表,使用GROUP BY子句对查询结果进行分组,然后使用HAVING子句过滤聚合组。HAVING子句必须返回布尔值。SELECT enabled AS state, SUM(balance) AS state_balance FROM accounts GROUP BY enabled HAVING AVG(balance) between 100 AND 30000; state|state_balance -----+------------- t |80001.75 (1 row)在
Having子句中使用聚合函数查询表。以下示例在
Having子句中使用聚合函数查询accounts表。SELECT name, enabled FROM accounts WHERE enabled = true GROUP BY name, enabled HAVING count(name) > 1; name|enabled ----+------- lily|t (1 row)使用
LIMIT+count的形式查询表。以下示例使用
LIMIT+count的形式查询accounts表。SELECT * FROM accounts LIMIT 5; id|name |balance |enabled --+------+--------+------- 1 |lily |10000.5 |t 2 |ruarc |20000.75|t 3 |tullia|30000 |f 4 |arturo|45000 |f 5 |lily |50000.5 |t (5 rows)使用
FETCH FIRST+count的形式查询表。以下示例使用
FETCH FIRST+count的形式查询accounts表。SELECT * FROM accounts FETCH FIRST 2 ROW ONLY; id|name |balance |enabled --+-----+--------+------- 1 |lily |10000.5 |t 2 |ruarc|20000.75|t (2 rows)使用
LIMIT与OFFSET组合查询表。以下示例使用
LIMIT和OFFSET关键字查询accounts表。SELECT id, name FROM accounts LIMIT 1 OFFSET 1; id|name --+----- 2 |ruarc (1 row)当使用
NEXT关键字时,此时需要和OFFSET关键字组合使用。OFFSET n相当于指定了一个起始位置,从该位置开始取NEXT的count行。以下示例使用
NEXT和OFFSET关键字查询accounts表。SELECT * FROM accounts OFFSET 2 rows FETCH NEXT 2 ROW ONLY; id|name |balance|enabled --+------+-------+------- 3 |tullia|30000 |f 4 |arturo|45000 |f (2 rows)