- 安装
- 文档
- 入门
- 连接
- 数据导入
- 客户端 API
- 概览
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT 和 IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- 为什么选择 DuckDB
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
SELECT
子句指定了查询将返回的列列表。尽管它在子句中首先出现,但从逻辑上讲,这里的表达式仅在最后执行。SELECT
子句可以包含任意转换输出的表达式,以及聚合函数和窗口函数。
示例
从名为 table_name
的表中选择所有列
SELECT * FROM table_name;
对表中的列执行算术运算,并提供别名
SELECT col1 + col2 AS res, sqrt(col1) AS root FROM table_name;
使用前缀别名
SELECT
res: col1 + col2,
root: sqrt(col1)
FROM table_name;
从 addresses
表中选择所有唯一的城市
SELECT DISTINCT city FROM addresses;
返回 addresses
表中的总行数
SELECT count(*) FROM addresses;
从 addresses
表中选择除 city 列之外的所有列
SELECT * EXCLUDE (city) FROM addresses;
从 addresses
表中选择所有列,但将 city
替换为 lower(city)
SELECT * REPLACE (lower(city) AS city) FROM addresses;
从表中选择所有匹配给定正则表达式的列
SELECT COLUMNS('number\d+') FROM addresses;
对表中的所有给定列计算一个函数
SELECT min(COLUMNS(*)) FROM addresses;
要选择包含空格或特殊字符的列,请使用双引号("
)
SELECT "Some Column Name" FROM tbl;
语法
SELECT
列表
SELECT
子句包含一个表达式列表,用于指定查询的结果。选择列表可以引用 FROM
子句中的任何列,并使用表达式对其进行组合。由于 SQL 查询的输出是一个表,SELECT
子句中的每个表达式也都有一个名称。表达式可以使用 AS
子句(例如,expr AS name
)显式命名。如果用户未提供名称,则系统会自动命名这些表达式。
列名不区分大小写。有关更多详细信息,请参阅大小写敏感规则。
星号表达式
从名为 table_name
的表中选择所有列
SELECT *
FROM table_name;
从表中选择所有匹配给定正则表达式的列
SELECT COLUMNS('number\d+')
FROM addresses;
星号表达式是一种特殊表达式,它根据 FROM
子句的内容扩展为多个表达式。在最简单的情况下,*
扩展为 FROM
子句中的所有表达式。列也可以使用正则表达式或 Lambda 函数进行选择。有关更多详细信息,请参阅星号表达式页面。
DISTINCT
子句
从 addresses 表中选择所有唯一的城市
SELECT DISTINCT city
FROM addresses;
DISTINCT
子句可用于只返回结果中的唯一行——以便过滤掉任何重复行。
以
SELECT DISTINCT
开头的查询会执行去重操作,这是一项开销较大的操作。因此,仅在必要时使用DISTINCT
。
DISTINCT ON
子句
选择每个国家人口最多的城市
SELECT DISTINCT ON(country) city, population
FROM cities
ORDER BY population DESC;
DISTINCT ON
子句为 ON
子句中定义的表达式集合中的每个唯一值仅返回一行。如果存在 ORDER BY
子句,则返回的行是根据 ORDER BY
条件遇到的第一行。如果不存在 ORDER BY
子句,则遇到的第一行未定义,可以是表中的任何行。
查询大型数据集时,对所有列使用
DISTINCT
可能会开销很大。因此,考虑在保证结果具有足够唯一性的一列(或一组列)上使用DISTINCT ON
。例如,对表的主键列使用DISTINCT ON
可确保完全唯一性。
聚合函数
返回 addresses 表中的总行数
SELECT count(*)
FROM addresses;
返回按城市分组的 addresses 表中的总行数
SELECT city, count(*)
FROM addresses
GROUP BY city;
聚合函数是特殊函数,它将多行组合成一个单一值。当 SELECT
子句中存在聚合函数时,查询将变为聚合查询。在聚合查询中,所有表达式都必须是聚合函数的一部分,或者是组的一部分(由GROUP BY 子句
指定)。
窗口函数
生成一个包含每行递增标识符的 row_number
列
SELECT row_number() OVER ()
FROM sales;
按时间顺序计算当前金额与前一金额之间的差值
SELECT amount - lag(amount) OVER (ORDER BY time)
FROM sales;
窗口函数是特殊函数,允许计算结果集中相对于其他行的值。窗口函数由包含窗口规范的 OVER
子句标记。窗口规范定义了计算窗口函数的框架或上下文。有关更多信息,请参阅窗口函数页面。
unnest
函数
将数组解嵌套一层
SELECT unnest([1, 2, 3]);
将结构体解嵌套一层
SELECT unnest({'a': 42, 'b': 84});
unnest
函数是一个特殊函数,可与数组、列表或结构体一起使用。unnest
函数会从类型中剥离一层嵌套。例如,INTEGER[]
转换为 INTEGER
。STRUCT(a INTEGER, b INTEGER)
转换为 a INTEGER, b INTEGER
。unnest
函数可用于将嵌套类型转换为常规标量类型,从而使它们更易于操作。