DuckDB 是什么?为什么它值得学?
DuckDB 是一个嵌入式列式数据库,专门为分析型查询(OLAP)而生。它不像 MySQL/PostgreSQL 那样需要安装服务器、配置端口、管理用户——你只需要一个文件就能启动。
一句话说清: DuckDB 就是把 Excel 的易用性 + 数据库的查询能力 + 列式存储的性能,打包成一个不到 30MB 的可执行文件。
谁应该学 DuckDB?
- 数据分析师:不想学 Pandas 复杂的 API,用 SQL 直接分析 CSV/Parquet
- 数据工程师:快速跑 ETL、做数据质量检查,不需要搭 Spark 集群
- Python 开发者:在 Jupyter 里用 DuckDB 代替 Pandas,处理超过内存的数据
- 后端开发者:嵌入 DuckDB 做本地分析,比 SQLite 快 10-100 倍(分析场景)
第一步:安装 DuckDB
Windows 安装
# 方式一:下载单个 exe 文件(推荐)
# 访问 https://duckdb.org/download/ → 下载 Windows 版
# 解压后得到一个 duckdb.exe,双击即可运行
# 方式二:使用 winget
winget install DuckDB.cli
# 方式三:使用 Python pip(自动安装 CLI)
pip install duckdb duckdb-cli
macOS 安装
# 方式一:Homebrew(推荐)
brew install duckdb
# 方式二:直接下载 CLI
# 访问 https://duckdb.org/download/ → 下载 macOS 版
Linux 安装
# 方式一:一行命令安装
curl -sL https://install.duckdb.org | sh
# 方式二:Debian/Ubuntu
sudo apt install duckdb
# 方式三:直接下载二进制
wget https://github.com/duckdb/duckdb/releases/download/v1.2.0/duckdb_cli-linux-amd64.zip
unzip duckdb_cli-linux-amd64.zip
./duckdb
Python 安装(最常用方式)
pip install duckdb
安装完成后,在 Python 中验证:
import duckdb
print(duckdb.__version__)
# 输出: 1.2.0(或更新的版本)
第二步:第一个 DuckDB 查询
启动 CLI
# 直接进入内存数据库
duckdb
# 或者指定文件作为数据库
duckdb my_first_db.duckdb
第一个 SQL 查询
SELECT 'Hello, DuckDB!' AS greeting;
输出:
┌─────────────────┐
│ greeting │
│ varchar │
├─────────────────┤
│ Hello, DuckDB! │
└─────────────────┘
创建表和插入数据
-- 创建一个简单的销售表
CREATE TABLE sales (
product VARCHAR,
category VARCHAR,
amount DECIMAL(10,2),
sale_date DATE
);
-- 插入数据
INSERT INTO sales VALUES
('MacBook Pro', 'Electronics', 1999.00, '2026-01-15'),
('AirPods', 'Electronics', 249.00, '2026-01-16'),
('Desk Chair', 'Furniture', 899.00, '2026-01-17'),
('Monitor', 'Electronics', 599.00, '2026-01-18');
-- 按分类汇总
SELECT
category,
COUNT(*) AS orders,
SUM(amount) AS total,
AVG(amount) AS avg_amount
FROM sales
GROUP BY category;
第三步:直接查询文件(DuckDB 最强大的功能)
DuckDB 最大的优势是不需要导入数据——直接查询 CSV、Parquet、JSON 文件。
查询 CSV 文件
-- 直接查询 CSV,无需导入
SELECT * FROM 'sales_2026.csv' LIMIT 10;
-- 带聚合的查询
SELECT
region,
COUNT(*) AS transactions,
SUM(revenue) AS total_revenue
FROM 'sales_data.csv'
GROUP BY region
ORDER BY total_revenue DESC;
查询 Parquet 文件
-- Parquet 是列式存储格式,DuckDB 的绝配
SELECT
date_trunc('month', order_date) AS month,
product_category,
SUM(order_amount) AS monthly_revenue
FROM 'orders_2026.parquet'
WHERE order_date >= '2026-01-01'
GROUP BY ALL
ORDER BY month;
查询 JSON 文件
-- 直接查询 JSON Lines 文件
SELECT
json_extract(data, '$.user.name') AS user_name,
json_extract(data, '$.action') AS action
FROM 'activity_log.jsonl'
LIMIT 20;
第四步:Python 集成(最常用)
基础用法
import duckdb
# 方式一:直接执行 SQL
result = duckdb.sql("SELECT 'Hello World' AS greeting")
print(result)
# 方式二:创建连接
con = duckdb.connect('my_database.duckdb')
con.sql("CREATE TABLE users AS SELECT * FROM 'users.csv'")
con.sql("SELECT COUNT(*) FROM users").show()
和 Pandas 互操作
import pandas as pd
import duckdb
# DataFrame → DuckDB 查询
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'salary': [80000, 95000, 120000]
})
result = duckdb.sql("""
SELECT name, salary,
AVG(salary) OVER () AS company_avg,
salary - AVG(salary) OVER () AS diff
FROM df
""")
print(result)
第五步:常用操作速查
导入导出数据
-- CSV 导出
COPY (SELECT * FROM sales) TO 'sales_export.csv' WITH (HEADER true);
-- Parquet 导出
COPY orders TO 'orders.parquet' (FORMAT PARQUET);
-- 从 CSV 导入到表
CREATE TABLE customers AS
SELECT * FROM read_csv('customers_2026.csv',
header = true,
auto_detect = true
);
连接多个文件
-- 通配符读取多个 CSV
SELECT * FROM 'data_2026_*.csv';
-- 合并多个 Parquet 文件
SELECT * FROM 'sales/*.parquet';
-- 交叉查询不同数据库
ATTACH 'inventory.db' AS inv;
SELECT o.*, i.stock_level
FROM orders o
JOIN inv.inventory i ON o.sku = i.sku;

下一步学什么?
- DuckDB 实战 EP2:5分钟导入10GB数据 → 学习大规模数据的读取技巧
- DuckDB 实战 EP3:SQL 高级技巧 → 窗口函数、CTE、Pivot
- DuckDB + Python 最佳搭档 → 用 DuckDB 做特征工程和 ML 流水线
- 构建你的第一个 DuckDB 数据产品 → 在线速查表实战
📘 博客: https://duckdblab.org 📕 书籍: Build Data SaaS with DuckDB & Streamlit #DuckDB #入门教程 #数据分析 #SQL教程