MySQL 테이블에서 중복 값 찾기
데이터베이스를 운영하다 보면 특정 컬럼에 중복된 값이 존재하는지 확인해야 하는 경우가 자주 발생합니다. 이번 글에서는 MySQL 테이블에서 중복 값을 찾는 방법을 실제 예제와 함께 살펴보겠습니다.
예제 테이블 소개
다음과 같은 stock_item 테이블이 있다고 가정해 보겠습니다. 이 테이블의 quantity(수량) 컬럼에는 중복된 값들이 존재합니다. 예를 들어 'Notebooks(공책)'과 'Pencil(연필)'은 수량이 모두 40으로 동일하며, 'Shirts', 'Shoes', 'Trousers'는 수량이 모두 29로 같습니다.
mysql> Select * from stock_item; +------------+---------+ | item_name |quantity | +------------+---------+ | Calculator | 89 | | Notebooks | 40 | | Pencil | 40 | | Pens | 32 | | Shirts | 29 | | Shoes | 29 | | Trousers | 29 | +------------+---------+ 7 rows in set (0.00 sec)
INNER JOIN을 활용한 중복 값 조회 쿼리
중복된 값을 찾는 핵심 아이디어는 같은 테이블을 자기 자신과 조인(Self Join)하는 것입니다. 아래 쿼리는 stock_item 테이블을 두 개의 별칭(g와 b)으로 조인한 후, quantity 값은 같지만 item_name은 서로 다른 행들을 찾아냅니다.
mysql> Select distinct g.item_name,g.quantity from stock_item g
-> INNER JOIN Stock_item b ON g.quantity = b.quantity
-> WHERE g.item_name<>b.item_name;
+-----------+----------+
| item_name | quantity |
+-----------+----------+
| Pencil | 40 |
| Notebooks | 40 |
| Shoes | 29 |
| Trousers | 29 |
| Shirts | 29 |
+-----------+----------+
5 rows in set (0.00 sec)쿼리 동작 원리
위 쿼리가 어떻게 작동하는지 단계별로 살펴보겠습니다.
1. Self Join: stock_item 테이블을 g와 b라는 두 개의 별칭으로 참조하여, 한 테이블 안에서 행과 행을 비교할 수 있게 만듭니다.
2. 조인 조건: ON g.quantity = b.quantity 구문은 수량이 동일한 행들만 매칭합니다.
3. 중복 판별 조건: WHERE g.item_name <> b.item_name 조건은 이름이 다른 행, 즉 같은 수량을 가진 서로 다른 상품만 남깁니다. 이 조건이 없으면 자기 자신과 매칭된 결과까지 모두 출력됩니다.
4. DISTINCT 사용: 중복된 결과 행을 제거하여 깔끔한 목록을 얻습니다.
GROUP BY와 HAVING을 사용한 대안 방법
Self Join 외에도 GROUP BY와 HAVING 절을 사용하면 더 간결하게 중복 값을 확인할 수 있습니다.
mysql> SELECT item_name, quantity
-> FROM stock_item
-> WHERE quantity IN (
-> SELECT quantity
-> FROM stock_item
-> GROUP BY quantity
-> HAVING COUNT(*) > 1
-> );
+-----------+----------+
| item_name | quantity |
+-----------+----------+
| Notebooks | 40 |
| Pencil | 40 |
| Shirts | 29 |
| Shoes | 29 |
| Trousers | 29 |
+-----------+----------+
5 rows in set (0.00 sec)서브쿼리에서 GROUP BY quantity HAVING COUNT(*) > 1로 중복된 수량 목록을 먼저 추출하고, 메인 쿼리에서 해당 수량을 가진 모든 상품을 조회하는 방식입니다. 데이터 양이 많은 경우 이 방식이 더 직관적이고 성능 면에서 유리할 수 있습니다.
마무리
MySQL에서 중복 값을 찾는 대표적인 방법은 크게 두 가지입니다. 첫째는 Self Join을 활용하는 방법이고, 둘째는 GROUP BY + HAVING을 활용하는 방법입니다. 두 방법 모두 실무에서 널리 사용되므로 상황에 맞게 선택하여 활용하시면 됩니다. 중복 데이터는 정합성 문제를 일으킬 수 있으므로, 주기적으로 이러한 쿼리를 통해 데이터 품질을 점검하는 것이 좋습니다.