개요
MySQL에서 두 개 이상의 행이 같은 값을 가지고 있는지 확인하려면 SELF JOIN(자기 조인) 기법을 활용하면 됩니다. 이 글에서는 실제 예제를 통해 JOIN 쿼리로 특정 컬럼의 중복 값을 찾아내는 방법을 알아보겠습니다.
예제 데이터 준비
먼저 아래와 같은 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)
JOIN을 이용한 중복 값 조회 쿼리
아래 쿼리는 stock_item 테이블을 자기 자신과 INNER JOIN하여 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: 동일한 테이블에 별칭(alias) g와 b를 부여해 마치 두 개의 다른 테이블처럼 조인합니다.
2. 조인 조건: ON g.quantity = b.quantity 조건으로 수량이 같은 행들끼리 매칭시킵니다.
3. 중복 판별 조건: WHERE g.item_name <> b.item_name 절을 통해 항목 이름이 서로 다른 경우만 남깁니다. 이름이 같다면 자기 자신과 매칭된 결과이므로 제외하는 것입니다.
4. DISTINCT: 조인 과정에서 발생할 수 있는 중복된 결과 행을 제거하여 깔끔한 목록을 반환합니다.
마무리
이처럼 SELF JOIN과 조건절을 조합하면 별도의 GROUP BY나 HAVING 절 없이도 간단하게 중복 데이터를 식별할 수 있습니다. 데이터 정합성 검사나 중복 레코드 정리 작업 시 유용하게 활용할 수 있는 방법입니다.