SQL数据去重复 Distinct 和 row_number() over()

Distinct:查询结果中,去掉了重复的行
1.语法:
     SELECT Distinct列名称 FROM 表名称;
     Distinct 必须放在Select搜索字段的最前面,否则SQL语句会报语法错误。

2.示例:

  • 2.1简单建立一个表,填入数据,执行SQL: Select * From [BlogDemo].[dbo].[People],结果如下:
    在这里插入图片描述
  • 2.2 单独查询Name字段,执行SQL:Select Name From [BlogDemo].[dbo].[People],结果如下:
    在这里插入图片描述
  • 2.3 上面查询结果的Name中"李丽"出现了3次,可以使用Distinct 关键字去重复,执行SQL:Select distinct Name From [BlogDemo].[dbo].[People],结果如下:
    在这里插入图片描述
  • 2.4 上面查询结果中可以看到,Distinct 关键字去重复的作用实现了。如果在去重复Name的需求下还需要查询其他所有字段,会出现什么结果,执行SQL:Select distinct Name,Age,Address From [BlogDemo].[dbo].[People],结果如下:
    在这里插入图片描述
  • 2.5 可以看到Distinct 关键字去重复作用并没有什么卵用,当 Distinct 作用在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉,下面验证下,在表中在插入一条数据,如下:
    在这里插入图片描述
  • 2.6 新插入数据第8条和第1条数据内容完全相同,再次执行SQL:Select distinct Name,Age,Address From [BlogDemo].[dbo].[People],结果如下:
    在这里插入图片描述
  • 2.7 可以看到第8条数据被去重了,所以:当 Distinct 作用在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉。在我们实际开发中,表中可能含有多条拥有相同某个字段的记录,如同示例中的Name字段,如果我们只需要相同Name的一个数据怎么办呢?


row_number() over() 函数:对结果集的输出进行编号。返回结果集分区内行的序列号,每个分区的第一行从 1 开始
1.语法:

ROW_NUMBER ( )   OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

2.参数:
       PARTITION BY value_expression:将 FROM 子句生成的结果集划分为应用 ROW_NUMBER 函数的分区。 value_expression 指定对结果集进行分区所依据的列。 如果未指定 PARTITION BY,则此函数将查询结果集的所有行视为单个组。 (PARTITION BY作用相似Group By 分组的效果)
       order_by_clause:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 它是必需的。

3.示例:

  • 3.1 依旧使用上面的People表,先不加PARTITION BY分组的效果,执行SQL:Select *,ROW_NUMBER() OVER(Order By Id) as row From [BlogDemo].[dbo].[People],可以看到查询的结果集有8组,最后一列加入了row字段标识,结果如下:
    在这里插入图片描述
  • 3.2 加入PARTITION BY分组的效果,执行SQL:Select *,ROW_NUMBER() OVER(Partition By Name Order By Id) as row From [BlogDemo].[dbo].[People],可以看到这次结果集只有4组,Name为"李丽"全部被标识为4组,结果如下:
    在这里插入图片描述
  • 3.3 如果我们只取Name字段相同数据的一组,只要加一个筛选条件分组row为1即可,执行SQL:Select * From (Select *,ROW_NUMBER() OVER(Partition By Name Order By Id) as row From [BlogDemo].[dbo].[People]) p Where p.row=1,这时候结果集中Name不会出现相同的数据了,结果如下:
    在这里插入图片描述

总结:
Distinct 和 row_number() over() 都有将数据去重复的作用,但Distinct 只能作用于单个字段查询结果集去重复,若针对多个字段查询的结果集去重复,需要所有字段都重复才可以去重复。row_number() over() 函数具有分组效果,无论是对于单字段还是多字段查询结果集去重复都可以做到。

  • 17
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
在MySQL中,row_number()函数本身并不能实现去重的功能。row_number()函数是用来为查询结果集中的每一行分配一个唯一的行号,通常用于排序或分页查询中。如果要实现去重的功能,可以使用distinct关键字或者group by子句来实现。 使用distinct关键字可以对查询结果集进行去重。例如,使用以下语句可以去除结果集中的重复行: SELECT DISTINCT column1, column2, ... FROM table_name; 另一种方法是使用group by子句来分组并去重。例如,使用以下语句可以按照某一列进行分组并去重: SELECT column1, column2, ... FROM table_name GROUP BY column1; 需要根据具体的需求选择合适的方法来实现去重。希望能帮到您!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mysql 数据去重的三种方式[实战]](https://blog.csdn.net/m0_55070913/article/details/126113153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mysql学习SQLdistinctrow_number() over() 的区别及用法](https://blog.csdn.net/weixin_39751871/article/details/114784218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-小龙人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值