Q Language - Tabella
Le tabelle sono il cuore di kdb +. Una tabella è una raccolta di colonne denominate implementate come dizionario.q tables sono orientati alle colonne.
Creazione di tabelle
Le tabelle vengono create utilizzando la seguente sintassi:
q)trade:([]time:();sym:();price:();size:())
q)trade
time sym price size
-------------------
Nell'esempio precedente, non abbiamo specificato il tipo di ciascuna colonna. Questo verrà impostato dal primo inserimento nella tabella.
Un altro modo, possiamo specificare il tipo di colonna durante l'inizializzazione -
q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())
Oppure possiamo anche definire tabelle non vuote -
q)trade:([]sym:(`a`b);price:(1 2))
q)trade
sym price
-------------
a 1
b 2
Se non ci sono colonne all'interno delle parentesi quadre come negli esempi precedenti, la tabella è unkeyed.
Per creare un file keyed table, inseriamo la / e colonna / e per la chiave tra parentesi quadre.
q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())
q)trade
sym | time price size
----- | ---------------
Si possono anche definire i tipi di colonna impostando i valori come elenchi nulli di vari tipi -
q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)
Ottenere informazioni sulla tabella
Creiamo una tabella di scambio -
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
Chiavi primarie e tabelle con chiave
Tabella con chiave
Una tabella con chiave è un dizionario che mappa ogni riga di una tabella di chiavi univoche a una riga corrispondente in una tabella di valori. Facciamo un esempio:
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
Ora crea una semplice tabella con chiave contenente eid come chiave,
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
UN foreign key definisce una mappatura dalle righe della tabella in cui è definita alle righe della tabella con il corrispondente primary key.
Forniscono chiavi esterne referential integrity. In altre parole, un tentativo di inserire un valore di chiave esterna che non è nella chiave primaria fallirà.
Considera i seguenti esempi. Nel primo esempio, definiremo esplicitamente una chiave esterna durante l'inizializzazione. Nel secondo esempio, useremo l'inseguimento di chiavi esterne che non presuppone alcuna relazione precedente tra le due tabelle.
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)
Per utilizzare l'inseguimento di chiavi esterne, dobbiamo creare una tabella da inserire nel settore.
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
Notazione generale per una chiave esterna predefinita -
seleziona ab da c dove a è la chiave esterna (sym), b è a
nella tabella delle chiavi primarie (ind), c è il
tabella chiave esterna (commercio)
Manipolazione di tabelle
Creiamo una tabella di scambio e controlliamo il risultato di diverse espressioni di tabella -
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
Diamo ora uno sguardo alle istruzioni che vengono utilizzate per manipolare le tabelle usando q linguaggio.
Selezionare
La sintassi per utilizzare un file Select l'affermazione è la seguente:
select [columns] [by columns] from table [where clause]
Facciamo ora un esempio per dimostrare come utilizzare l'istruzione 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
Inserire
La sintassi per utilizzare un file Insert l'affermazione è la seguente:
`tablename insert (values)
Insert[`tablename; values]
Facciamo ora un esempio per dimostrare come utilizzare l'istruzione 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
Elimina
La sintassi per utilizzare un file Delete l'affermazione è la seguente:
delete columns from table
delete from table where clause
Facciamo ora un esempio per dimostrare come utilizzare l'istruzione 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
Aggiornare
La sintassi per utilizzare un file Update l'affermazione è la seguente:
update column: newValue from table where ….
Utilizzare la seguente sintassi per aggiornare il formato / tipo di dati di una colonna utilizzando la funzione cast:
update column:newValue from `table where …
Facciamo ora un esempio per dimostrare come utilizzare Update dichiarazione -
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