mysql distinct语句去除重复值测试
时间:2015-02-22 15:21 来源:linux.it.net.cn 作者:IT
在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)
在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都相同的才被排除了,与期望结果不一样。
#---------------
例子:
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;
返回结果:
2、测试二
select * from student;
c 2 c 5
例子:
select distinct name,age from student;
返回结果,说明distinct后面有多于一列的字段时,只有每列的值完全相同才过滤:
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,测试四
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,测试五
sql语句:
select count(distinct(songid)) from feedback;
select count(distinct songid) from feedback;
6,测试六
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的问题
例子:
select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;
报错: (责任编辑:IT) |