Linguagem Q - Tabela
As tabelas são o cerne do kdb +. Uma tabela é uma coleção de colunas nomeadas implementadas como um dicionário.q tables são orientados por colunas.
Criação de tabelas
As tabelas são criadas usando a seguinte sintaxe -
q)trade:([]time:();sym:();price:();size:())
q)trade
time sym price size
-------------------
No exemplo acima, não especificamos o tipo de cada coluna. Isso será definido pela primeira inserção na tabela.
Outra forma, podemos especificar o tipo de coluna na inicialização -
q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())
Ou também podemos definir tabelas não vazias -
q)trade:([]sym:(`a`b);price:(1 2))
q)trade
sym price
-------------
a 1
b 2
Se não houver colunas entre colchetes, como nos exemplos acima, a tabela é unkeyed.
Para criar um keyed table, inserimos a (s) coluna (s) da chave entre colchetes.
q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())
q)trade
sym | time price size
----- | ---------------
Também é possível definir os tipos de coluna configurando os valores como listas nulas de vários tipos -
q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)
Obtendo Informações da Tabela
Vamos criar uma mesa de negociação -
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
Chaves primárias e tabelas codificadas
Mesa Chaveada
Uma tabela com chave é um dicionário que mapeia cada linha em uma tabela de chaves exclusivas para uma linha correspondente em uma tabela de valores. Vamos dar um exemplo -
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
Agora crie uma tabela com chave simples contendo eid como chave,
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
UMA foreign key define um mapeamento das linhas da tabela em que está definido para as linhas da tabela com o correspondente primary key.
Chaves estrangeiras fornecem referential integrity. Em outras palavras, uma tentativa de inserir um valor de chave estrangeira que não esteja na chave primária falhará.
Considere os seguintes exemplos. No primeiro exemplo, definiremos uma chave estrangeira explicitamente na inicialização. No segundo exemplo, usaremos a busca de chave estrangeira, que não assume nenhuma relação anterior entre as duas tabelas.
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)
Para usar a busca de chave estrangeira, devemos criar uma tabela para digitar no setor.
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
Notação geral para uma chave estrangeira predefinida -
selecione ab de c onde a é a chave estrangeira (sym), b é a
campo na tabela de chave primária (ind), c é o
tabela de chave estrangeira (comércio)
Manipulando tabelas
Vamos criar uma tabela de negociação e verificar o resultado de diferentes expressões de tabela -
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
Vamos agora dar uma olhada nas instruções que são usadas para manipular tabelas usando q língua.
Selecione
A sintaxe para usar um Select declaração é a seguinte -
select [columns] [by columns] from table [where clause]
Vamos agora dar um exemplo para demonstrar como usar a instrução 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
Inserir
A sintaxe para usar um Insert declaração é a seguinte -
`tablename insert (values)
Insert[`tablename; values]
Vamos agora dar um exemplo para demonstrar como usar a instrução 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
Excluir
A sintaxe para usar um Delete declaração é a seguinte -
delete columns from table
delete from table where clause
Vamos agora dar um exemplo para demonstrar como usar a instrução 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
Atualizar
A sintaxe para usar um Update declaração é a seguinte -
update column: newValue from table where ….
Use a seguinte sintaxe para atualizar o formato / tipo de dados de uma coluna usando a função de conversão -
update column:newValue from `table where …
Vamos agora dar um exemplo para demonstrar como usar Update declaração -
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