DuckDB SQL语法全解析:从基础查询到高级窗口函数
【免费下载链接】duckdb 项目地址: https://gitcode.com/gh_mirrors/duc/duckdb
你是否在处理数据分析时遇到SQL性能瓶颈?是否因复杂查询语法而望而却步?DuckDB作为高性能分析型数据库,提供了远超基础SQL的丰富功能。本文将从基础查询语法入手,逐步深入到高级窗口函数的应用,帮助你掌握DuckDB SQL的核心能力,提升数据分析效率。读完本文,你将能够独立编写高效的DuckDB查询,处理复杂的数据聚合与分析任务。
DuckDB简介
DuckDB是一款高性能分析型数据库系统,设计目标是快速、可靠、便携且易于使用。它支持复杂的SQL方言,包括任意嵌套的相关子查询、窗口函数、排序规则以及复杂数据类型(数组、结构体、映射)。DuckDB可作为独立CLI应用程序使用,也提供Python、R、Java等多种语言的客户端。
官方文档:README.md
基础查询语法
连接数据库
使用DuckDB Python API连接内存数据库:
import duckdb
conn = duckdb.connect() # 连接到内存临时数据库
创建表与插入数据
CREATE TABLE test_table (i INTEGER, j STRING);
INSERT INTO test_table VALUES (1, 'one'), (2, 'two'), (3, 'three');
也可使用参数化查询:
conn.execute("INSERT INTO test_table VALUES (?, ?)", [4, 'four'])
简单查询
基础SELECT语句:
SELECT * FROM test_table WHERE i > 1;
查询结果:
| i | j |
|---|---|
| 2 | two |
| 3 | three |
| 4 | four |
Python中执行查询并获取结果:
df = conn.execute("SELECT * FROM test_table").fetchdf()
print(df)
示例代码:examples/python/duckdb-python.py
数据导入
DuckDB支持直接从CSV和Parquet文件导入数据,无需预先创建表结构:
SELECT * FROM 'data/csv/dates.csv'; -- 查询CSV文件
SELECT * FROM 'data/parquet-testing/simple.parquet'; -- 查询Parquet文件
创建表并导入CSV数据:
CREATE TABLE x AS SELECT * FROM read_csv_auto('data/csv/tpcds_14.csv');
数据样例:data/csv/dates.csv
高级查询功能
聚合函数
DuckDB提供丰富的聚合函数,如SUM、AVG、COUNT等:
SELECT id4, avg(v1) AS v1, avg(v2) AS v2 FROM x_group GROUP BY id4;
示例来源:benchmark/h2oai/group/queries/q04.sql
连接查询
支持INNER JOIN、LEFT JOIN等多种连接类型:
SELECT x.*, medium.id1 AS medium_id1, medium.id4 AS medium_id4
FROM x JOIN medium USING (id2);
示例来源:benchmark/h2oai/join/queries/q02.sql
窗口函数
窗口函数允许在查询结果集的子集上执行计算,而无需将结果集分组为单个输出行。基本语法:
SELECT id6, v3 AS largest2_v3
FROM (
SELECT id6, v3,
row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) AS order_v3
FROM x_group
WHERE v3 IS NOT NULL
) sub_query
WHERE order_v3 <= 2;
此查询使用ROW_NUMBER()窗口函数为每个id6分组中的v3值分配排名,并选择前两名。
示例来源:benchmark/h2oai/group/queries/q08.sql
复杂数据类型
DuckDB支持数组、结构体等复杂数据类型。创建包含数组的表:
CREATE TABLE users (id INTEGER, name STRING, tags STRING[]);
INSERT INTO users VALUES (1, 'Alice', ['data', 'analysis']);
查询数组元素:
SELECT name, tags[1] FROM users;
实用查询示例
计算中位数与标准差
SELECT id4, id5,
quantile_cont(v3, 0.5) AS median_v3,
stddev(v3) AS sd_v3
FROM x_group
GROUP BY id4, id5;
示例来源:benchmark/h2oai/group/queries/q06.sql
日期范围查询
SELECT date_column
FROM dates
WHERE date_column BETWEEN '2023-01-01' AND '2023-12-31';
数据来源:data/csv/dates.csv
性能优化建议
- 使用合适的数据类型减少内存占用
- 对大表查询使用分区表
- 利用DuckDB的列存储特性,只选择需要的列
- 复杂查询考虑使用CTE(Common Table Expressions)提高可读性
总结
DuckDB提供了强大而丰富的SQL语法支持,从基础查询到高级窗口函数,能够满足各种数据分析需求。通过本文介绍的内容,你可以开始使用DuckDB处理复杂的数据分析任务。建议进一步查阅官方文档和示例代码,深入学习DuckDB的高级特性。
贡献指南:CONTRIBUTING.md 基准测试:benchmark/README.md
希望本文对你的DuckDB学习之旅有所帮助!如有任何问题或建议,欢迎在社区讨论区交流。
【免费下载链接】duckdb 项目地址: https://gitcode.com/gh_mirrors/duc/duckdb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



