创建测试表和数据
sql
# 创建表
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 分组后筛选
sql
select name, count(*) count
from t_duplicate
group by name
having count > 1;
group by name
:根据name
字段分组。count(*)
:计算每个分组的记录数量。having count > 1
:在分组后筛选分组的记录数 > 1 的分组。
查询结果:
name | count |
---|---|
a | 2 |
使用子查询和 in 函数
sql
select *
from t_duplicate
where name in (
select name
from t_duplicate
group by name
having count(*) > 1
)
- 子查询:根据
name
分组,筛选分组的记录数 > 1 的分组,即查询重复的name
。 - 外部查询:用
in
筛选name
重复的记录。
查询结果:
name | age |
---|---|
a | 1 |
a | 2 |
使用窗口函数 over 和 partition by 分区
sql
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 的数据。
查询结果:
name | count |
---|---|
a | 2 |
a | 2 |
查询多个字段重复
......