Q Language - Table

优质
小牛编辑
135浏览
2023-12-01

表是kdb +的核心。 表是作为字典实现的命名列的集合。 q tables是面向列的。

创建表

使用以下语法创建表 -

q)trade:([]time:();sym:();price:();size:())
q)trade
time sym price size
-------------------

在上面的示例中,我们没有指定每列的类型。 这将由第一次插入表中设置。

另一种方法,我们可以在初始化时指定列类型 -

q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())

或者我们也可以定义非空表 -

q)trade:([]sym:(`a`b);price:(1 2))
q)trade
 sym   price
-------------
  a      1
  b      2

如果方括号内没有列,如上例所示,则表是未unkeyed

要创建keyed table ,我们在方括号中插入keyed table的列。

q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())
q)trade
 sym   | time price size
-----  | ---------------

也可以通过将值设置为各种类型的空列表来定义列类型 -

q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)

获取表信息

让我们创建一个交易表 -

trade: ([]sym:`ibm`msft`apple`samsung;mcap:2000 4000 9000 6000;ex:`nasdaq`nasdaq`DAX`Dow)
q)cols trade                        /column names of a table
`sym`mcap`ex
q)trade.sym                         /Retrieves the value of column sym
`ibm`msft`apple`samsung
q)show meta trade                   /Get the meta data of a table trade.
  c   | t f a
----- | -----
 Sym  | s
 Mcap | j
 ex   | s

主键和键控表

键控表

键控表是一个字典,它将唯一键表中的每一行映射到值表中的相应行。 让我们举一个例子 -

val:flip `name`id!(`John`Jenny`Jonathan;9 18 27)
                         /a flip dictionary create table val
id:flip (enlist `eid)!enlist 99 198 297
                         /flip dictionary, having single column eid

现在创建一个包含eid作为键的简单键控表,

q)valid: id ! val
q)valid                /table name valid, having key as eid
  eid |  name      id
------| ---------------
  99  |  John      9
  198 |  Jenny     18
  297 |  Jonathan  27

ForeignKeys

foreign key定义了从定义它的表的行到具有相应primary key的表的行的映射。

外键提供referential integrity 。 换句话说,尝试插入不在主键中的外键值将失败。

请考虑以下示例。 在第一个示例中,我们将在初始化时明确定义外键。 在第二个例子中,我们将使用外键追逐,它不假设两个表之间的任何先前关系。

Example 1 − Define foreign key on initialization

q)sector:([sym:`SAMSUNG`HSBC`JPMC`APPLE]ex:`N`CME`DAQ`N;MC:1000 2000 3000 4000)
q)tab:([]sym:`sector$`HSBC`APPLE`APPLE`APPLE`HSBC`JPMC;price:6?9f)
q)show meta tab
  c    | t f a
------ | ----------
 sym   | s sector
 price | f
q)show select from tab where sym.ex=`N
  sym     price
----------------
 APPLE   4.65382
 APPLE   4.643817
 APPLE   3.659978

Example 2 − no pre-defined relationship between tables

sector: ([symb:`IBM`MSFT`HSBC]ex:`N`CME`N;MC:1000 2000 3000)
tab:([]sym:`IBM`MSFT`MSFT`HSBC`HSBC;price:5?9f)

要使用外键追逐,我们必须创建一个表来键入扇区。

q)show update mc:(sector([]symb:sym))[`MC] from tab
  sym     price      mc
--------------------------
  IBM   7.065297    1000
  MSFT  4.812387    2000
  MSFT  6.400545    2000
  HSBC  3.704373    3000
  HSBC  4.438651    3000

预定义外键的常规表示法 -

从c where a is the foreign key (sym), b is a选择ab, where a is the foreign key (sym), b is a

field in the primary key table (ind), c is the

foreign key table (trade)

操纵表

让我们创建一个交易表并检查不同表表达式的结果 -

q)trade:([]sym:5?`ibm`msft`hsbc`samsung;price:5?(303.00*3+1);size:5?(900*5);time:5?(.z.T-365))
q)trade
  sym        price   size   time
-----------------------------------------
 msft      743.8592  3162  02:32:17.036
 msft      641.7307  2917  01:44:56.936
 hsbc      838.2311  1492  00:25:23.210
 samsung   278.3498  1983  00:29:38.945
 ibm       838.6471  4006  07:24:26.842

现在让我们看一下使用q语言操作表的语句。

Select

使用Select语句的语法如下 -

select [columns] [by columns] from table [where clause]

现在让我们举个例子来演示如何使用Select语句 -

q)/ select expression example
q)select sym,price,size by time from trade where size > 2000
    time      |  sym    price     size
------------- | -----------------------
 01:44:56.936 |  msft   641.7307  2917
 02:32:17.036 |  msft   743.8592  3162
 07:24:26.842 |  ibm    838.6471  4006

Insert

使用Insert语句的语法如下 -

`tablename insert (values)
Insert[`tablename; values]

现在让我们举个例子来演示如何使用Insert语句 -

q)/ Insert expression example
q)`trade insert (`hsbc`apple;302.0 730.40;3020 3012;09:30:17.00409:15:00.000)
5 6
q)trade
   sym    price     size    time
------------------------------------------
  msft    743.8592  3162   02:32:17.036
  msft    641.7307  2917   01:44:56.936
  hsbc    838.2311  1492   00:25:23.210
 samsung  278.3498  1983   00:29:38.945
  ibm     838.6471  4006   07:24:26.842
  hsbc    302       3020   09:30:17.004
  apple   730.4     3012   09:15:00.000
q)/Insert another value
q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000]
']
q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000)]
,7
q)trade
   sym     price   size     time
----------------------------------------
  msft   743.8592  3162  02:32:17.036
  msft   641.7307  2917  01:44:56.936
  hsbc   838.2311  1492  00:25:23.210
 samsung 278.3498  1983  00:29:38.945
  ibm    838.6471  4006  07:24:26.842
  hsbc   302       3020  09:30:17.004
  apple  730.4     3012  09:15:00.000
 samsung 302       3333  10:30:00.000

删除 (Delete)

使用Delete语句的语法如下 -

delete columns from table
delete from table where clause

现在让我们举个例子来演示如何使用Delete语句 -

q)/Delete expression example
q)delete price from trade
   sym   size       time
-------------------------------
  msft   3162   02:32:17.036
  msft   2917   01:44:56.936
  hsbc   1492   00:25:23.210
 samsung 1983   00:29:38.945
  ibm    4006   07:24:26.842
  hsbc   3020   09:30:17.004
  apple  3012   09:15:00.000
 samsung 3333   10:30:00.000
q)delete from trade where price > 3000
   sym     price     size       time
-------------------------------------------
  msft    743.8592   3162    02:32:17.036
  msft    641.7307   2917    01:44:56.936
  hsbc    838.2311   1492    00:25:23.210
 samsung  278.3498   1983    00:29:38.945
  ibm     838.6471   4006    07:24:26.842
  hsbc    302        3020    09:30:17.004
  apple   730.4      3012    09:15:00.000
 samsung  302        3333    10:30:00.000
q)delete from trade where price > 500
  sym     price     size     time
-----------------------------------------
 samsung  278.3498  1983  00:29:38.945
  hsbc    302       3020  09:30:17.004
 samsung  302       3333  10:30:00.000

更新 (Update)

使用Update语句的语法如下 -

update column: newValue from table where ….

使用以下语法使用强制转换函数更新列的格式/数据类型 -

update column:newValue from `table where …

现在让我们举个例子来演示如何使用Update语句 -

q)/Update expression example
q)update size:9000 from trade where price > 600
  sym     price      size     time
------------------------------------------
  msft    743.8592   9000   02:32:17.036
  msft    641.7307   9000   01:44:56.936
  hsbc    838.2311   9000   00:25:23.210
 samsung  278.3498   1983   00:29:38.945
  ibm     838.6471   9000   07:24:26.842
  hsbc    302        3020   09:30:17.004
  apple   730.4      9000   09:15:00.000
 samsung  302        3333   10:30:00.000
q)/Update the datatype of a column using the cast function
q)meta trade
   c  |  t f a
----- | --------
  sym |  s
 price|  f
 size |  j
 time |  t
q)update size:`float$size from trade
  sym     price     size      time
------------------------------------------
  msft    743.8592  3162    02:32:17.036
  msft    641.7307  2917    01:44:56.936 
  hsbc    838.2311  1492    00:25:23.210
 samsung  278.3498  1983    00:29:38.945
  ibm     838.6471  4006    07:24:26.842
  hsbc    302       3020    09:30:17.004
  apple   730.4     3012    09:15:00.000
 samsung  302       3333    10:30:00.000
q)/ Above statement will not update the size column datatype permanently
q)meta trade
   c   |  t f a
------ | --------
  sym  |   s
 price |   f
 size  |   j
 time  |   t
q)/to make changes in the trade table permanently, we have do
q)update size:`float$size from `trade
`trade
q)meta trade
   c   |  t f a
------ | --------
  sym  |   s
 price |   f
 size  |   f
 time  |   t