表是数据库的重要组成部分,用于表达数据以及这些数据之间的联系。表由许多列组成,每一列都必须指定列名和数据类型,并且存储了对应类型的数据。可以对表中的数据进行增加,删除,修改和查询操作。

DolphinDB 中数据表有以下几类:

创建表

本节介绍内存表的创建。创建内存表时,列名必须由中文或英文字母、数字或下划线 (_),且必须以中文或英文字母开头。

1.30.14 版本开始,由 pivot by, addColumn 操作产生的列名,支持包含特殊字符,或以数字开头。

请注意:

  • 包含特殊符号或以数字开头的列名在 SQL 中引用时,需将列名用双引号引用,并在其之前使用下划线作为标识,例如:_"IBM.N", _"000001.SH";

  • 列名包含特殊符号或以数字开头的列亦可通过 tb["col"],tb."col" 的方式访问。

  • 进行 pivot by 需要对空数据赋予列名时,会赋予列名"NULL",引用时需要遵循上述第一条规则(_"NULL")。

为了与之前版本的代码兼容,引入了配置项 removeSpecialCharInColumnName,默认值是 false,表示允许列名包含特殊字符。如果要跟以前兼容,可以将该变量配置为 true。

创建内存表的三种方式:

$ t0=table(1 2 3 as a, `x`y`z as b, 10.8 7.6 3.5 as c);
$ t0;

a

b

c

1

x

10.8

2

y

7.6

3

z

3.5

$ x=1 2 3;
$ y=4 5 6;
$ t1=table(x,y);
$ t1;

x

y

1

4

2

5

3

6

$ t2=table(200:10, `name`id`value, [STRING,INT,DOUBLE]);
$ t2;

name

id

value

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

列名包含特殊符号的内存表创建与查询:

$ t3=table(1 2 3 as `_a, 4 5 6 as "2 ab");
$ t3;

_a

2 ab

1

4

2

5

3

6

$ select _"_a" as "_aa", _"2 ab" as "2ab" from t3;

_aa

2ab

1

4

2

5

3

6

将向量或矩阵转换为表:

$ a=([1,2],[3.2,4.3],[2019.01.02,2019.05.03]);
$ table(a);

C0

C1

C2

1

3.2

2019.01.02

2

4.3

2019.05.03

$ m=1..12$3:4;
$ table(m);

C0

C1

C2

C3

1

4

7

10

2

5

8

11

3

6

9

12

访问表

DolphinDB 访问表的方式很灵活,既可以使用 SQL 语句,也可以使用类似 python 的语法。SQL 访问表的具体例子详见 第8章:SQL 语句,下例主要说明如何通过类似 python 的语法读取表数据。

可使用 <tableName>[X,Y] 访问表,其中 X 和 Y 可以是标量或数据对。X 用于选择行,Y 用于选择列。表索引的范围从 0 开始,不包含上限值。例如,1:3 包括 1 和 2。类似地,2:0 表示 1 和 0。

$ t1[1:3, 1];

y

5

6

$ t1[,t1.columns()-1];

y

4

5

6

$ t1.keys();
["x","y"]

$ t1.values();
([1,2,3],[4,5,6])

条件访问数据表:

$ t1[t1.x>2];      // 查询 x>2 的行
or
$ t1[t1[`x]>2];

x

y

3

6

$ t1[t1.x in (1 3)];       // 查询 x=1x=3 的行

x

y

1

4

3

6

$ t1[t1.x>1 && t1.y<6];       // 查询 x>1 和 y<6 的行

x

y

2

5

更新表

修改内存表:

$ t1[`x, t1[`x] < 2] = 3
or
$ t1[`x, <x < 2>] = 3

x

y

3

4

2

5

3

6

创建一个空表并插入数据:

$ t = table(100:0, `x`y`z, `STRING`DATE`DOUBLE);
// 创建一个具有三列 x, y, z 的表,数据类型分别为 STRING, DATE, DOUBLE。表的容量为 100,初始长度为 0。

$ t;

x

y

z

$ insert into t values(take(`MS,3),2010.01.01 2010.01.02 2010.01.03, 1 2 3);
$ t;

x

y

z

MS

2010.01.01

1

MS

2010.01.02

2

MS

2010.01.03

3

通过赋值语句添加或更新表:

$ t=table(1 2 3 as id, 4 5 6 as value);
$ t;

id

value

1

4

2

5

3

6

$ t[`id`name]=[7 8 9, `IBM`MSFT`GOOG];
$ t;

id

value

name

7

4

IBM

8

5

MSFT

9

6

GOOG

插入数据的时间类型与内存表时间类型不一致时,会自动转换为内存表时间列的类型。

$ n=10
$ colNames = timesymid
$ colTypes = [DATE,SYMBOL,INT]
$ t = table(n:0, colNames, colTypes)
$ insert into t values(2020.01.05 13:30:10.008, A1, 1)
$ insert into t values(2020.01.06 13:30:10.008, A2, 2)
$ insert into t values(2020.06M, A3, 3)

$ update t set time=2020.06.13 13:30:10 where sym=`A1
$ select * from t

time

sym

id

2020.06.13

A1

1

2020.01.06

A2

2

2020.06.01

A3

3