Ngôn ngữ Q - Bảng
Bảng là trung tâm của kdb +. Bảng là một tập hợp các cột được đặt tên được triển khai như một từ điển.q tables được định hướng theo cột.
Tạo bảng
Các bảng được tạo bằng cú pháp sau:
q)trade:([]time:();sym:();price:();size:())
q)trade
time sym price size
-------------------
Trong ví dụ trên, chúng tôi chưa chỉ định loại của mỗi cột. Điều này sẽ được thiết lập bởi lần chèn đầu tiên vào bảng.
Một cách khác, chúng ta có thể chỉ định loại cột khi khởi tạo -
q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())
Hoặc chúng ta cũng có thể xác định các bảng không trống -
q)trade:([]sym:(`a`b);price:(1 2))
q)trade
sym price
-------------
a 1
b 2
Nếu không có cột nào trong dấu ngoặc vuông như trong các ví dụ trên, bảng unkeyed.
Để tạo ra một keyed table, chúng tôi chèn (các) cột cho khóa trong dấu ngoặc vuông.
q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())
q)trade
sym | time price size
----- | ---------------
Người ta cũng có thể xác định các loại cột bằng cách đặt các giá trị là danh sách rỗng của nhiều loại khác nhau -
q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)
Nhận thông tin bảng
Hãy tạo một bảng giao dịch -
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
Phím chính và bàn có khóa
Bàn phím
Bảng có khóa là một từ điển ánh xạ từng hàng trong bảng gồm các khóa duy nhất đến một hàng tương ứng trong bảng giá trị. Hãy để chúng tôi lấy một ví dụ -
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
Bây giờ, hãy tạo một bảng có khóa đơn giản chứa eid làm khóa,
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
A foreign key xác định ánh xạ từ các hàng của bảng trong đó nó được xác định thành các hàng của bảng có primary key.
Khóa ngoại cung cấp referential integrity. Nói cách khác, nỗ lực chèn giá trị khóa ngoại không có trong khóa chính sẽ không thành công.
Hãy xem xét các ví dụ sau. Trong ví dụ đầu tiên, chúng tôi sẽ xác định khóa ngoại một cách rõ ràng khi khởi tạo. Trong ví dụ thứ hai, chúng tôi sẽ sử dụng tính năng theo đuổi khóa ngoại không giả định bất kỳ mối quan hệ trước nào giữa hai bảng.
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)
Để sử dụng tính năng theo đuổi khóa ngoại, chúng ta phải tạo một bảng để khóa vào khu vực.
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
Ký hiệu chung cho khóa ngoại xác định trước -
chọn ab từ c trong đó a là khóa ngoại (sym), b là a
trong bảng khóa chính (ind), c là
bảng khóa ngoại (thương mại)
Thao tác bảng
Hãy tạo một bảng giao dịch và kiểm tra kết quả của biểu thức bảng khác nhau -
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
Bây giờ chúng ta hãy xem xét các câu lệnh được sử dụng để thao tác các bảng bằng cách sử dụng q ngôn ngữ.
Lựa chọn
Cú pháp sử dụng Select tuyên bố như sau:
select [columns] [by columns] from table [where clause]
Bây giờ chúng ta hãy lấy một ví dụ để minh họa cách sử dụng câu lệnh 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
Chèn
Cú pháp để sử dụng Insert tuyên bố như sau:
`tablename insert (values)
Insert[`tablename; values]
Bây giờ chúng ta hãy lấy một ví dụ để minh họa cách sử dụng câu lệnh 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
Xóa bỏ
Cú pháp sử dụng Delete tuyên bố như sau:
delete columns from table
delete from table where clause
Bây giờ chúng ta hãy lấy một ví dụ để minh họa cách sử dụng câu lệnh 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
Cập nhật
Cú pháp để sử dụng Update tuyên bố như sau:
update column: newValue from table where ….
Sử dụng cú pháp sau để cập nhật định dạng / kiểu dữ liệu của cột bằng cách sử dụng hàm truyền -
update column:newValue from `table where …
Bây giờ chúng ta hãy lấy một ví dụ để minh họa cách sử dụng Update tuyên bố -
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