技术文摘
distinct、row_number() 与 over() 的区别详细解析
在数据库查询中,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()
- 面试中有关分布式事务(2PC、3PC、TCC)的解释没问题!
- 不到 2KB 的 JavaScript 代码如何创作 3D 赛车游戏
- Python在脚本领域的“大佬地位”会持续多久?有保质期吗?
- 一个游戏提升 git 命令行技能,工作流清晰超爽
- 时间管理至关重要:Python 代码的优化之法
- Elasticsearch 与 8 大竞品技术的较量,谁更胜一筹?
- 程序员找工作:简历放照片与否及各种防坑指南
- 7 款提升 Mac 效率的工具
- 解析:三目运算符缘何导致 NPE?
- GitHub 上的计算机自学逆袭之路:8 个月,中年 Web 前端变身亚马逊高薪软件工程师
- 融云 CEO 韩迎专访:通信中台开启互联网通信云未来
- 不停机实现 ZooKeeper 向 Kubernetes 的迁移之法
- Python 2 正式落幕,应迁移至 Python 3
- 31 年的 WWDC ,库克欲收割 13 岁以上程序员带来新变化
- XML 之父因不满亚马逊疫情期间作为而愤然离职