您好!欢迎访问家园网-www.jy.wang!

家园网

ROW_NUMBER() OVER(ORDER BY ISBN)这里的over的作用如何

网络 作者:本站 点击:

OVER() 作用通俗讲解

让我用一个非常形象的比喻来解释 OVER() 的作用。


一、最直观的理解:OVER() = "在...的基础上"

sql

ROW_NUMBER() OVER(ORDER BY ISBN)

可以这样理解:"在按 ISBN 排序的基础上,再给每一行加一个行号"


二、没有 OVER() 会怎样?

假如你直接写:

sql

SELECT ROW_NUMBER() FROM bookinfo_zerobasis;  -- ❌ 报错!

报错原因ROW_NUMBER() 就像一个提问:"你要给什么排序?按什么规则排?" 你没告诉它,它没法干活。

OVER() 就是回答这个问题的:告诉函数在什么"范围"内、按什么"顺序"来计算


三、用排队打饭比喻

想象食堂打饭,学生们排队:

学生身高
张三175cm
李四180cm
王五170cm
赵六185cm

场景1:按当前排队顺序发号码

sql

ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-- 或 ORDER BY 当前顺序

结果:张三1号,李四2号,王五3号,赵六4号

场景2:按身高从矮到高排队后发号码

sql

ROW_NUMBER() OVER(ORDER BY 身高)

结果:王五1号(170),张三2号(175),李四3号(180),赵六4号(185)

OVER(ORDER BY 身高) 的作用:先让学生按身高重新排队,然后再发号码。


四、OVER() 的本质

OVER() 定义了一个"窗口"——也就是函数要处理的数据范围。

text

┌─────────────────────────────────────────────────────────────┐
│  完整的数据集                                                │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  ┌─────────────────────────────────────────────┐    │    │
│  │  │         OVER() 定义的窗口                    │    │    │
│  │  │         (排序后的数据子集)                   │    │    │
│  │  └─────────────────────────────────────────────┘    │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

写法窗口定义
OVER()整个数据集(不排序)
OVER(ORDER BY 列)按某列排序后的整个数据集
OVER(PARTITION BY 列)按某列分组,每组内独立计算
OVER(PARTITION BY 列 ORDER BY 列)分组后每组内排序计算

五、OVER() 的必要性

没有 OVER():窗口函数不知道要处理哪些数据、按什么顺序处理。

有 OVER():窗口函数有了明确的"工作范围"和"工作规则"。

sql

-- 错误:没有指定范围和规则ROW_NUMBER()           -- ❌ 不知道给什么编号-- 正确:指定了按 ISBN 排序后编号ROW_NUMBER() OVER(ORDER BY ISBN)  -- ✅ 知道怎么做了


六、OVER() 的其他常见用法

1、OVER(PARTITION BY ...) - 分组计算

sql

-- 每个作者的作品,分别从1开始编号ROW_NUMBER() OVER(PARTITION BY Writer ORDER BY ISBN)

比喻:每个作者(分组)自己单独排队,各自从1开始发号码。

2、OVER(ORDER BY ...) - 累计计算

sql

-- 按 ISBN 排序后,计算累计数量SUM(数量) OVER(ORDER BY ISBN)

比喻:排队后,每个人依次累加前面所有人的数量。


七、一句话总结

OVER() 是窗口函数的"工作说明书"——它告诉函数:

  • 在什么范围内工作(整个表?分组?)

  • 按什么顺序工作(按哪列排序?)

没有 OVER(),函数不知道该怎么干活;有了 OVER(),函数就知道"先按 ISBN 排好队,然后从1开始发号码"。

记住这个公式

text

函数 + OVER(规则) = 在某种规则下执行函数
ROW_NUMBER() + OVER(ORDER BY ISBN) = 在按 ISBN 排序的基础上加行号


标签: