Таблицы лежат в основе KDB +. Таблица представляет собой набор именованных столбцов, реализованных в виде словаря. q таблицы ориентированы на столбцы.
Создание таблиц
Таблицы создаются с использованием следующего синтаксиса —
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
Если в квадратных скобках нет столбцов, как в приведенных выше примерах, таблица не помечается .
Чтобы создать таблицу с ключами, мы вставляем столбец (столбцы) для ключа в квадратных скобках.
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
Внешний ключ определяет отображение из строк таблицы, в которой он определен, в строки таблицы с соответствующим первичным ключом .
Внешние ключи обеспечивают ссылочную целостность . Другими словами, попытка вставить значение внешнего ключа, которого нет в первичном ключе, потерпит неудачу.
Рассмотрим следующие примеры. В первом примере мы определим внешний ключ явно при инициализации. Во втором примере мы будем использовать отслеживание внешнего ключа, которое не предполагает каких-либо предварительных отношений между двумя таблицами.
Пример 1 — определение внешнего ключа при инициализации
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
Пример 2 — нет предопределенных отношений между таблицами
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
Общие обозначения для предопределенного внешнего ключа —
выберите ab из c, где a это внешний ключ (sym), b это a
поле в таблице первичного ключа (ind), c является
таблица внешнего ключа (торговля)
Манипулирующие столы
Давайте создадим одну торговую таблицу и проверим результат другого табличного выражения —
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 [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
Вставить
Синтаксис для использования оператора вставки следующий:
`tablename insert (values) Insert[`tablename; values]
Давайте теперь возьмем пример, чтобы продемонстрировать, как использовать оператор вставки —
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 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 column: newValue from table where ….
Используйте следующий синтаксис, чтобы обновить формат / тип данных столбца, используя функцию приведения —
update column:newValue from `table where …
Давайте теперь возьмем пример, чтобы продемонстрировать, как использовать оператор Update —