> 数据库 > MySQL >

mysql distinct语句去除重复值测试

在mysql数据库中用distinct语句去除重复记录,select distinct子句用于筛选出不重复的数据记录,分享几个distinct语句的例子。

mysql distinct关键字用法

1,count统计结果,得到不重复的记录
比如

select count( distinct id ) from tablename;
 

求得talbebname表中id不同的记录有多少条。

2,返回记录不同的id的具体值
例子:

select distinct id from tablename;
 

返回talbebname表中不同的id的具体的值

3,以上二种情况,对于返回mysql表中2列以上的结果时会有歧义
比如

select distinct id, type from tablename;
 

实际上返回id与type同时不相同的结果,即distinct同时作用了两个字段,必须得id与tyoe都相同的才被排除了,与期望结果不一样。

#---------------
常用sql语句分享
select top语句
select into语句
insert into select语句

例子:
 

create table `student` (                  
   `name` varchar(20) not null default '', 
   `age` int(10) default '0'               
 ) engine=innodb default charset=latin1

1,测试一
 

select * from student;        
a    5
a    5
c    0

例子,用distinct过滤掉两列均重复的记录:
 

select distinct name,age from student;

返回结果:
a    5
c    0

2、测试二
将表student的数据改为:
 

select * from student;
c    2
c    5

例子:
 

select distinct name,age from student;

返回结果,说明distinct后面有多于一列的字段时,只有每列的值完全相同才过滤:
c    2
c    5

3,测试三
 

select * from student;
name age height
c    2    123
c    2    456
b    20    222

group by按两列同时分组
 

select name,age,sum(height) from student group by name,age;
b    20    222
c    2    579

group by按两列同时分组,同时在后面加上having的条件
 

select name,age,sum(height) as n from student group by name,age having n > 500;
返回
c    2    579

4,测试四
关于group by后面limit的测试
 

select songname,sengerid,count(sengerid) as n from t_song group by songname,sengerid having n > 1 ORDER BY n DESC,songid ASC limit 10;
未知    8738    40
共同渡过    1432    24
风继续吹    1432    23
倩女幽魂    1432    23
无心睡眠    1432    23
罗百吉超嗨派对连续组曲    780    19
拒绝再玩    1432    19
风再起时    1432    18
每天爱你多一些    1480    18
千言万语    1794    18

例句:
 

select songname,sengerid,count(sengerid) as n from t_song group by songname,sengerid having n > 1 ORDER BY n DESC,songid ASC limit 5;
未知    8738    40
共同渡过    1432    24
风继续吹    1432    23
倩女幽魂    1432    23
无心睡眠    1432    23
 

经过以上两个测试可以看出,如果sql语句中含有limit,limit是对用group by进行分组,并进行相关计算以后的limit操作,而不是对limit后面的指定记录数进行分组,从n那一列的数据每一行的值都大于10就可以看出来。

5,测试五
用以下两种形式的distinct均可以得到相同的记录数,写法不同,结果一样。

sql语句:
 

select count(distinct(songid)) from feedback;
select count(distinct songid) from feedback;

6,测试六
field singername is string,max(singername),如果singername有些列为空,有些列不为空,则max(singername)取非空的值,如果一列为zxx,一列为lady,则取zxx,按字母顺利取的。

sql语句:
 

select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;

7,sql语句中where,group by,order by及limit的顺序

sql语句:
 

where xxx,group by xxx,order by xxx,limit xxx

8,group by与count的问题
如果sql语句中含有group by,则最好不要将count sql转换为select count(*) from xxx,否则select与from之间的字段很有可能是后面要使用的。

例子:
 

select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;

报错:
MySQL Query Error: SELECT COUNT(*) FROM feedback GROUP BY songid ORDER BY new_time DESC Error Info:Unknown column 'new_time' in 'order clause'



(责任编辑:IT)