在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。

表A:

表B:

1.作用于单列

select distinct name from A

执行后结果如下:

2.作用于多列

示例2.1

select distinct name, id from A

执行后结果如下:

实际上是根据name和id两个字段来去重的,这种方式Access和SQL Server同时支持。

示例2.2

select distinct xing, ming from B

返回如下结果:

返回的结果为两行,这说明distinct并非是对xing和ming两列“字符串拼接”后再去重的,而是分别作用于了xing和ming列。

3.COUNT统计

select count(distinct name) from A;      --表中name去重后的数目, SQL Server支持,而Access不支持

count是不能统计多个字段的,下面的SQL在SQL Server和Access中都无法运行。

select count(distinct name, id) from A;

若想使用,请使用嵌套查询,如下:

select count(*) from (select distinct xing, name from B) AS M;

4.distinct必须放在开头

select id, distinct name from A;   --会提示错误,因为distinct必须放在开头

5.其他

distinct语句中select显示的字段只能是distinct指定的字段,其他字段是不可能出现的。例如,假如表A有“备注”列,如果想获取distinc name,以及对应的“备注”字段,想直接通过distinct是不可能实现的。但可以通过其他方法实现关于SQL Server将一列的多行内容拼接成一行的问题讨论

distinct这个关键字用来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。
下面先来看看例子:

table表

字段1     字段2
   id        name
   1           a
   2           b
   3           c
   4           c
   5           b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须

使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

----------

name
   a

c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

----------

id name
   1 a
   2 b
   3 c
   4 c
   5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个

字段,也就是必须得id与name都相同的才会被排除

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。

--------------------------------------------------------

下面方法可行:

select *, count(distinct name) from table group by name

结果:

id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

最后一项是多余的,不用管就行了,目的达到

group by 必须放在 order by 和 limit之前,不然会报错

distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,接下来通过本篇文章给大家分享SQL中distinct的用法,需要的朋友可以参考下

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只 用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的,所以浪费了我大量时间。

在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。

表A:

示例1

复制代码 代码如下:

select distinct name from A

执行后结果如下:

示例2

复制代码 代码如下:

select distinct name, id from A

执行后结果如下:

实际上是根据“name+id”来去重,distinct同时作用在了name和id上,这种方式Access和SQL Server同时支持。

示例3:统计

复制代码 代码如下:

select count(distinct name) from A;   --表中name去重后的数目, SQL Server支持,而Access不支持
select count(distinct name, id) from A;   --SQL Server和Access都不支持

示例4

复制代码 代码如下:

select id, distinct name from A;   --会提示错误,因为distinct必须放在开头

在使用mysql时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,例如有如下表user:

用distinct来返回不重复的用户名:select distinct name from user;,结果为:

这样只把不重复的用户名查询出来了,但是用户的id,并没有被查询出来:select distinct name,id from user;,这样的结果为:

distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头。

所以一般distinct用来查询不重复记录的条数。

如果要查询不重复的记录,有时候可以用group by :

select id,name from user group by name;

1 前言

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

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

  • 第一种,在编写 select 语句的时候,添加 distinct 关键词;
  • 第二种,在编写 select 语句的时候,调用 row_number() over() 函数。

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

2 distinct

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

SELECT DISTINCT 列名称 FROM 表名称
  • 1

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

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

/**
* 其中 PPPRDER 为 Schema 的名字,即表 CESHIDEMO 在 PPPRDER 中
*/select name from PPPRDER.CESHIDEMO
  • 1
  • 2
  • 3
  • 4
  • 5

将会得到如下结果:

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

select distinct name from PPPRDER.CESHIDEMO
  • 1

将会得到如下结果:

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

select distinct name, age from PPPRDER.CESHIDEMO
  • 1

得到的结果如下所示:

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

再运行如下的 SQL 语句,

select distinct name, age from PPPRDER.CESHIDEMO
  • 1

得到的结果如下所示:

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

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

3 row_number() over()

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

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

意为:将表中的记录按字段 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
  • 1

得到的结果如下所示:

从上面的结果可以看出,其在原表的基础上,多了一列标有数字排序的列。那么反过来分析咱们运行的 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

4 总结

sql去重复操作详解SQL中distinct的用法相关推荐

  1. html nthchild作用,详解CSS中:nth-child的用法

    前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nt ...

  2. html里position属性,科技常识:详解html中 position属性用法(四种)

    今天小编跟大家讲解下有关详解html中 position属性用法(四种) ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关详解html中 position属性用法(四种) 的相关资料,希望小 ...

  3. php simplexml_load_file 详解,php中simplexml_load_file函数用法实例讲解

    php中simplexml_load_file函数用法实例讲解 发布于 2015-02-07 06:53:40 | 136 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文 ...

  4. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  5. 详解python中的用法_详解python中*号的用法

    1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...

  6. python两个乘号_详解python中*号的用法!(含实例:零基础也看能懂)

    前言: 今天为大家带来的内容是python中*号的用法,文中通过代码给大家介绍了双星号(**)的用法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 1.表示乘号 2.表示倍数,例如: de ...

  7. python argparse模块详解_python中argparse模块用法实例详解

    本文实例讲述了python中argparse模块用法.分享给大家供大家参考.具体分析如下: 平常在写命令行工具的时候,经常会带参数,所以用python中的argparse来实现. # -*- codi ...

  8. matlab sort descend,详解Matlab中 sort 函数用法

    搜索热词 (1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序. eg: A=[1,5,3],则sort(A)=[1,3,5] A=[1,3; ...

  9. sort函数降序排列matlab,详解Matlab中 sort 函数用法

    (1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序. eg: A=[1,5,3],则sort(A)=[1,3,5] A=[1,5,3;2,4 ...

最新文章

  1. AI在软硬件开发中的应用落地!
  2. Exchange如何将邮件转发给外部邮件地址
  3. R语言大会:宏基因组数据分析和可视化套路总结
  4. YOLOv3: 训练自己的数据(绝对经典版本1)
  5. 推荐VS2008插件CodeRush Xpress for C#
  6. mysql- 外键与 级联删除
  7. java编写程序_对输入的年月日_给出该天是该年的第多少天?_编写Java程序。当以年月日的格式输入一个日期时,输出该年是否是闰年,该月有几天,该日是星期几...
  8. android 移植 距离感应,Android sensors移植文档
  9. for循环如果先--_97-for循环嵌套 输出反倒直角三角形
  10. 基于GD32F1x0手动编程实现简易freertos之任务阻塞延时
  11. 风力发电机组的基本结构
  12. 利用Matplotlib绘制各类图表
  13. 适合新手练手的三个python简单小游戏
  14. Mifare l射频卡初始值及其相关说明
  15. Java Callable接口应用举例
  16. 2022年度浦东新区科技发展基金社会领域数字化转型专项立项公示
  17. oracle解锁scott登录,scott怎么解锁并且Oracle数据库登录方法
  18. 16个很好的在线教育网站
  19. arduino(13):使用ESP8266加蜂鸣器,做一个定时闹钟,督促闺女上课,上网校时间提前两分钟,唱歌提醒。超级实用。
  20. 2661: [BeiJing wc2012]连连看

热门文章

  1. php 程序定时运行程序,PHP定时执行程序脚本的例子总结
  2. 三步搞定esxi硬盘直通(RDM)
  3. 操作系统——银行家算法(银行家和房地产开发商的爱恨情仇)
  4. UWB DW1000 硬件设计
  5. 百度超级链恭祝大家新年快乐、兔年吉祥!
  6. Word里如何在双栏文章里插入双栏大小的图片且不改变文章顺序
  7. 苹果手机桌面计算机没6,iPhone6连接电脑没有反应的六个原因分析
  8. Becoming a ScrumMaster-CSM认证培训总结PPT
  9. 【C语言】printf格式化输出及修饰符总结
  10. vue 由 clearTimeout无法清除定时器引发的vue 周期函数,事件代码执行顺序思考