distinct、row_number() 与 over() 的区别详细解析

2025-01-15 04:11:29   小编

在数据库查询中,distinct、row_number() 与 over() 是几个非常实用但又容易混淆的概念,深入理解它们之间的区别对于高效准确地处理数据至关重要。

首先来看 distinct。distinct 关键字的作用是从查询结果中去除重复的行。它是对整个查询结果集进行去重操作,简单直接。例如,有一张员工表包含员工姓名、年龄和部门信息,若执行“SELECT DISTINCT department FROM employees;”,这将返回员工表中所有不重复的部门名称。distinct 作用于整个结果集,对字段组合去重,如果有多个字段,只有这些字段值完全相同的行才会被视为重复行并被去除。

再说说 row_number()。row_number() 函数用于为查询结果集中的每一行分配一个唯一的行号。这个行号从 1 开始递增,每行都有一个不同的编号。比如“SELECT row_number() over (order by salary desc) as rank, employee_name, salary FROM employees;”,它会按照员工工资从高到低排序,并为每一行分配一个排名,这个排名就是行号。row_number() 函数在数据分页、分组排序等场景中非常有用。

而 over() 则是一个窗口函数限定符,它用于定义一个窗口,窗口函数在这个窗口内进行计算。row_number() 常常与 over() 结合使用,用来定义排序规则等。除了 row_number(),像 sum()、avg() 等聚合函数也能和 over() 搭配,实现更复杂的计算需求。例如“SELECT employee_name, salary, sum(salary) over (partition by department) as total_department_salary FROM employees;”,这里通过 over() 结合 partition by 按照部门进行分区,计算出每个部门的总薪资,并且每行都能显示所在部门的总薪资。

distinct 主要用于去重,row_number() 用于生成唯一行号,而 over() 则是为窗口函数提供计算窗口。它们功能不同,应用场景也各有差异,熟练掌握这些区别,能在数据库查询优化中发挥重要作用。

TAGS: 区别解析 distinct row_number() over()

欢迎使用万千站长工具!

Welcome to www.zzTool.com