Featured image of post DuckDB 完全指南:从入门到精通的数据分析利器

DuckDB 完全指南:从入门到精通的数据分析利器

最全面的 DuckDB 教程,覆盖安装配置、SQL 查询、Python 集成、性能优化、数据清洗、BI 可视化、与 Pandas/SQLite/ClickHouse 对比、生产部署等全部内容,助你从零成为 DuckDB 专家。

什么是 DuckDB?

DuckDB 是一个开源的、嵌入式的 SQL OLAP 数据库管理系统。它专门为数据分析场景设计,采用列式存储引擎和向量化执行技术,在分析型查询上比传统行式数据库(如 SQLite)快 10-100 倍。

DuckDB 的 5 大核心优势

  1. 嵌入式运行:无需安装数据库服务器,直接嵌入到应用程序进程中
  2. 列式存储:分析查询只读取需要的列,大幅减少 I/O
  3. 向量化执行:批量处理数据,充分利用 CPU cache
  4. 完整 SQL 支持:支持窗口函数、CTE、GROUPING SETS 等高级 SQL 特性
  5. 多语言绑定:Python、R、Java、Node.js、C/C++ 均支持

适用场景

场景推荐度说明
数据分析与探索⭐⭐⭐秒级响应百万行数据查询
ETL 数据处理⭐⭐⭐零配置的数据清洗管道
BI 报表引擎⭐⭐⭐替代传统 BI 工具的后端
嵌入应用⭐⭐⭐作为应用的嵌入式分析引擎
教学工具⭐⭐⭐零安装上手 SQL 学习
OLTP 事务不适合高并发写入场景

安装 DuckDB

MacOS

brew install duckdb

Linux (Ubuntu/Debian)

curl https://install.duckdb.org | sh

Windows

下载最新的 Windows 版本安装包,或使用:

winget install DuckDB.cli

Python (pip)

pip install duckdb

验证安装

duckdb --version
# v1.5.3

DuckDB 的 SQL 查询入门

创建表与插入数据

CREATE TABLE sales (
    product VARCHAR,
    category VARCHAR,
    amount DECIMAL(10,2),
    sale_date DATE
);

INSERT INTO sales VALUES
    ('笔记本电脑', '电子产品', 5999.00, '2026-01-15'),
    ('机械键盘', '外设', 399.00, '2026-01-16'),
    ('显示器', '电子产品', 2499.00, '2026-01-17');

基本查询

-- 查询所有数据
SELECT * FROM sales;

-- 聚合查询
SELECT category, COUNT(*) AS count, SUM(amount) AS total
FROM sales
GROUP BY category
ORDER BY total DESC;

-- 窗口函数
SELECT product, amount,
       RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;

DuckDB 独有的 SQL 扩展

QUALIFY 子句:直接在窗口函数后过滤

SELECT product, amount,
       RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales
QUALIFY rank <= 3;

GROUP BY ALL:自动按 SELECT 中的非聚合列分组

SELECT category, product, SUM(amount)
FROM sales
GROUP BY ALL;

COLUMNS 表达式:批量选择/排除列

-- 排除某些列
SELECT * EXCLUDE (sale_date) FROM sales;

-- 批量替换列
SELECT REPLACE(amount * 1.1 AS amount) FROM sales;

DuckDB Python 集成

安装与连接

import duckdb

# 内存数据库
conn = duckdb.connect()

# 持久化数据库
conn = duckdb.connect('my_database.duckdb')

执行 SQL 查询

result = conn.execute('SELECT 1 + 1').fetchall()
print(result)  # [(2,)]

Pandas DataFrame 集成

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
result = conn.execute('''
    SELECT a, SUM(b) as total
    FROM df
    GROUP BY a
''').fetchdf()

直接查询文件

# 查询 CSV 文件
conn.execute("SELECT * FROM 'data.csv'").fetchdf()

# 查询 Parquet 文件
conn.execute("SELECT * FROM 'data.parquet'").fetchdf()

# 查询 JSON 文件
conn.execute("SELECT * FROM 'data.json'").fetchdf()

性能优化技巧

1. 使用 Parquet 格式

Parquet 列式存储配合 DuckDB 的列式引擎,查询速度比 CSV 快 10-50 倍。

2. 分区裁剪

SELECT * FROM read_parquet('data/*.parquet', hive_partitioning=true)
WHERE year = 2026 AND month = 5;

3. 内存管理

-- 设置最大内存
SET memory_limit = '4GB';

-- 设置线程数
SET threads = 4;

4. 使用物化视图

CREATE VIEW monthly_sales AS
SELECT category, SUM(amount) AS total
FROM sales
GROUP BY category;

DuckDB vs 其他工具

特性DuckDBSQLitePandasClickHouse
分析查询⭐⭐⭐⭐⭐⭐⭐⭐
单行查询⭐⭐⭐⭐⭐⭐⭐⭐⭐
内存效率⭐⭐⭐⭐⭐⭐⭐⭐⭐
部署难度零配置零配置需环境需服务器
Python 集成⭐⭐⭐⭐⭐⭐⭐⭐
适合场景数据分析本地存储数据清洗实时分析

与 AI/LLM 结合

DuckDB 可以作为 AI Agent 的「数据大脑」:

  1. 自然语言查询数据库:AI Agent 分析用户问题 → 生成 SQL → DuckDB 执行 → 返回结果
  2. RAG 数据准备:使用 DuckDB 清洗和预处理大规模文档数据
  3. ML 推理:通过 infera 扩展直接在数据库内运行机器学习模型

生产部署建议

Docker 部署

docker run -v $(pwd)/data:/data -p 5432:5432 duckdb/duckdb

资源限制

SET memory_limit = '4GB';
SET threads = 4;
SET temp_directory = '/tmp/duckdb_tmp';

持久化与备份

  • 数据库文件默认以 .duckdb 扩展名保存
  • 定期备份数据库文件即可
  • 支持导出为 Parquet 文件作为备份格式

下一步学习

📺 Watch video tutorials → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials

使用 Hugo 构建
主题 StackJimmy 设计