用途
DuckDB CLI 专家技能,帮助用户通过 DuckDB 命令行界面完成数据分析、SQL 查询与文件转换。可直接对数据文件执行 SQL,无需预先建库导入。
主要能力
直接读取数据文件
CSV:
duckdb -c "SELECT * FROM 'data.csv' LIMIT 10"
Parquet:
duckdb -c "SELECT * FROM 'data.parquet'"
使用 glob 读取多个文件:
duckdb -c "SELECT * FROM read_parquet('logs/*.parquet')"
JSON:
duckdb -c "SELECT * FROM read_json_auto('data.json')"
打开持久化数据库
# 创建/打开数据库
duckdb my_database.duckdb
# 只读模式
duckdb -readonly existing.duckdb
命令行参数
输出格式(作为标志):
| 标志 | 格式 |
|---|---|
| -csv | 逗号分隔 |
| -json | JSON 数组 |
| -table | ASCII 表格 |
| -markdown | Markdown 表格 |
| -html | HTML 表格 |
| -line | 每行一个值 |
执行参数:
| 参数 | 说明 |
|---|---|
| -c COMMAND | 运行 SQL 后退出 |
| -f FILENAME | 从文件运行脚本 |
| -init FILE | 使用替代 ~/.duckdbrc 的初始化文件 |
| -readonly | 以只读模式打开 |
| -echo | 执行前显示命令 |
| -bail | 遇首个错误停止 |
| -header / -noheader | 显示/隐藏列标题 |
| -nullvalue TEXT | NULL 值的显示文本 |
| -separator SEP | 列分隔符 |
数据转换
CSV 转 Parquet:
duckdb -c "COPY (SELECT * FROM 'input.csv') TO 'output.parquet' (FORMAT PARQUET)"
Parquet 转 CSV:
duckdb -c "COPY (SELECT * FROM 'input.parquet') TO 'output.csv' (HEADER, DELIMITER ',')"
JSON 转 Parquet:
duckdb -c "COPY (SELECT * FROM read_json_auto('input.json')) TO 'output.parquet' (FORMAT PARQUET)"
带过滤的转换:
duckdb -c "COPY (SELECT * FROM 'data.csv' WHERE amount > 1000) TO 'filtered.parquet' (FORMAT PARQUET)"
点命令
模式检查:
| 命令 | 说明 |
|---|---|
| .tables [pattern] | 显示表(支持 LIKE 模式) |
| .schema [table] | 显示 CREATE 语句 |
| .databases | 显示已附加的数据库 |
输出控制:
| 命令 | 说明 |
|---|---|
| .mode FORMAT | 更改输出格式 |
| .output file | 将输出发送到文件 |
| .once file | 下一次输出到文件 |
| .headers on/off | 显示/隐藏列标题 |
| .separator COL ROW | 设置分隔符 |
查询:
| 命令 | 说明 |
|---|---|
| .timer on/off | 显示执行时间 |
| .echo on/off | 执行前显示命令 |
| .bail on/off | 出错时停止 |
| .read file.sql | 从文件运行 SQL |
编辑:
| 命令 | 说明 |
|---|---|
| .edit 或 \e | 在外部编辑器中打开查询 |
| .help [pattern] | 显示帮助 |
输出格式(共 18 种)
数据导出:
- csv - 逗号分隔,适合电子表格
- tabs - 制表符分隔
- json - JSON 数组
- jsonlines - 换行分隔 JSON(流式)
可读格式:
- duckbox(默认)- 带 Unicode 制表符的美观 ASCII
- table - 简单 ASCII 表格
- markdown - 用于文档
- html - HTML 表格
- latex - 用于学术论文
专用格式:
- insert TABLE - SQL INSERT 语句
- column - 可调宽度的列
- line - 每行一个值
- list - 管道分隔
- trash - 丢弃输出
键盘快捷键(macOS/Linux)
导航:
| 快捷键 | 操作 |
|---|---|
| Home / End | 行首/行尾 |
| Ctrl+Left/Right | 按词跳转 |
| Ctrl+A / Ctrl+E | 缓冲区开头/结尾 |
历史:
| 快捷键 | 操作 |
|---|---|
| Ctrl+P / Ctrl+N | 上一条/下一条命令 |
| Ctrl+R | 搜索历史 |
| Alt+< / Alt+> | 历史首条/末条 |
编辑:
| 快捷键 | 操作 |
|---|---|
| Ctrl+W | 向后删除单词 |
| Alt+D | 向前删除单词 |
| Alt+U / Alt+L | 单词转大写/小写 |
| Ctrl+K | 删除到行尾 |
自动补全:
| 快捷键 | 操作 |
|---|---|
| Tab | 自动补全/下一个建议 |
| Shift+Tab | 上一个建议 |
| Esc+Esc | 撤销自动补全 |
自动补全
按 Tab 激活上下文感知自动补全:
- 关键字 - SQL 命令
- 表名 - 数据库对象
- 列名 - 字段与函数
- 文件名 - 路径补全
数据库操作
从文件创建表:
CREATE TABLE sales AS SELECT * FROM 'sales_2024.csv';
插入数据:
INSERT INTO sales SELECT * FROM 'sales_2025.csv';
导出表:
COPY sales TO 'backup.parquet' (FORMAT PARQUET);
分析示例
快速统计:
SELECT
COUNT(*) as count,
AVG(amount) as average,
SUM(amount) as total
FROM 'transactions.csv';
分组:
SELECT
category,
COUNT(*) as count,
SUM(amount) as total
FROM 'data.csv'
GROUP BY category
ORDER BY total DESC;
跨文件连接:
SELECT a.*, b.name
FROM 'orders.csv' a
JOIN 'customers.parquet' b ON a.customer_id = b.id;
描述数据:
DESCRIBE SELECT * FROM 'data.csv';
管道与标准输入
# 从标准输入读取
cat data.csv | duckdb -c "SELECT * FROM read_csv('/dev/stdin')"
# 管道输出到其他命令
duckdb -csv -c "SELECT * FROM 'data.parquet'" | head -20
# 写入标准输出
duckdb -c "COPY (SELECT * FROM 'data.csv') TO '/dev/stdout' (FORMAT CSV)"
配置
在 ~/.duckdbrc 中保存常用设置:
.timer on
.mode duckbox
.maxrows 50
.highlight on
语法高亮颜色:
.keyword green
.constant yellow
.comment brightblack
.error red
外部编辑器
在编辑器中打开复杂查询:
.edit
编辑器选择顺序:DUCKDB_EDITOR → EDITOR → VISUAL → vi
安全模式
限制文件访问的安全模式。启用后:
- 无外部文件访问
- 禁用 .read、.output、.import、.sh 等
- 同一会话中无法禁用
使用方式
通过命令行调用 duckdb,使用 -c 直接执行 SQL,或进入交互式界面使用点命令与快捷键。可结合管道与标准输入输出与其他命令协作。
适用场景
- 对 CSV、Parquet、JSON 文件进行快速 SQL 查询与分析
- 数据文件格式转换(CSV/Parquet/JSON 互转)
- 打开与查询持久化 DuckDB 数据库
- 跨文件连接、分组统计、数据描述
- 将查询结果导出为多种格式
限制
- 安全模式启用后无法在同一会话中禁用
- WSL2 在某些 Ubuntu 版本上可能显示不正确的 memory_limit 值
- 其余限制暂未提供