在数据表中经常会存在重复的数据,而我们往往要对这些重复数据进行处理,包括:防止表中出现重复数据,查询重复记录,统计重复数据,过滤重复数据,删除重复数据。
防止表中出现重复数据:
若我们如下创建一张表,创建时未设置主键或者索引,则该表允许出现重复记录:
create table person(
first_name varchar(20),
last_name varchar(20),
sex varchar(10)
);
此时使用如下两种方式可以有效防止表中出现重复的数据:
- 设置指定的字段为PRIMARY KEY
create table person(
first_name varchar(20) not null,
last_name varchar(20) not null,
sex varchar(10),
primary key(first_name,last_name)
);
注:因为此处设置双主键模式来设置数据的唯一性,所以这两个键的默认值不能为null,故都设置为not null
- 设置UNIQUE索引
CREATE TABLE person(
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(20) NOT NULL,
sex VARCHAR(10),
UNIQUE(first_name,last_name)
);
查询重复记录:
这里举两个例子:
- 查询user表中重复的user_name的个数
SELECT user_name,COUNT(*) AS COUNT
FROM USER
GROUP BY user_name HAVING COUNT>1;
- 查询people表中id相同的所有信息:
SELECT * FROM people
WHERE id IN(SELECT id FROM people GROUP BY id HAVING COUNT(id)>1);
统计重复信息:
以下代码统计person_tbl中first_name和last_name的重复记录数:
SELECT COUNT(*)AS repetitons,last_name,first_name
FROM person_tbl
GROUP BY first_name,last_name
HAVING repetitons > 1;
一般情况下,查询重复的值,请执行以下操作:
- 确定哪一列包含的值可能会重复
- 在列选择列表使用count(*)列出的那些列
- 在GROUP BY子句中列出的列
- Having子句设置重复数大于1
过滤重复信息:
如果你需要读取不重复的数据在select语句中使用DISTINCT关键字来过滤重复数据
SELECT DISTINCT last_name,first_name
FROM person_tbl
ORDER BY last_name;
你也可以使用GROUP BY来读取数据表中不重复的数据:
SELECT first_name,last_name
FROM person_tbl
GROUP BY(first_name,last_name);
删除重复信息:
如果你想删除数据表中的重复数据,可以使用以下SQL语句:
CREATE TABLE tmp SELECT last_name,first_name,sex
FROM person;
GROUP BY (last_name,first_name);
DROP TABLE person;
ALTER TABLE tmp RENAME TO person;
当然,在数据表中添加index和primary key可以更简单的删除表中重复记录:
ALTER IGNORE TABLE person
ADD PRIMARY KEY(first_name,last_name);