位置: 编程技术 - 正文

SQL中distinct 和 row_number() over() 的区别及用法

编辑:rootadmin

推荐整理分享SQL中distinct 和 row_number() over() 的区别及用法,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

1 前言

在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在检索的时候,显示多条记录,这就有违咱们的初衷啦!因此,为了避免这种情况的发生,咱们就需要进行“去重”处理啦,那么何为“去重”呢?说白了,就是对同一字段让拥有相同内容的记录只显示一条记录。

那么,如何实现“去重”的功能呢?对此,咱们有两种方式可以实现该功能。

第一种,在编写 select 语句的时候,添加 distinct 关键词;

第二种,在编写 select 语句的时候,调用 row_number() over() 函数。

以上两种方式都可以实现“去重”功能,那两者之间有何异同呢?接下来,作者将给出详细的说明。

2 distinct

在 SQL 中,关键字 distinct 用于返回唯一不同的值。其语法格式为:

假设有一个表“CESHIDEMO”,包含两个字段,分别 NAME 和 AGE,具体格式如下:

观察以上的表,咱们会发现:拥有相同 NAME 的记录有两条,拥有相同 AGE 的记录有三条。如果咱们运行下面这条 SQL 语句,

将会得到如下结果:

观察该结果,咱们会发现在以上的四条记录中,包含两条 NAME 值相同的记录,即第 2 条记录和第 3 条记录的值都为“gavin”。那么,如果咱们想让拥有相同 NAME 的记录只显示一条该如何实现呢?这时,就需要用到 distinct 关键字啦!接下来,运行如下 SQL 语句,

将会得到如下结果:

观察该结果,显然咱们的要求得到实现啦!但是,咱们不禁会想到,如果将 distinct 关键字同时作用在两个字段上将会产生什么效果呢?既然想到了,咱们就试试呗,运行如下 SQL 语句,

得到的结果如下所示:

观察该结果,哎呀,貌似没有作用啊?她将全部的记录都显示出来了啊!其中 NAME 值相同的记录有两条,AGE 值相同的记录有三条,完全没有变化啊!但事实上,结果就应该是这样的。因为当 distinct 作用在多个字段的时候,她只会将所有字段值都相同的记录“去重”掉,显然咱们“可怜”的四条记录并不满足该条件,因此 distinct 会认为上面四条记录并不相同。空口无凭,接下来,咱们再向表“CESHIDEMO”中添加一条完全相同的记录,验证一下即可。添加一条记录后的表如下所示:

再运行如下的 SQL 语句,

SQL中distinct 和 row_number() over() 的区别及用法

得到的结果如下所示:

观察该结果,完美的验证了咱们上面的结论。

此外,有一点需要大家特别注意,即:关键字 distinct 只能放在 SQL 语句中所有字段的最前面才能起作用,如果放错位置,SQL 不会报错,但也不会起到任何效果。

3 row_number() over()

在 SQL Server 数据库中,为咱们提供了一个函数 row_number() 用于给数据库表中的记录进行标号,在使用的时候,其后还跟着一个函数 over(),而函数 over() 的作用是将表中的记录进行分组和排序。两者使用的语法为:

意为:将表中的记录按字段 COLUMN1进行分组,按字段 COLUMN2 进行排序,其中

PARTITION BY:表示分组ORDER BY:表示排序

接下来,咱们还用表“CESHIDEMO”中的数据进行测试。首先,给出没有使用 row_number() over() 函数时查询的结果,如下所示:

然后,运行如下 SQL 语句,

得到的结果如下所示:

从上面的结果可以看出,其在原表的基础上,多了一列标有数字排序的列。那么反过来分析咱们运行的 SQL 语句,发现其确实按字段 AGE 的值进行分组了,也按字段 NAME 的值进行排序啦!因此,函数的功能得到了验证。

接下来,咱们就研究如何用 row_number() over() 函数实现“去重”的功能。通过观察上面的结果,咱们可以发现,如果以 NAME 分组,以 AGE 排序,然后再取每组的第一个记录或许就可以实现“去重”的功能啊!那么试试看,运行如下 SQL 语句,

运行后,得到的结果如下所示:

观察以上的结果,我们发现,哎呀,数据“去重”的功能一不小心就被咱们实现了啊!不过很遗憾,如果咱们细心的话,会发现一个很不爽的事情,那就是在执行以上 SQL 语句进行“去重”的时候,有一条 NAME 值为“gavin”、AGE 值为“”的记录被过滤掉了,但是在现实生活会中,同名不同年龄的事情太正常了。

4 总结

通过阅读及实践以上内容,咱们已经知道了,无论是用关键字 distinct 还是用函数 row_number() over() 都可以实现数据“去重”的功能。但是在实现使用的过程中,咱们要特别注意两者的用法特点以及区别。

在使用关键字 distinct 的时候,咱们要知道其作用于单个字段和多个字段的时候是有区别的,作用于单个字段时,其“去重”的是表中所有该字段值重复的数据;作用于多个字段的时候,其“去重”的表中所有字段(即 distinct 具体作用的多个字段)值都相同的数据。

在使用函数 row_number() over() 的时候,其是按先分组排序后,再取出每组的第一条记录来进行“去重”的(在本篇博文中如此)。当然,在此处咱们还可以通过不同的限制条件来进行“去重”,具体如何实现,就需要大家自己去动脑思考啦!

最后,在本篇博文中,作者详述了自己对用关键字 distinct 和函数 row_number() over() 进行数据“去重”的一些认识,希望以上的内容能够对大家有所帮助!

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

利用Prometheus与Grafana对Mysql服务器的性能监控详解 概述Prometheus是一个开源的服务监控系统,它通过HTTP协议从远程的机器收集数据并存储在本地的时序数据库上。它提供了一个简单的网页界面、一个功能

Mysql数据库表定期备份的实现详解 Mysql数据库表定期备份的实现0.背景实际开发环境中,前端程序需要在给定时间段内,将数据更新/插入到MySQL指定的库表中。随着数据量的增多,基础库

Centos7安装 mysql5.6. shell脚本 本文实例为大家分享了mysql5.6.的shell脚本,供大家参考,具体内容如下创建脚本mysql.sh,直接运行shmysql.sh#!/bin/bashif[-d/software];thencd/softwareelsemkdir/software&

标签: SQL中distinct 和 row_number() over() 的区别及用法

本文链接地址:https://www.jiuchutong.com/biancheng/350065.html 转载请保留说明!

上一篇:MySql安装及登录详解(mysql安装使用教程)

下一篇:利用Prometheus与Grafana对Mysql服务器的性能监控详解(prometheus operator)

  • 公路客运企业应走集约化经营
  • 小规模纳税人企业所得税2023
  • 积分换物品是真的吗
  • 资产处置损益在借方表示赚还是赔?
  • 软件产品出口退税条件
  • 一般纳税人收到普票怎么做分录
  • 车辆购置税完税证明网上打印
  • 房地产中的存货是什么意思
  • 退货款现金流量表填经营活动的什么科目
  • 建筑业分项目核算会计账务处理
  • 房地产企业预缴税款最新规定
  • 个人独资企业个人所得税核定征收
  • 异地经营需要办什么税务手续?
  • 民办非企业单位可以盈利吗
  • 年终奖跟13薪有什么区别
  • 工具器具属于固废吗
  • 四川中级会计报名需要上传哪些资料
  • 取得土地的流程
  • 支付给外单位的押金是其他应收款吗
  • 补缴城镇土地使用税会计分录怎么做
  • 如何填写企业所得税
  • w11如何激活
  • 事业单位利息收入计入什么科目
  • 以前年度多计提的附加税怎么调账
  • 收到员工的罚款的会计科目
  • 科普笔记本电脑怎样
  • 补缴税款可以享受减免政策么
  • 最高像素是什么
  • php自定义函数的语法格式
  • php可以做什么脚本
  • 改造租入房产而不退租
  • 今夕七夕
  • 销售滞后税务处理
  • laravel datatable
  • 数据 挖掘
  • js正则用法
  • 待摊费用和预提费用属于什么账户
  • 事业单位无形资产包括哪些
  • 在php中声明变量时,变量名称以什么符号开头
  • 支付员工工伤医疗费用怎么做账
  • 计提工资的时候跟发放的时候不一样怎么办
  • 破产审计需要几年的账
  • 农产品增值税免税发票怎么抵扣
  • 酒店营业成本预算
  • 小规模减免税款会计分录
  • 公立医院事业单位工作人员招聘实践考核自我评价
  • 职工工资加计扣除
  • 事业单位公务卡额度多少
  • 销售产品产生的运输费计入什么科目
  • 专利年费可以减免吗
  • 无形资产资本化加计扣除可抵扣暂时性差异
  • 销售部购买电脑一台分录
  • 总账的设置和登记实训报告
  • 小企业建账选哪种会计制度
  • 编程经验点滴怎么写
  • mysql unique作用
  • MySQL利用视图查询员工进货数量要求输出姓名进货数量
  • win8安装程序在哪里
  • fedora安装双系统
  • 系统 启动速度慢怎么办
  • windowsxp服务在哪里
  • win8.1关机没反应
  • win8.1系统补丁
  • linux定时任务详解
  • unity3d的
  • easyui选项卡
  • 常用dos命令详解
  • ubuntu不待机
  • JavaScript mapreduce工作原理简析
  • js实现的简洁二次函数
  • 用shell写一个脚本,对文本中无序的一列数字排序
  • jquery插件怎么写
  • jQuery.ajax 跨域请求webapi设置headers的解决方案
  • android如何导入v4包
  • js怎么定义类
  • 四川国家税务局官网
  • 税务稽查操作规范
  • 别墅与普通住宅的优缺点
  • 印刷行业费用标准
  • 园区地税局在哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设