创建测试表和数据
# 创建表
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 的分组。
查询结果:
| name | count |
|---|---|
| a | 2 |
使用子查询和 in
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 分区
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 |
查询多个字段重复
……
评论区