创建测试表和数据
# 创建表
create table if not exists t_duplicate (
name varchar(255) not null,
age int not null
);
# 插入测试数据
insert into t_duplicate(name, age) values('a', 1);
insert into t_duplicate(name, age) values('a', 2);
查询单个字段重复
使用 count() 函数、group by 分组和 having 分组后筛选
select name, count(*) count
from t_duplicate
group by name
having count > 1;
-
group by name
:根据 name
字段分组。
-
count(*)
:计算每个分组的记录数量。
-
having count > 1
:在分组后筛选分组的记录数 > 1 的分组。
查询结果:
使用子查询和 in 函数
select *
from t_duplicate
where name in (
select name
from t_duplicate
group by name
having count(*) > 1
)
- 子查询:根据
name
分组,筛选分组的记录数 > 1 的分组,即查询重复的 name
。
- 外部查询:用
in
筛选 name
重复的记录。
查询结果:
使用窗口函数 over 和 partition by 分区
select `name`, count
from (
select name, (count(*) over (partition by name)) as count
from t_duplicate
) t
where count > 1
-
partition by name
:按照 name
字段分区,相同的 name
值在一个分区。
-
count(*) over
:计算每个分区的记录数。
-
count > 1
:筛选分区记录数 > 1 的数据。
查询结果:
查询多个字段重复
……