SQL 基础

SQL 基础 本节目标 读完本篇,你应能: 用 CREATE TABLE 定义表结构,并用 INSERT INTO 写入行 编写 SELECT 查询,配合 WHERE 过滤、ORDER BY 排序、LIMIT 限制行数 使用 GROUP BY 与聚合函数做汇总统计 识别 DuckDB Friendly SQL 中两种常用写法:FROM 在前(等价于 SELECT *)与 CREATE TABLE ... AS SELECT(CTAS) 避开标识符大小写与字符串引号等常见方言差异 若尚未安装 CLI 或连接内存库/文件库,请先阅读 简介与安装。 概念:DuckDB 里的 SQL 长什么样 DuckDB 的 SQL 方言 (dialect) 整体接近 PostgreSQL,而不是 SQLite:类型系统、函数与不少语法与 PG 更一致。你在 CLI 或 Python 里执行的语句,会先被解析成逻辑计划,再在列式引擎上执行——本篇只关心声明式查询怎么写,不涉及执行计划。 一条典型查询的执行顺序在逻辑上是:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。写 SQL 时顺序可以不同,但理解这个顺序有助于读懂聚合与过滤为何这样组合。 ...

October 12, 2026

SQL 进阶

SQL 进阶 本节目标 读完本篇,你应能: 用 INNER JOIN 与 LEFT JOIN 关联多张表,并理解「保留哪一侧行」的差异 用 WITH(CTE,Common Table Expression)拆分复杂查询、提高可读性 编写窗口函数:按分区排序编号(ROW_NUMBER)与累计求和(SUM() OVER) 各写一条 PIVOT 与 UNPIVOT 示例,理解宽表与长表互转 用 CREATE VIEW 封装常用查询,用 CREATE MACRO 定义可复用的 SQL 表达式 区分窗口函数与聚合函数,并知道 DuckDB 的 QUALIFY 如何过滤窗口结果 若还不熟悉 SELECT / GROUP BY,请先阅读 SQL 基础。 概念:从单表到多表与「不折叠行」的汇总 SQL 基础 里主要在一张 employees 表上做单表查询与 GROUP BY 聚合。进阶查询常见两类需求: 多表关联:例如部门详情在另一张表,需要把员工与部门信息拼在同一结果里。 保留明细行的统计:聚合会把多行压成一行;窗口函数 (window functions) 在「当前结果集的每一行」上再算一列(如组内排名、累计和),行数不变。 下面仍从 employees 出发,并增加 departments 与一张用于透视的 sales 表。建议在 CLI 中按块复制执行。 准备示例数据 CREATE OR REPLACE TABLE employees ( id INTEGER PRIMARY KEY, name VARCHAR, department_id INTEGER, salary DOUBLE ); CREATE OR REPLACE TABLE departments ( id INTEGER PRIMARY KEY, name VARCHAR, location VARCHAR ); INSERT INTO employees VALUES (1, 'Alice', 10, 120000), (2, 'Bob', 10, 95000), (3, 'Carol', 20, 88000), (4, 'Dave', 20, 91000), (5, 'Eve', 10, 105000), (6, 'Frank', NULL, 72000); INSERT INTO departments VALUES (10, 'Engineering', 'Building A'), (20, 'Sales', 'Building B'); CREATE OR REPLACE TABLE sales ( region VARCHAR, product VARCHAR, amount DOUBLE ); INSERT INTO sales VALUES ('East', 'Widget', 100), ('East', 'Gadget', 80), ('West', 'Widget', 120), ('West', 'Gadget', 90); Frank 的 department_id 为 NULL,便于演示 LEFT JOIN 与内连接结果差异。 ...

October 12, 2026