第8章:SQL 语句
本章涵盖了 SQL 语句在 DolphinDB 中访问、获取以及操作数据的使用方法。SQL 就是结构化查询语言。DolphinDB 的 SQL 格式与一些关系型数据库管理系统中的标准 SQL 语言十分相似,比如 MySQL, Oracle, SQL Server 等。
语法
select [top_clause] column_expressions
from table_name | table_expression
[where filtering_conditions]
[grouping_clause [having_clause] | order_clause]
支持标准的 SQL
支持 select, insert, update, delete 语句分别用于查询、插入、更新、删除数据表中的记录。从 2.00.5 开始,DolphinDB 支持 create 语句创建数据库(表),alter 语句为表增加列。
支持 where 条件。
支持分组 (group by) 和排序 (order by) 子句。
支持表连接:inner join, left join, left semijoin, full join。
区别
通常标准 SQL 语句不区分字母的大小写,而 DolphinDB 的 SQL 语句区分大小写。DolphinDB 中的 SQL 关键字必须使用小写。
可在 SQL 查询中直接使用绝大部分函数。
其它区别如下表所示:
标准 SQL 语法 | DolphinDB 语法 |
解释 |
|
---|---|---|
where sym=’IBM’ |
where sym=`IBM (“IBM”) or where sym==`IBM (“IBM”) |
DolphinDB 中,单词上加上反引号,即可表示成字符串。 DolphinDB 中,一个单词或者一个句子上使用双引号或者单引号,即可将其表示成字符串。 |
where sym=’IBM’ and qty>2000 |
where sym==`IBM, qty>2000 where sym==`IBM and qty>2000 where sym=`IBM && qty>2000 |
DolphinDB 中,逗号 (,) 连接条件的执行顺序和其位置有关,仅当前一个条件通过后才会继续验证下一个条件。 and 连接的过滤条件为并列关系,所有条件都对原表过滤后再将结果取交集。因此,逗号连接的过滤条件必须 和序列无关。and 连接的过滤条件可以序列相关或无关。当条件间都序列无关时,and 和逗号性能相同。 |
where sym=”IBM” or qty>2000 |
where sym==`IBM or qty>2000 where sym==`IBM || qty>2000 |
|
where x not in (1,2) and y not in (22,23) |
where x not in (1,2) and y not in (22,23) or where (not x in [1,2]) and (not y in (22,23)) |
|
select avg(price), sym from Dataset group by sym |
select avg(price) from Dataset group by sym 或 select avg(price), sym from Dataset group by sym |
DolphinDB 中,group by 的列名如果在 select 中未指定,则会自动添加到结果中。 |
N/A |
context by |
context by 是 DolphinDB 的独有的创新,它使得在处理各组内时间序列时非常方便。context by 与 group by 相似,但是 group by 的结果为每一组返回一个标量值,而 context by 的结果为 每一组返回一个与组内记录 数同样长度的向量。 |
N/A |
pivot by |
pivot by 将数据转换成二维视图。 |
N/A |
cgroup by |
|
N/A |
map |
将 SQL 语句在每个分区分别执行,然后将结果合并。 |
case …. when …. |
||
select column_name(s) from table1 left join table 2 on table1.column_name=table2.column_name |
select column_name(s) from lj(table1, table2, column_name) |
DolphinDB 的语法更简洁。 |
LEFT JOIN |
left join, lj, left semijoin, lsj |
左连接和左半连接。左连接返回左表中所有与右表匹配的行。如果右表中如果右表中没有匹配的记录, 将会返回NULL。如果右表中有多条匹配记录,将会返回所有的匹配记录。与左连接不同的是如果右表中有 多条匹配记录,左半连接只返回第一条匹配的记录。 |
INNER JOIN |
inner join, ej, sej |
等值连接和有序等值连接。返回与匹配列相等的行。sej 和 ej 的区别 sej 对连接结果的表根据连接字段进 行排序。 |
FULL JOIN |
full join, fj |
完全连接。返回左表和右表的所有行。 |
N/A |
aj |
asof 连接。它把左表中的每一条记录作为标准,并且检查右表中是否有匹配行。如果没有完全匹配的行,将 会选择最近的行。如果有多个匹配行,将会选择最后一行。 |
N/A |
wj, pwj |
窗口连接和现行窗口连接。它们是 asof 连接的扩展。对于左表中的每一行,窗口连接把聚合函数应用到在滑 动窗口中右表的行。如果右表中没有与窗口匹配的值,现行窗口连接会选择滑动窗口的前一个值,并对它使 用聚合函数。 |