Mysql 去除重复数据和去除同名列(distinct、group by、using())

感觉网上很多表述都有些问题,网上很多讲述“列去重”的意思都说把当前的列重复的数据去重,但是还有一种情况是关联表查询后出现大量重复同名列的情况,假如对这种列的结果进行嵌套查询,就有可能报Duplicate column name 'XXX'的错误,或者指代不明Column 'XXX' in field list is ambiguous的错误。

假如有这样两张表(仅供参考,不代表有实际数据库设计)

ta
stu_id stu_name org_id class_id sub_id score
1001 张三 123 11 401 88
1002 李四 123 12 401 78
1003 王五 123 11 401 97
1004 陆六 321 11 401 65
1001 张三 123 11 402 87
1002 李四 123 12 402 93
1003 王五 123 11 402 99
1004 陆六 321 11 403 89
tb
tea_id tea_name org_id class_id sub_id
2001 乔治 123 11 401
2001 乔治 123 12 401
2002 佩奇 123 12 402
2002 佩奇 321 11 401
2003 吉吉 123 12 401
2003 吉吉 321 11 403

一.去重同一列的重复数据

1.distinct

需求:找出tb中org_id的种类

分析:单表查询并去重相同的org_id值

select distinct(org_id) from tb

查询结果:

org_id
123
321

2.group by

需求:查询学生总分

分析:单表查询,分组统计成绩

select stu_id,stu_name,sum(score) from ta group by stu_id,stu_name

查询结果

stu_id stu_name sum
1001 张三 175
1002 李四 171
1003 王五 196
1004 陆六 154

错误示例:不分组会出现数据重复显示

select stu_id,stu_name,sum(score) from ta
stu_id stu_name sum
1001 张三 175
1002 李四 171
1003 王五 196
1004 陆六 154
1001 张三 175
1002 李四 171
1003 王五 196
1004 陆六 154

3.其他常用的方法还有row_number over(),LIMIT 等,本人用得比较少,可以自行了解。

二.重复的同名列

一般出现在合并表查询中

需求:找出乔治教的学生和老师所有信息

分析:找出乔治任教班级和科目,关联学生表

select * from ta inner join tb on ta.class_id =tb.class_id where tea_name = '乔治'

查询结果:

可以看到查询的结果是有重复的同名列,当然在查询的时候,会把后面的同名列自动重命名

分析:那么我们如果想把进行关联的同名列合并显示,可以改用USING()来代替ON,来去重

select * from ta inner join tb using(class_id) where tea_name = '乔治'

查询结果:

stu_id stu_name org_id class_id sub_id score tea_id tea_name org_id(1)
1001 张三 123 11 401 88 2001 乔治 123
1002 李四 123 12 401 78 2001 乔治 123
1003 王五 123 11 401 97 2001 乔治 123

可以看到没有关联的org_id还是会自动重命名。

问题来了,如果要进行嵌套查询,比如(实际意义的例子暂时没想到,容我这样举例。。)

select class_id from (select * from ta inner join tb using(class_id) where tea_name = '乔治') tc

就会出现 Duplicate column name 'org_id'这种错误

原因是sql在合并表重命名第二个同名列实际上还是存成org_id,只是呈现出来不一样。所以方法有几个:

1.对第二个org_id进行人为重命名

2.把org_id纳入到using()中,保证查询结果只有一个org_id

3.select出想要的字段,避免重名列干扰

猜你喜欢

转载自blog.csdn.net/qq_33562122/article/details/123519827