选择语句
SQL 中的 SELECT 语句用于显示表中指定列的内容(称为“投影”)。SmartESQL 支持几乎所有的标准 SQL 结构。(有关 SELECT 语句语法的详细说明,请参阅维基百科页面。)
以下各节将介绍一些重要的 SmartESQL 特性和 SQL 扩展。
排序依据
ORDER BY 子句会根据指定的列对结果集进行排序。例如,考虑以下表和索引定义,其中初始化了 6 行数据:
create table orders(id integer not null, tm integer not null);
create index idx on orders(id,tm);
insert into orders values (2, 200);
insert into orders values (2, 220);
insert into orders values (2, 210);
insert into orders values (1, 100);
insert into orders values (1, 120);
insert into orders values (1, 110);
一个简单的选择操作会按照插入的顺序显示行:
select * from orders;
id tm
---------------------
2 200
2 220
2 210
1 100
1 120
1 110
现在,使用 order by 子句,我们可以按列 id 和 tm 升序对结果集进行排序,如下所示:
select * from orders order by id, tm;
id tm
-------------------------------------
1 100
1 110
1 120
2 200
2 210
2 220
或者按如下方式将结果集中的行按降序排序:
select * from orders order by id desc, tm desc;
id tm
-----------------------------------------------
2 220
2 210
2 200
1 120
1 110
1 100
唯一排序
SmartESQL 的一个有用扩展是可以在排序子句中添加 distinct 关键字。这允许将结果集限制为有序子集中的单条记录。例如,使用 distinct order 特性,我们可以从由列 id 的值定义的每个“有序子集”中提取第一行,如下所示:
select * from orders order by id distinct, tm;
id tm
----------------------------------------------
1 100
2 200
或者,我们可以通过指定降序来从“有序子集”中提取最后一行,具体操作如下:
select * from orders order by id desc distinct, tm desc;
id tm
--------------------------------------------------------
2 220
1 120
更新操作
在 SQL 选择语句中的 for update 子句用于表明结果集(游标)随后将用于更新数据值。请注意,SmartESQL 对 for update 子句的实现与标准稍有不同。标准规定“for update on”,其中介词“on”要求指定将要更新的列的列表,而 SmartESQL 不需要“on 列表”——所有列均可修改。在 SmartESQL 中,for update 子句指示运行时避免发出事务升级(从只读到读写),而是从一开始就打开读写事务。
序列的忽略列运算符
感叹号(“!”
)可用作序列函数 seq_ignore() 的快捷方式,以表明计算列在结果集输出中应被忽略。例如,考虑以下具有一个有序列和两个无序列的表:
create table Quotes(sym string primary key,
day sequence(int asc),
open sequence(int),
close sequence(int));
insert into Quotes values('AAA',
[20170501, 20170502, 20170503, 20170504, 20170505, 20170509, 20170510],
[101, 102, 103, 104, 105, 109, 110],
[111, 112, 113, 114, 115, 119, 120]);
insert into Quotes values('BBB',
[20170501, 20170502, 20170503, 20170504, 20170505, 20170509, 20170510],
[201, 202, 203, 204, 205, 209, 210],
[211, 212, 213, 214, 215, 219, 220]);
insert into Quotes values('CCC',
[20170501, 20170502, 20170503, 20170504, 20170505, 20170509, 20170510],
[301, 302, 303, 304, 305, 309, 310],
[311, 312, 313, 314, 315, 319, 320]);
select !seq_search(day, 20170501, 20170503) as daterange,
open@daterange as "open", close@daterange as "close"
from Quotes;
daterange open close
------------------------------------------------------------------------------
{?} {101, 102, 103} {111, 112, 113}
{?} {201, 202, 203} {211, 212, 213}
{?} {301, 302, 303} {311, 312, 313}
Selected records: 3
在此查询中,我们使用 seq_search() 函数选择一个区间,并且由于查询结果中不需要该区间内的所有时间戳,因此我们使用! 运算符将该列标记为忽略。被忽略的列可以在其他计算列中使用,但不会出现在实际的语句输出中。