全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

1 前言

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

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

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

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

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

2 distinct

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

SELECT DISTINCT 列名称 FROM 表名称

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

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

/**
* 其中 PPPRDER 为 Schema 的名字,即表 CESHIDEMO 在 PPPRDER 中
*/

select name from PPPRDER.CESHIDEMO

将会得到如下结果:

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

select distinct name from PPPRDER.CESHIDEMO

将会得到如下结果:

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

select distinct name, age from PPPRDER.CESHIDEMO

得到的结果如下所示:

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

再运行如下的 SQL 语句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的结果如下所示:

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

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

3 row_number() over()

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

ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

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

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

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

然后,运行如下 SQL 语句,

select PPPRDER.CESHIDEMO.*, row_number() over(partition by age order by name desc) from PPPRDER.CESHIDEMO

得到的结果如下所示:

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

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

/*
* 其中 rn 表示最后添加的那一列
*/

select * from 
(select PPPRDER.CESHIDEMO.*, row_number() over(partition by name order by age desc) rn from PPPRDER.CESHIDEMO)
where rn = 1

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

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

4 总结

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

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

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

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

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


# SQL中distinct  #   # row_number()  # over()区别  # over()对比  # 使用row_number()实现分页实例  # oracle中rownum和row_number()  # 利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号的方法  # Mysql row number()排序函数的用法和注意  # MYSQL row_number()与over()函数用法详解  # SQL使用ROW_NUMBER() OVER函数生成序列号  # MySQL中rank() over、dense_rank() over、row_  # SQL中row_number() over(partition by)的用法说明  # Row_number()函数用法小结  # 数据库中row_number() 分组排序函数的具体使用  # 关键词  # 所示  # 多个  # 将会  # 两条  # 可以实现  # 数据库中  # 四条  # 作用于  # 只显示  # 用在  # 三条  # 多条  # 值为  # 如何实现  # 每组  # 的是  # 空口无凭  # 博文  # 一个函数 


相关文章: 平台云上自主建站:模板化设计与智能工具打造高效网站  开源网站制作软件,开源网站什么意思?  建站之星代理费用多少?最新价格详情介绍  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  导航网站建站方案与优化指南:一站式高效搭建技巧解析  建站之星云端配置指南:模板选择与SEO优化一键生成  建站主机SSH密钥生成步骤及常见问题解答?  建站主机类型有哪些?如何正确选型  建站之星如何快速生成多端适配网站?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  动图在线制作网站有哪些,滑动动图图集怎么做?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在腾讯云服务器快速搭建个人网站?  c# 在ASP.NET Core中管理和取消后台任务  实现点击下箭头变上箭头来回切换的两种方法【推荐】  浅析上传头像示例及其注意事项  如何通过虚拟主机快速搭建个人网站?  如何用美橙互联一键搭建多站合一网站?  公司网站的制作公司,企业网站制作基本流程有哪些?  建站之星会员如何解锁更多建站功能?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何制作网站标识牌,动态网站如何制作(教程)?  代刷网站制作软件,别人代刷火车票靠谱吗?  官网网站制作腾讯审核要多久,联想路由器newifi官网  如何生成腾讯云建站专用兑换码?  网站企业制作流程,用什么语言做企业网站比较好?  网站制作话术技巧,网站推广做的好怎么话术?  如何选择高效可靠的多用户建站源码资源?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何通过二级域名建站提升品牌影响力?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  建站主机选虚拟主机还是云服务器更好?  如何快速搭建高效可靠的建站解决方案?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  建站主机无法访问?如何排查域名与服务器问题  创业网站制作流程,创业网站可靠吗?  教学论文网站制作软件有哪些,写论文用什么软件 ?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何彻底卸载建站之星软件?  如何快速完成中国万网建站详细流程?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  建站之星如何快速解决建站难题?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何快速生成高效建站系统源代码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。