Q Language - Table
表是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