MySQL에서 중복 데이터를 확인하려면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. 이 조합은 특정 열(또는 여러 열)의 값이 동일한 행들을 그룹으로 묶은 뒤, 그룹 내 행 개수가 2개 이상인 경우만 필터링하여 중복을 손쉽게 찾아낼 수 있습니다.
기본 문법
SELECT yourColumnName1, yourColumnName2, ......N, COUNT(*) AS anyVariableName FROM yourTableName GROUP BY yourColumnName1, yourColumnName2 HAVING COUNT(*) > 1;
예제 테이블 생성
문법을 실제로 이해하기 위해 먼저 예제용 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE DuplicateDemo -> ( -> StudentId int NOT NULL, -> StudentFirstName varchar(100), -> StudentLastName varchar(100), -> PRIMARY KEY(StudentId) -> ); Query OK, 0 rows affected (0.50 sec)
샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 입력합니다. 일부러 이름이 겹치는 데이터를 포함시켰습니다.
mysql> INSERT INTO DuplicateDemo VALUES(1,'John','Smith'); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO DuplicateDemo VALUES(2,'Mike','Jones'); Query OK, 1 row affected (0.28 sec) mysql> INSERT INTO DuplicateDemo VALUES(3,'David','Smith'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO DuplicateDemo VALUES(4,'Carol','Taylor'); Query OK, 1 row affected (0.20 sec) mysql> INSERT INTO DuplicateDemo VALUES(5,'David','Smith'); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DuplicateDemo VALUES(6,'John','Smith'); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO DuplicateDemo VALUES(7,'John','Taylor'); Query OK, 1 row affected (0.15 sec)
전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> SELECT * FROM DuplicateDemo;
실행 결과는 다음과 같습니다.
+-----------+------------------+-----------------+ | StudentId | StudentFirstName | StudentLastName | +-----------+------------------+-----------------+ | 1 | John | Smith | | 2 | Mike | Jones | | 3 | David | Smith | | 4 | Carol | Taylor | | 5 | David | Smith | | 6 | John | Smith | | 7 | John | Taylor | +-----------+------------------+-----------------+ 7 rows in set (0.00 sec)
중복 데이터 확인 쿼리
이제 이름(StudentFirstName)과 성(StudentLastName) 두 열을 기준으로 중복된 데이터를 찾는 쿼리를 실행해 보겠습니다.
mysql> SELECT StudentFirstName, StudentLastName, COUNT(*) AS Total FROM DuplicateDemo GROUP BY StudentFirstName, StudentLastName HAVING COUNT(*) > 1;
실행 결과는 다음과 같습니다.
+------------------+-----------------+-------+ | StudentFirstName | StudentLastName | Total | +------------------+-----------------+-------+ | John | Smith | 2 | | David | Smith | 2 | +------------------+-----------------+-------+ 2 rows in set (0.00 sec)
결과 해석
위 결과를 보면 'John Smith'와 'David Smith'가 각각 2번씩 등장했음을 알 수 있습니다. 즉, 이름과 성이 모두 동일한 학생 레코드가 중복으로 존재하는 것입니다. 반면 'John Taylor'는 이름은 같지만 성이 다르기 때문에 중복으로 판별되지 않았습니다.
이처럼 GROUP BY에 비교하고자 하는 열을 모두 나열하고, HAVING 절에서 COUNT(*) > 1 조건을 걸면 여러 열을 기준으로 한 중복 데이터를 간단하게 검출할 수 있습니다. 필요에 따라 COUNT(*) 대신 별칭(Total)을 사용해 가독성을 높일 수도 있습니다.