MySQL에서 여러 열의 값이 완전히 일치하는 행 조회하기
MySQL에서 하나 이상의 열을 기준으로 값이 정확히 일치하는(중복되는) 행을 찾으려면 GROUP BY와 HAVING 절을 서브쿼리와 함께 사용하면 됩니다. 이 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1861
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(20),
Marks int
);
Query OK, 0 rows affected (0.00 sec)
2. 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1861(Name,Marks) values('John',45);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('Chris',74);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('David',89);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('Chris',74);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1861(Name,Marks) values('John',49);
Query OK, 1 row affected (0.00 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1861;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+----+-------+-------+
| Id | Name | Marks |
+----+-------+-------+
| 1 | John | 45 |
| 2 | Chris | 74 |
| 3 | David | 89 |
| 4 | Chris | 74 |
| 5 | John | 49 |
+----+-------+-------+
5 rows in set (0.00 sec)
4. 중복된 값을 가진 행 찾기
하나 이상의 열에서 값이 정확히 일치하는 행을 찾는 핵심 쿼리입니다. 서브쿼리에서 Name과 Marks를 그룹화한 뒤, 개수가 2개 이상인 조합만 필터링합니다.
mysql> select Id,Name,Marks from DemoTable1861
where (Name,Marks) IN ( select Name,Marks from DemoTable1861
group by Name,Marks
having count(*) > 1);
실행 결과는 다음과 같습니다.
+----+-------+-------+
| Id | Name | Marks |
+----+-------+-------+
| 2 | Chris | 74 |
| 4 | Chris | 74 |
+----+-------+-------+
2 rows in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 작동하는 방식을 간단히 설명하면 다음과 같습니다.
1단계: 서브쿼리가 Name과 Marks 열을 기준으로 전체 데이터를 그룹화합니다.
2단계: HAVING count(*) > 1 조건을 통해 두 열의 값이 모두 동일한 조합, 즉 중복된 그룹만 남깁니다.
3단계: 외부 쿼리의 WHERE 절에서 (Name, Marks) IN 구문을 사용해 해당 조합과 일치하는 모든 행을 최종적으로 반환합니다.
결과적으로 'Chris'와 '74'라는 값이 모두 일치하는 2번, 4번 행만 조회된 것을 확인할 수 있습니다. 반면 John은 이름은 같지만 점수가 다르기 때문에(45와 49) 제외됩니다. 이처럼 GROUP BY HAVING과 서브쿼리를 활용하면 여러 열의 조합이 완전히 일치하는 중복 행을 손쉽게 찾을 수 있습니다.