下面我将从几个方面为您详细介绍kdb+的命令:

- 核心概念:q语言是命令的集合
- 基本分类和常用命令
- 实用命令和函数
- 重要提示:q是区分大小写的
核心概念:q语言是命令的集合
在q中,几乎所有的操作都是通过函数来完成的,这些函数既可以由语言内置,也可以由用户自定义,在q的交互式环境(q console)中,你输入的任何有效表达式都会被执行,其结果会立即显示。
42 不仅仅是一个数字,它本身也是一个函数,调用它会返回自身。 是一个加法函数。
q会话示例:
q)42 / 输入数字42,按回车 42 / q返回结果42 q)2+3 / 调用加法函数,参数是2和3 5 / 返回结果5 q)first 10 1 20 / 调用first函数,获取列表10 1 20的第一个元素 10
基本分类和常用命令
q的命令(函数)通常非常简洁,很多符号都承载了多重含义(多态),以下是按功能分类的一些核心命令。

A. 数据类型 和 列表
q的核心数据结构是列表,所有数据,无论是单个数字、字符还是复杂对象,最终都以列表的形式存在。
| 命令/符号 | 描述 | 示例 |
|---|---|---|
int, float, boolean, char, symbol, date, timestamp, timespan, month, datetime, minute, second |
基本数据类型 | 42 (int), 14 (float), 1b (true), a (char), `ibm (symbol), 10.27 (date) |
| enlist x | 创建只包含x的单项列表 | enlist 10 -> (10, ) |
| list x y z ... | 创建列表(用空格分隔元素) | 10 20 30 -> 10 20 30 |
x, y |
连接两个列表 | 10 20, 30 40 -> 10 20 30 40 |
x#y |
从y中取前x个元素,或重复y x次 | 2#10 20 30 -> 10 203#10 -> 10 10 10 |
count x |
返回列表x的元素个数 | count 10 20 30 -> 3 |
first x, last x |
获取列表的第一个或最后一个元素 | first 10 20 30 -> 10 |
x[i] |
获取列表的第i个元素 (索引从0开始) | 10 20 30[1] -> 20 |
x[i;j] |
获取嵌套列表的元素 | (10 20; 30 40)[0;1] -> 20 |
til n |
生成一个从0到n-1的列表 | til 5 -> 0 1 2 3 4 |
B. 算术和比较运算符
这些运算符是原子操作,对列表的每个元素分别进行计算。
| 命令/符号 | 描述 | 示例 |
|---|---|---|
| , , , | 加、减、乘、除 | 10 20 30 + 1 -> 11 21 31 |
div, mod |
整除、取模 | 10 div 3 -> 310 mod 3 -> 1 |
neg x |
取负 | neg 10 -> -10 |
, <>, <, >, <=, >= |
等于、不等于、小于、大于、小于等于、大于等于 | 10 20 30 = 20 -> 0b 1b 0b (返回布尔列表) |
C. 应用和修改
| 命令/符号 | 描述 | 示例 |
|---|---|---|
f/x |
对列表x的每个元素应用函数f(一元应用) | neg / 10 20 30 -> -10 -20 -30 |
x f/y |
对列表y的元素从左到右累积应用函数f(二元折叠) | + / 1 2 3 4 -> 10 (求和)* / 1 2 3 4 -> 24 (求积) |
x f'y |
对列表y的元素从右到左累积应用函数f | \ 1 2 3 4->1 - (2 - (3 - 4))->2` |
x (f;y;z) |
对列表x的每个元素应用函数f,参数为y,z(多元应用) | 10 20 30 (+;5) -> 15 25 35 |
x f/: y |
对x中的每个元素和y中的每个元素应用f(笛卡尔积) | 10 20 (+/:) til 2 -> (10 11; 20 21) |
set |
给变量赋值 | set a: 42 或直接 a: 42 |
| , | 赋值, 是局部赋值, 是全局赋值 | a: 10 (局部)b:: 20 (全局) |
D. 条件和逻辑
| 命令/符号 | 描述 | 示例 |
|---|---|---|
if, then, else |
条件判断 | if[2 > 3; "yes"; "no"] -> "no" |
and, or, not |
逻辑与、或、非 | 1b and 0b -> 0bnot 1b -> 0b |
x ? y |
查找y在x中的位置(第一个匹配项的索引) | 10 20 30 20 ? 20 -> 1 |
x in y |
判断x是否在y中(返回布尔值) | 20 in 10 20 30 -> 1b |
E. 字典 和 表
字典是kdb+的核心数据结构,表可以看作是列名相同的字典列表。
| 命令/符号 | 描述 | 示例 |
|---|---|---|
enlist[d] |
创建只有一个键值对的字典 | enlist[name]!John`` -> ``name|John`` |
`key1`key2 ! (val1; val2) | 创建字典 | `name`age ! (`John; 42) -> name| `John`<br>age| 42 |
||
d[key]| 获取字典中key对应的值 | ``(nameage ! (John; 42))[name]`` -> ``John`` |
||
d[key]: new_val| 修改字典中key对应的值 |d[name]:Jane` |
||
xkey y |
用x的列名创建表y | ([] sym:ibmgoog; price:100 200) |
select, update, delete |
表查询/修改操作 | select from t where price > 150update price: price * 1.1 from tdelete from t where price < 50 |
exec |
从表中提取指定列 | exec price from t -> 100 200 |
by |
与select或update配合使用,进行分组聚合 |
select sum price by sym from t |
实用命令和函数
这些命令主要用于系统管理、调试和信息查看。

| 命令 | 描述 |
|---|---|
\l <filename> |
加载一个q脚本文件(.q)或数据库(.q 或 .d) |
\s |
显示当前工作空间中的所有变量和函数 |
\v |
显示当前工作空间中的所有变量 |
\t <expression> |
执行表达式并返回其耗时(纳秒级) |
\p |
显示或设置默认端口号 |
\z |
显示或设置时区 |
\D |
显示或设置调试级别 |
\g |
显示或设置图形化选项 |
show x |
打印x的值,常用于调试 |
value x |
执行一个字符串形式的q代码 |
string x |
将x转换为字符串 |
parse x |
将字符串x解析为q数据 |
count each t |
对表t的每一列应用count函数,得到每列的元素个数 |
desc x, asc x |
对列表x进行降序或升序排序 |
重要提示:q是区分大小写的
这一点至关重要,也是初学者常犯的错误。
ibm和IBM是两个完全不同的符号。MyFunc和myfunc是两个不同的函数。Tab和tab是两个不同的变量。
kdb+/q的命令体系设计哲学是简洁、高效、函数化,要熟练掌握它,最好的方式就是:
- 打开q控制台,亲手尝试每一个命令。
- 从列表和基本运算开始,理解原子操作的概念。
- 深入学习字典和表,它们是处理结构化数据的基石。
- 练习查询,
select,update,exec,by是日常数据分析的核心。
希望这份详细的命令列表对您有所帮助!如果您有更具体的问题,比如如何实现某个功能,可以随时提出。
