第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 语句分别用于查询、插入、更新、删除数据表中的记录。从 1.30.17 开始,DolphinDB 支持 create 语句创建数据库(表),alter 语句为表增加列。从 1.30.22 版本开始,DolphinDB 的 SQL 关键字也可以采用全部大写的形式,例如 SELECT, FROM, WHERE 等。

  • 支持 where 条件。

  • 支持分组 (group by) 和排序 (order by) 子句。

  • 支持表连接:inner join, left join, left semijoin, full join。

  • 从版本 1.30.22 开始,支持将 SQL 语句分成多行编写。但请注意以下2点:

    • 由2个单词组成的关键字(例如:order by, group by, context by, pivot by, union all, inner join, nulls first 等)不能在中间拆分换行。

    • 为字段或表指定别名时,若不使用关键字 as,则别名必须紧跟在原名称后面,不能换行。

区别

  • 可在 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 ….

iif

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 连接的扩展。对于左表中的每一行,窗口连接把聚合函数应用到在滑

动窗口中右表的行。如果右表中没有与窗口匹配的值,现行窗口连接会选择滑动窗口的前一个值,并对它使

用聚合函数。

SQL 方言兼容

自 1.30.22 版本开始,DolphinDB 实现了对 Oracle 和 MySQL 方言的兼容性。除了支持标准 SQL 语法外,还解决了因不同方言的扩展特性导致同名函数执行行为不一致的问题。通过会话(session)选择方言模式,便可在该会话中执行相应语言编写的脚本。目前有三种模式可选:DolphinDB, Oracle 和 MySQL。

注意:

  • Oracle 和 MySQL 方言模式也能正确解析使用 DolphinDB 语言编写的脚本。

  • 仅支持 Oracle 和 MySQL 的部分功能和函数,见下表:

SQL 方言模式

支持的功能

支持的函数(不区分大小写)

Oracle

注释符:--, /**/

字符串拼接符:||

concat, decode, to_char, to_date, nvl, nvl2 和 instr

注意:to_char 只接收数值类型和DATE, DATEHOUR, DATETIME 类型的参数。

MySQL

sysdate