sql去重常用的基本方法
1.存在两条完全相同的纪录
select distinct * from table(表名) where (条件)
2.存在部分字段相同的纪录(有主键id即唯一键)
如果是这种情况的话用distinct是过滤不了的,这就要用到主键id的唯一性特点及group by分组
例子:
select * from table where id in (select max(id) from table group by [去除重复的字段名列表,..]
3.没有唯一键ID
m.*表示取m表的所有字段,然后其他的表不需要用到id,其他表只取特定字段,这样就不会发生id重复的问题了
例子:有成绩表和学生表
#成绩表
CREATE TABLE `SCORE` (
`SNO` varchar(3) NOT NULL,
`CNO` varchar(5) NOT NULL,
`DEGREE` decimal(10,1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `SCORE` VALUES ('103','3-245',86.0),('105','3-245',75.0),('109','3-245',68.0),('103','3-105',92.0),('105','3-105',88.0),('109','3-105',76.0),('101','3-105',64.0),('107','3-105',91.0),('101','6-166',85.0),('107','6-106',79.0),('108','3-105',78.0),('108','6-166',81.0);
#学生表
CREATE TABLE `STUDENT` (
`SNO` varchar(3) NOT NULL,
`SNAME` varchar(4) NOT NULL,
`SSEX` varchar(2) NOT NULL,
`SBIRTHDAY` datetime DEFAULT NULL,
`CLASS` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `STUDENT` VALUES ('108','曾华','男','1977-09-01 00:00:00','95033'),('105','匡明','男','1975-10-02 00:00:00','95031'),('107','王丽','女','1976-01-23 00:00:00','95033'),('101','李军','男','1976-02-20 00:00:00','95033'),('109','王芳','女','1975-02-10 00:00:00','95031'),('103','陆君','男','1974-06-03 00:00:00','95031');
需求是查询所有选修“计算机导论”课程的“男”同学的成绩表
如果使用select * from table的方式会出现重复字段
SELECT * FROM score a,student b
WHERE a.sno = b.sno
AND b.ssex='男'
AND cno = (
SELECT cno FROM course WHERE cname='计算机导论'
)
查询结果如下
解决方案就是按需查询:
m.*表示取m表的所有字段,然后其他的表不需要用到id,其他表只取特定字段,这样就不会发生id重复的问题了
SELECT b.*,a.cno,a.degree FROM score a,student b
WHERE a.sno = b.sno
AND b.ssex='男'
AND cno = (
SELECT cno FROM course WHERE cname='计算机导论'
)
查询结果如下