mysql删除重复记录并且只保留一条

mysql删除重复记录并且只保留一条(deptno id,dname 名字)

a. 第一种方法:

根据depno来判断,除了rowid最小的一个

SELECT
	*
FROM
	dept
WHERE
	dname IN (
		SELECT
			dname
		FROM
			dept
		GROUP BY
			dname
		HAVING
			COUNT(1) > 1
	)
AND deptno NOT IN (
	SELECT
		MIN(deptno)
	FROM
		dept
	GROUP BY
		dname
	HAVING
		COUNT(1) > 1
)

上面这种写法正确,但是查询的速度太慢,可以试一下下面这种方法:

b. 第二种方法:(删除只是将select改为delete)

根据dname分组,查找出deptno最小的。然后再查找deptno不包含刚才查出来的。这样就查询出了所有的重复数据(除了deptno最小的那行)

SELECT *
FROM
	dept
WHERE
	deptno NOT IN (
		SELECT
			dt.minno
		FROM
			(
				SELECT
					MIN(deptno) AS minno
				FROM
					dept
				GROUP BY
					dname
			) dt

	)

总结:

其实上面的方法还有很多需要优化的地方,如果数据量太大的话,执行起来很慢,可以考虑加优化一下:

  • 在经常查询的字段上加上索引
  • 将*改为你需要查询出来的字段,不要全部查询出来
  • 小表驱动大表用IN,大表驱动小表用EXISTS。IN适合的情况是外表数据量小的情况,而不是外表数据大的情况,因为IN会遍历外表的全部数据,假设a表100条,b表10000条那么遍历次数就是100*10000次,而exists则是执行100次去判断a表中的数据是否在b表中存在,它只执行了a.length次数。至于哪一个效率高是要看情况的,因为in是在内存中比较的,而exists则是进行数据库查询操作的
posted @ 2021-01-19 14:47  caibaotimes  阅读(200)  评论(0编辑  收藏  举报