你懂 Excel 就懂 SQL —— 每个语句对应 Excel 里的什么操作
SQL 的每个操作,都能在 Excel 里找到对应。你不需要从头学 SQL——
你只需要把"在 Excel 里怎么做"翻译成"在 SQL 里怎么做"。
• SELECT = 选择列(隐藏不需要的列)
• WHERE = 筛选(点列头的筛选▼)
• GROUP BY = 分类汇总(插入数据透视表)
• JOIN = VLOOKUP(两个表按某列匹配)
• 窗口函数 = 在每行旁边加排名/累计公式
建议用法:遇到不熟的 SQL 操作时,翻到对应分组,
看 SQL 和 Excel 的并排对比——你会立刻明白 SQL 在干什么。
| name | category | amount |
|---|---|---|
| 编程入门书 | 图书馆 | 18 |
| 红豆图书馆 | 图书馆 | 22 |
| 芋泥图书馆 | 图书馆 | 28 |
| A | B | C | D | |
|---|---|---|---|---|
| 1 | name | store | category | amount |
| 2 | 编程入门书 | 朝阳店 | 图书馆 | 18 |
| 3 | 红豆图书馆 | 海淀店 | 图书馆 | 22 |
| 4 | 芋泥图书馆 | 朝阳店 | 图书馆 | 28 |
操作:点 category 列的筛选▼→只勾"图书馆",点 amount 列→数字筛选→大于15
| 总借书单数 | 总金额 | 平均金额 | 最高金额 | 最低金额 |
|---|---|---|---|---|
| 10 | 203 | 20.3 | 28 | 15 |
| A | B | C | D | |
|---|---|---|---|---|
| 1 | name | store | category | amount |
| 2 | 编程入门书 | 朝阳店 | 图书馆 | 18 |
| 3 | ... | ... | ... | ... |
| 11 | 设计模式书 | 海淀店 | 咖啡 | 20 |
| 12 | =COUNTA(D2:D11) | 10 | ||
| 13 | =SUM(D2:D11) | 203 | ||
| 14 | =AVERAGE(D2:D11) | 20.3 | ||
| 15 | =MAX(D2:D11) | 28 | ||
| 16 | =MIN(D2:D11) | 15 |
这是最关键的对照!GROUP BY 就是数据透视表,维度 = 行标签,聚合 = 值字段。
需求:每个门店、每个品类的借书单数和总金额
| store | category | cnt | total |
|---|---|---|---|
| 朝阳店 | 图书馆 | 3 | 61 |
| 朝阳店 | 图书 | 2 | 57 |
| 海淀店 | 图书馆 | 2 | 33 |
| 海淀店 | 图书 | 2 | 38 |
咖啡只有1条,HAVING过滤掉了
步骤:
透视表的每个格子 = SQL 聚合后的一个值
需求:在借书单表旁边显示门店的经理名
| name | store | manager |
|---|---|---|
| 编程入门书 | 朝阳店 | 王店长 |
| 编程入门书 | 海淀店 | 李店长 |
| 美式咖啡 | 通州店 | NULL |
通州店在stores表里没有,LEFT JOIN 填NULL
| A | B | C | D | |
|---|---|---|---|---|
| 1 | name | store | manager | |
| 2 | 编程入门书 | 朝阳店 | 王店长 | =VLOOKUP(B2,stores!A:B,2,0) |
| 3 | 编程入门书 | 海淀店 | 李店长 | |
| 4 | 美式咖啡 | 通州店 | #N/A | 找不到! |
加 IFERROR 包裹:=IFERROR(VLOOKUP(...), "无") → 等价于 LEFT JOIN 的 NULL
窗口函数是 SQL 里最像 Excel 的部分——每行还在,旁边多一列公式自动算。
需求:按金额降序排名
| name | amount | rn | rk | drk |
|---|---|---|---|---|
| 芋泥图书馆 | 28 | 1 | 1 | 1 |
| 算法精解 | 25 | 2 | 2 | 2 |
| 编程入门书 | 22 | 3 | 3 | 3 |
| 红豆图书馆 | 22 | 4 | 3 | 3 |
| 编程入门书 | 18 | 5 | 5 | 4 |
金额22出现两次:ROW_NUMBER=3,4 | RANK=3,3,5 | DENSE_RANK=3,3,4
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | name | amount | ROW_NUMBER | RANK | DENSE_RANK |
| 2 | 芋泥图书馆 | 28 | 1 | 1 | 1 |
| 3 | 算法精解 | 25 | 2 | 2 | 2 |
| 4 | 编程入门书 | 22 | 3 | 3 | 3 |
| 5 | 红豆图书馆 | 22 | 4 | 3 | 3 |
| 6 | 编程入门书 | 18 | 5 | 5 | 4 |
C列: =ROW()-1(严格编号)
D列: =RANK.EQ(B2,$B$2:$B$6,0)(并列跳号)
E列: =RANK.EQ(B2,$B$2:$B$6,0) 需手动调整=并列不跳号(无直接公式,需辅助列)
需求:每行借书单旁边显示"同品类的平均金额"
| name | category | amount | cat_avg | 💡 差值 |
|---|---|---|---|---|
| 编程入门书 | 图书馆 | 18 | 20.3 | 18-20.3 = -2.3 |
| 红豆图书馆 | 图书馆 | 22 | 20.3 | 22-20.3 = +1.7 |
| 芋泥图书馆 | 图书馆 | 28 | 20.3 | 28-20.3 = +7.7 |
| 编程入门书 | 图书 | 22 | 22.0 | 22-22 = 0 |
| 算法精解 | 图书 | 25 | 22.0 | 25-22 = +3.0 |
| A | B | C | D | |
|---|---|---|---|---|
| 1 | name | category | amount | cat_avg |
| 2 | 编程入门书 | 图书馆 | 18 | 20.3 |
| 3 | 红豆图书馆 | 图书馆 | 22 | 20.3 |
| 4 | 芋泥图书馆 | 图书馆 | 28 | 20.3 |
| 5 | 编程入门书 | 图书 | 22 | 22.0 |
| 6 | 算法精解 | 图书 | 25 | 22.0 |
D2 公式:=AVERAGEIF(B:B,B2,C:C)
意思是:在B列里找和当前行B2相同值的行,算对应C列的平均
需求:按时间排序,显示截至当前的累计总金额
| name | amount | running_total | 💡 计算过程 |
|---|---|---|---|
| 编程入门书 | 18 | 18 | 18 |
| 编程入门书 | 22 | 40 | 18+22 |
| 红豆图书馆 | 22 | 62 | 18+22+22 |
| 美式咖啡 | 15 | 77 | 18+22+22+15 |
| 芋泥图书馆 | 28 | 105 | 18+22+22+15+28 |
| A | B | C | |
|---|---|---|---|
| 1 | name | amount | running_total |
| 2 | 编程入门书 | 18 | 18 |
| 3 | 编程入门书 | 22 | 40 |
| 4 | 红豆图书馆 | 22 | 62 |
| 5 | 美式咖啡 | 15 | 77 |
| 6 | 芋泥图书馆 | 28 | 105 |
C2 = 18(第一行)
C3 = =SUM($B$2:B3) → 锁定起点B2,终点随行号扩展
C4 = =SUM($B$2:B4) → 范围自动扩展
往下拖就行!
需求:和上一个借书单比,金额涨了还是跌了
| name | amount | prev | diff |
|---|---|---|---|
| 编程入门书 | 18 | 0 | - |
| 编程入门书 | 22 | 18 | +4 |
| 红豆图书馆 | 22 | 22 | 0 |
| 美式咖啡 | 15 | 22 | -7 |
| 芋泥图书馆 | 28 | 15 | +13 |
| A | B | C | D | |
|---|---|---|---|---|
| 1 | name | amount | prev | diff |
| 2 | 编程入门书 | 18 | 0 | - |
| 3 | 编程入门书 | 22 | 18 | +4 |
| 4 | 红豆图书馆 | 22 | 22 | 0 |
| 5 | 美式咖啡 | 15 | 22 | -7 |
| 6 | 芋泥图书馆 | 28 | 15 | +13 |
C2 = 0(第一行没有上一行)
C3 = =B2(上一行的值)
D3 = =B3-C3(当前 - 上一个)
Excel天然按行排列,LAG就是"上一行"!
| name | amount | level |
|---|---|---|
| 编程入门书 | 18 | 中 |
| 红豆图书馆 | 22 | 中 |
| 芋泥图书馆 | 28 | 高 |
| 美式咖啡 | 15 | 低 |
| 算法精解 | 25 | 高 |
| A | B | C | |
|---|---|---|---|
| 1 | name | amount | level |
| 2 | 编程入门书 | 18 | 中 |
| 3 | 红豆图书馆 | 22 | 中 |
| 4 | 芋泥图书馆 | 28 | 高 |
| 5 | 美式咖啡 | 15 | 低 |
| 6 | 算法精解 | 25 | 高 |
C2 = =IFS(B2>=25,"高", B2>=18,"中", TRUE,"低")
| SQL 语句 | Excel 对应操作 | 一句话说明 |
|---|---|---|
| SELECT 列 | 选择列 / 隐藏列 | 看哪些列 |
| WHERE 条件 | 自动筛选 | 按条件过滤行 |
| ORDER BY | 排序 A→Z / Z→A | 排先后 |
| LIMIT N | 只看前N行 | 限制行数 |
| DISTINCT | 删除重复项 | 去重 |
| COUNT / SUM / AVG / MAX / MIN | =COUNTA / =SUM / =AVERAGE / =MAX / =MIN | 聚合计算 |
| GROUP BY | 数据透视表(行区域) | 分组统计 |
| HAVING | 透视表的值筛选 | 过滤分组 |
| INNER JOIN | =VLOOKUP() | 两表关联 |
| LEFT JOIN | =IFERROR(VLOOKUP(),"无") | 左表全保留 |
| ROW_NUMBER() OVER (ORDER BY) | =ROW()-1 | 排名不并列 |
| RANK() OVER (ORDER BY) | =RANK.EQ() | 排名并列跳号 |
| AVG() OVER (PARTITION BY) | =AVERAGEIF() | 分组平均 |
| SUM() OVER (ORDER BY) | =SUM($B$2:B2) | 累计求和 |
| LAG(列,1) OVER (ORDER BY) | =B3-B2(减上一行) | 取上一行 |
| LEAD(列,1) OVER (ORDER BY) | =B2-B3(减下一行) | 取下一行 |
| CASE WHEN ... THEN ... END | =IFS(条件1,值1, 条件2,值2, ...) | 条件分支 |
| IFNULL(列, 默认值) | =IFERROR(值, 默认值) | 空值处理 |
| LIKE '%关键词%' | Ctrl+F 查找 | 模糊匹配 |
| IN (值1,值2) | 筛选勾选多个 | 多选匹配 |
| BETWEEN A AND B | 数字筛选 → 介于 | 范围筛选 |