MySQL 테이블에서 조건에 맞는 여러 레코드를 한 번에 삭제하려면 JOIN을 활용한 DELETE 문을 사용하면 됩니다. 이 글에서는 예제 테이블을 만들고, JOIN을 이용해 특정 이름의 중복 데이터를 모두 삭제하는 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. Id 컬럼은 자동 증가(AUTO_INCREMENT) 기본키로 설정하고, FirstName은 최대 100자의 문자열로 정의합니다.
mysql> create table DemoTable(Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName varchar(100)); Query OK, 0 rows affected (0.69 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 입력합니다. 의도적으로 'Bob', 'Adam', 'Mike'를 중복해서 넣어 여러 행이 동시에 삭제되는 것을 확인할 수 있도록 했습니다.
mysql> insert into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(FirstName) values('Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable(FirstName) values('Adam');
Query OK, 1 row affected (0.33 sec)
mysql> insert into DemoTable(FirstName) values('Bob');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(FirstName) values('Adam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(FirstName) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.23 sec)
3. 전체 데이터 조회
SELECT 문으로 현재 저장된 모든 레코드를 확인합니다.
mysql> select * from DemoTable;
실행 결과는 다음과 같습니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Bob | | 3 | Mike | | 4 | Adam | | 5 | Bob | | 6 | Adam | | 7 | Bob | | 8 | Mike | +----+-----------+ 8 rows in set (0.00 sec)
4. JOIN을 이용한 다중 레코드 삭제
이제 JOIN을 활용해 FirstName이 'Bob'인 모든 레코드를 삭제하는 쿼리를 실행합니다. 테이블을 자기 자신과 조인(self join)하여 조건에 일치하는 행들을 한꺼번에 제거하는 방식입니다.
mysql> delete DemoTable
from DemoTable
join DemoTable tbl on DemoTable.FirstName = tbl.FirstName
where tbl.FirstName = 'Bob';
Query OK, 3 rows affected (0.15 sec)
쿼리 실행 결과 3개의 행(Id가 2, 5, 7인 'Bob' 레코드)이 삭제되었습니다.
5. 삭제 결과 확인
다시 SELECT 문으로 테이블을 조회하면 'Bob'에 해당하는 레코드가 모두 사라진 것을 확인할 수 있습니다.
mysql> select * from DemoTable;
실행 결과:
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 3 | Mike | | 4 | Adam | | 6 | Adam | | 8 | Mike | +----+-----------+ 5 rows in set (0.00 sec)
정리
MySQL에서 여러 레코드를 삭제할 때는 DELETE 문과 JOIN을 함께 사용하면 편리합니다. 특히 위 예제처럼 테이블을 자기 자신과 조인하면 특정 값과 일치하는 모든 중복 행을 한 번의 쿼리로 제거할 수 있습니다. 다만 DELETE 작업은 되돌릴 수 없으므로, 실행 전 반드시 SELECT 문으로 대상 레코드를 먼저 확인하는 습관을 들이는 것이 좋습니다.