SQL ↔ Excel 对照速查

你懂 Excel 就懂 SQL —— 每个语句对应 Excel 里的什么操作

💡 这份手册的核心理念

SQL 的每个操作,都能在 Excel 里找到对应。你不需要从头学 SQL—— 你只需要把"在 Excel 里怎么做"翻译成"在 SQL 里怎么做"。

SELECT = 选择列(隐藏不需要的列)
WHERE = 筛选(点列头的筛选▼)
GROUP BY = 分类汇总(插入数据透视表)
JOIN = VLOOKUP(两个表按某列匹配)
窗口函数 = 在每行旁边加排名/累计公式

建议用法:遇到不熟的 SQL 操作时,翻到对应分组, 看 SQL 和 Excel 的并排对比——你会立刻明白 SQL 在干什么。

1
基础查询 = Excel 基本操作
SQL
SELECT * FROM 表
看所有数据
=
Excel
打开工作表
Ctrl+A 全选,所有行列都显示出来
SQL
SELECT 列1, 列2 FROM 表
只看某几列
=
Excel
隐藏不关心的列
右键列头 → 隐藏,只留想看的列
SQL
WHERE 条件
按条件过滤行
=
Excel
自动筛选 / 筛选按钮
数据 → 筛选,列头出现下拉箭头,勾选你要的
SQL
ORDER BY 列 ASC/DESC
排序
=
Excel
排序按钮 A→Z / Z→A
选中列 → 数据 → 升序/降序排列
SQL
LIMIT 10
只看前10条
=
Excel
只看前10行
滚动到第10行就停,后面的不看
SQL
DISTINCT 列
去重,只看不重复的值
=
Excel
数据 → 删除重复项 / 高级筛选
勾选"选择不重复的记录",或删除重复项

对照示例:WHERE 筛选

SQL 写法

SELECT * FROM orders
WHERE category = '图书馆' AND amount > 15
执行结果
namecategoryamount
编程入门书图书馆18
红豆图书馆图书馆22
芋泥图书馆图书馆28

Excel 操作

筛选 =AND(C2="图书馆", D2>15)
ABCD
1namestorecategoryamount
2编程入门书朝阳店图书馆18
3红豆图书馆海淀店图书馆22
4芋泥图书馆朝阳店图书馆28

操作:点 category 列的筛选▼→只勾"图书馆",点 amount 列→数字筛选→大于15

2
聚合函数 = Excel 公式
SQL
COUNT(*)
数有多少行
=
Excel
=COUNTA(A2:A100)
数非空单元格个数
SQL
SUM(列)
求和
=
Excel
=SUM(D2:D100)
选一列数字,底栏自动显示求和
SQL
AVG(列)
求平均
=
Excel
=AVERAGE(D2:D100)
底栏右键可显示"平均值"
SQL
MAX(列) / MIN(列)
最大值 / 最小值
=
Excel
=MAX(D2:D100) / =MIN(...)
或直接排序看头尾

对照示例:聚合函数

SQL

SELECT
COUNT(*) AS 总借书单数,
SUM(amount) AS 总金额,
AVG(amount) AS 平均金额,
MAX(amount) AS 最高金额,
MIN(amount) AS 最低金额
FROM orders;
总借书单数总金额平均金额最高金额最低金额
1020320.32815

Excel

ABCD
1namestorecategoryamount
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
3
GROUP BY = Excel 数据透视表

这是最关键的对照!GROUP BY 就是数据透视表,维度 = 行标签,聚合 = 值字段。

SQL
GROUP BY 列
按某列分组,每组压成一行
=
Excel
数据透视表的"行"区域
拖一个字段到"行",自动去重分组
SQL
GROUP BY 列1, 列2
按多列分组(交叉分组)
=
Excel
行区域拖两个字段
或行拖一个+列拖一个 = 交叉表
SQL
HAVING 条件
分组后过滤(只留满足条件的组)
=
Excel
透视表里的"值筛选"
右键行标签 → 筛选 → 值筛选 → 总计大于XX
SQL
COUNT(*) / SUM() / AVG()
每组做聚合计算
=
Excel
透视表的"值"区域
拖字段到值区域,右键→值汇总方式→计数/求和/平均

对照示例:GROUP BY vs 数据透视表

需求:每个门店、每个品类的借书单数和总金额

SQL 写法

SELECT store, category,
COUNT(*) AS cnt,
SUM(amount) AS total
FROM orders
GROUP BY store, category
HAVING COUNT(*) >= 2;
执行结果
storecategorycnttotal
朝阳店图书馆361
朝阳店图书257
海淀店图书馆233
海淀店图书238

咖啡只有1条,HAVING过滤掉了

Excel 操作

步骤:

  1. 选中数据 → 插入 → 数据透视表
  2. store 到 "行" 区域
  3. category 到 "行" 区域(在store下方)
  4. amount 到 "值" 区域 → 汇总方式选"计数" → 这就是 COUNT(*)
  5. 再拖一次 amount 到 "值" → 汇总方式选"求和" → 这就是 SUM(amount)
  6. 右键行标签 → 筛选 → 值筛选 → 计数大于等于2 → 这就是 HAVING

透视表的每个格子 = SQL 聚合后的一个值

核心对应关系:
GROUP BY 后面的字段 = 透视表拖到"行"的字段
SELECT 里的聚合函数 = 透视表拖到"值"的字段
HAVING = 透视表里的"值筛选"
WHERE = 透视表建立前的"数据筛选"(先筛数据再建表)
4
JOIN = VLOOKUP / 合并表格
SQL
INNER JOIN
两表匹配的行拼在一起
=
Excel
=VLOOKUP(查找值, 表2范围, 列号, 0)
根据某列去另一个表找对应值,找不到就 #N/A
SQL
LEFT JOIN
左表全保留,右表找不到填NULL
=
Excel
=VLOOKUP(...) + IFERROR(结果, "无")
VLOOKUP 找不到会报 #N/A,用 IFERROR 包裹变成"无"
SQL
ON 表1.键 = 表2.键
用哪一列来匹配
=
Excel
VLOOKUP 的第一个参数
VLOOKUP(用什么找, ...) — 就是匹配键

对照示例:LEFT JOIN vs VLOOKUP

需求:在借书单表旁边显示门店的经理名

SQL 写法

SELECT o.name, o.store, s.manager
FROM orders o
LEFT JOIN stores s
ON o.store = s.store_name;
namestoremanager
编程入门书朝阳店王店长
编程入门书海淀店李店长
美式咖啡通州店NULL

通州店在stores表里没有,LEFT JOIN 填NULL

Excel 写法

ABCD
1namestoremanager
2编程入门书朝阳店王店长=VLOOKUP(B2,stores!A:B,2,0)
3编程入门书海淀店李店长
4美式咖啡通州店#N/A找不到!

加 IFERROR 包裹:=IFERROR(VLOOKUP(...), "无") → 等价于 LEFT JOIN 的 NULL

5
窗口函数 = Excel 的"旁边加一列公式"

窗口函数是 SQL 里最像 Excel 的部分——每行还在,旁边多一列公式自动算

SQL
ROW_NUMBER() OVER (ORDER BY 列)
全局排名(1,2,3,4 不并列)
=
Excel
=RANK.EQ(单元格, 范围, 0) 或 =ROW()-1
拖一个RANK公式到旁边列,每行显示自己的名次
SQL
RANK() OVER (ORDER BY 列)
排名并列跳号(1,1,3,4)
=
Excel
=RANK.EQ(单元格, 范围, 0)
RANK.EQ 就是并列跳号,和SQL的RANK()完全一样
SQL
AVG(列) OVER (PARTITION BY 分组列)
每行旁边显示组内平均值
=
Excel
=AVERAGEIF(分组列, 当前行的组, 值列)
条件平均:算"和当前行同一组"的值的平均
SQL
SUM(列) OVER (ORDER BY 时间列)
累计求和(running total)
=
Excel
=SUM($D$2:D2) 往下拖
第一个$D$2锁定起点,往下拖时终点自动扩展
SQL
LAG(列, 1) OVER (ORDER BY 时间)
取上一行的值(对比涨跌)
=
Excel
=D2-D1(直接减上一行)
Excel天然按行排列,上一行就是上面的单元格
SQL
SUM(列) OVER (PARTITION BY 分组 ORDER BY 时间
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
组内累计求和
=
Excel
=SUMIF(分组列,当前组,值列起点:当前行)
或用 SUMPRODUCT 模拟,透视表加"累计"列

对照示例1:排名 — ROW_NUMBER / RANK vs Excel RANK

需求:按金额降序排名

SQL

SELECT name, amount,
ROW_NUMBER() OVER (ORDER BY amount DESC) AS rn,
RANK() OVER (ORDER BY amount DESC) AS rk,
DENSE_RANK() OVER (ORDER BY amount DESC) AS drk
FROM orders;
nameamountrnrkdrk
芋泥图书馆28111
算法精解25222
编程入门书22333
红豆图书馆22433
编程入门书18554

金额22出现两次:ROW_NUMBER=3,4 | RANK=3,3,5 | DENSE_RANK=3,3,4

Excel

ABCDE
1nameamountROW_NUMBERRANKDENSE_RANK
2芋泥图书馆28111
3算法精解25222
4编程入门书22333
5红豆图书馆22433
6编程入门书18554

C列: =ROW()-1(严格编号)
D列: =RANK.EQ(B2,$B$2:$B$6,0)(并列跳号)
E列: =RANK.EQ(B2,$B$2:$B$6,0) 需手动调整=并列不跳号(无直接公式,需辅助列)

对照示例2:分组平均 — AVG OVER PARTITION BY vs AVERAGEIF

需求:每行借书单旁边显示"同品类的平均金额"

SQL

SELECT name, category, amount,
AVG(amount) OVER (PARTITION BY category)
AS cat_avg
FROM orders;
namecategoryamountcat_avg💡 差值
编程入门书图书馆1820.318-20.3 = -2.3
红豆图书馆图书馆2220.322-20.3 = +1.7
芋泥图书馆图书馆2820.328-20.3 = +7.7
编程入门书图书2222.022-22 = 0
算法精解图书2522.025-22 = +3.0

Excel

ABCD
1namecategoryamountcat_avg
2编程入门书图书馆1820.3
3红豆图书馆图书馆2220.3
4芋泥图书馆图书馆2820.3
5编程入门书图书2222.0
6算法精解图书2522.0

D2 公式:=AVERAGEIF(B:B,B2,C:C)
意思是:在B列里找和当前行B2相同值的行,算对应C列的平均

对照示例3:累计求和 — SUM OVER ORDER BY vs SUM($D$2:D2)

需求:按时间排序,显示截至当前的累计总金额

SQL

SELECT name, amount,
SUM(amount) OVER (ORDER BY id)
AS running_total
FROM orders;
nameamountrunning_total💡 计算过程
编程入门书181818
编程入门书224018+22
红豆图书馆226218+22+22
美式咖啡157718+22+22+15
芋泥图书馆2810518+22+22+15+28

Excel

ABC
1nameamountrunning_total
2编程入门书1818
3编程入门书2240
4红豆图书馆2262
5美式咖啡1577
6芋泥图书馆28105

C2 = 18(第一行)
C3 = =SUM($B$2:B3) → 锁定起点B2,终点随行号扩展
C4 = =SUM($B$2:B4) → 范围自动扩展
往下拖就行!

对照示例4:LAG 前后对比 vs Excel 减上一行

需求:和上一个借书单比,金额涨了还是跌了

SQL

SELECT name, amount,
amount - LAG(amount,1,0) OVER (ORDER BY id)
AS diff
FROM orders;
nameamountprevdiff
编程入门书180-
编程入门书2218+4
红豆图书馆22220
美式咖啡1522-7
芋泥图书馆2815+13

Excel

ABCD
1nameamountprevdiff
2编程入门书180-
3编程入门书2218+4
4红豆图书馆22220
5美式咖啡1522-7
6芋泥图书馆2815+13

C2 = 0(第一行没有上一行)
C3 = =B2(上一行的值)
D3 = =B3-C3(当前 - 上一个)
Excel天然按行排列,LAG就是"上一行"!

6
CASE WHEN = Excel IF / IFS
SQL
CASE WHEN 条件1 THEN 值1 WHEN 条件2 THEN 值2 ELSE 值3 END
多条件分支
=
Excel
=IFS(条件1,值1, 条件2,值2, TRUE,值3)
或嵌套 =IF(条件1,值1, IF(条件2,值2, 值3))
SQL
IFNULL(列, 默认值)
空值替换
=
Excel
=IFERROR(单元格, 默认值)
或 =IF(单元格="", 默认值, 单元格)

对照示例:CASE WHEN vs IFS

SQL

SELECT name, amount,
CASE
WHEN amount >= 25 THEN '高'
WHEN amount >= 18 THEN '中'
ELSE '低'
END AS level
FROM orders;
nameamountlevel
编程入门书18
红豆图书馆22
芋泥图书馆28
美式咖啡15
算法精解25

Excel

ABC
1nameamountlevel
2编程入门书18
3红豆图书馆22
4芋泥图书馆28
5美式咖啡15
6算法精解25

C2 = =IFS(B2>=25,"高", B2>=18,"中", TRUE,"低")

总览:SQL ↔ Excel 全映射

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数字筛选 → 介于范围筛选
记忆口诀:
普通查询 → 筛选排序,和Excel一样
聚合函数 → Excel公式,SUM/AVERAGE一一对应
GROUP BY → 数据透视表!这是最重要的对照
窗口函数 → 旁边加一列公式,每行还在
JOIN → VLOOKUP,去另一个表找值
CASE WHEN → IFS函数,条件判断