count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)

  1. 查询全部重复的数据:
Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)
  1. 删除全部重复试题:

将上面的查询select改为delete(这样会出错的)

DELETE FROM dept WHERE dname IN (
 SELECT dname FROM dept GROUP BY dname HAVING count(1) > 1
)

会出现如下错误:

[Err] 1093 - You can't specify target table 'dept' for update in FROM clause

原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作

解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。

DELETE FROM table WHERE id IN (
 SELECT id FROM (
    SELECT id,COUNT(*) FROM table GROUP BY id HAVING COUNT(*) > 1 
 ) AS a
);

缺点:此语句可能需要执行多次才能删除干净,建议改写存储过程