Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 테이블에서 중복 데이터 삭제하기 – DELETE와 INNER JOIN 활용법

MySQL 테이블에서 중복 데이터 삭제하기

MySQL 테이블에 동일한 데이터가 여러 번 저장되어 있다면, DELETE 문과 INNER JOIN을 조합하여 중복 행을 손쉽게 제거할 수 있습니다. 이 방식은 같은 테이블을 두 개의 별칭(alias)으로 조인한 뒤, 조건에 맞는 중복 행만 골라 삭제하는 원리로 동작합니다.

기본 문법

delete tbl1 from yourTableName anyAliasName1
inner join yourTableName anyAliasName2
where
yourCondition1
and
yourCondition2

예제 테이블 생성

먼저 실습용 테이블을 만들어 보겠습니다.

mysql> create table demo14
-> (
-> id int not null auto_increment primary key,
-> name varchar(30)
-> );
Query OK, 0 rows affected (1.89 sec)

데이터 삽입

insert 명령을 사용해 몇 개의 레코드를 추가합니다. 이때 'John'과 'David'는 의도적으로 중복 입력합니다.

mysql> insert into demo14(name) values('John');
Query OK, 1 row affected (0.14 sec)

mysql> insert into demo14(name) values('David');
Query OK, 1 row affected (0.18 sec)

mysql> insert into demo14(name) values('David');
Query OK, 1 row affected (0.09 sec)

mysql> insert into demo14(name) values('Bob');
Query OK, 1 row affected (0.15 sec)

mysql> insert into demo14(name) values('John');
Query OK, 1 row affected (0.45 sec)

mysql> insert into demo14(name) values('Carol');
Query OK, 1 row affected (0.16 sec)

현재 데이터 확인

select 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from demo14;

실행 결과는 다음과 같습니다.

+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | David |
|  3 | David |
|  4 | Bob   |
|  5 | John  |
|  6 | Carol |
+----+-------+
6 rows in set (0.00 sec)

'David'와 'John'이 각각 두 번씩 저장되어 있는 것을 확인할 수 있습니다.

중복 행 삭제 쿼리

다음은 테이블에서 중복 행을 삭제하는 쿼리입니다. 핵심 조건은 tbl1.id < tbl2.id로, 같은 이름을 가진 행들 중 id가 작은(먼저 입력된) 행을 삭제하고 가장 나중에 입력된 행만 남기는 방식입니다.

mysql> delete tbl1 from demo14 tbl1
-> inner join demo14 tbl2
-> where
-> tbl1.id < tbl2.id and
-> tbl1.name = tbl2.name
-> ;
Query OK, 2 rows affected (0.20 sec)

삭제 후 결과 확인

다시 select 문으로 데이터를 조회해 보겠습니다.

mysql> select *from demo14;

실행 결과는 다음과 같습니다.

+----+-------+
| id | name  |
+----+-------+
|  3 | David |
|  4 | Bob   |
|  5 | John  |
|  6 | Carol |
+----+-------+
4 rows in set (0.00 sec)

중복되던 행들이 제거되고 각 이름이 한 번씩만 남은 것을 확인할 수 있습니다. 총 2개의 중복 행(id 1의 'John', id 2의 'David')이 삭제되었습니다.

정리

같은 테이블을 서로 다른 별칭으로 INNER JOIN한 뒤, 중복 판단 기준이 되는 컬럼(name)이 같으면서 기준 컬럼(id) 값이 더 작은 행을 DELETE하면 중복 데이터를 깔끔하게 정리할 수 있습니다. 대용량 테이블에서 실행하기 전에는 반드시 백업을 해두거나, 먼저 SELECT 문으로 삭제 대상 행을 확인하는 것이 안전합니다.