sql去重复操作详解SQL中distinct的⽤法
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(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是不可能实现的。但可以通过其他⽅法实现
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 语句,