首页 > 数据库 > MySQL > 正文

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

2024-07-24 12:52:24
字体:
来源:转载
供稿:网友

1 前言

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

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

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

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

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

2 distinct

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

SELECT DISTINCT 列名称 FROM 表名称

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

CESHIDEMO

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

/*** 其中 PPPRDER 为 Schema 的名字,即表 CESHIDEMO 在 PPPRDER 中*/select name from PPPRDER.CESHIDEMO

将会得到如下结果:

name

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

select distinct name from PPPRDER.CESHIDEMO

将会得到如下结果:

distinct

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

select distinct name, age from PPPRDER.CESHIDEMO

得到的结果如下所示:

nameandage

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表