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 与内连接结果差异。
...