MySQL JOIN을 사용하면 특정 열에 동일한 데이터가 두 개 이상의 레코드에 존재하는 행을 손쉽게 조회할 수 있습니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable ( UserId int, UserName varchar(20) ); Query OK, 0 rows affected (0.54 sec)
2단계: 레코드 삽입
insert 명령어를 사용해 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable values(10,'John'); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable values(11,'Sam'); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable values(12,'Larry'); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable values(13,'David'); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable values(14,'Larry'); Query OK, 1 row affected (0.10 sec)
3단계: 테이블 데이터 확인
select 명령어로 테이블의 전체 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 10 | John | | 11 | Sam | | 12 | Larry | | 13 | David | | 14 | Larry | +--------+----------+ 5 rows in set (0.00 sec)
위 결과에서 'Larry'라는 이름이 UserId 12와 14, 즉 두 개의 레코드에 중복되어 있는 것을 확인할 수 있습니다.
4단계: 중복 데이터가 있는 행 조회
다음은 특정 열에 동일한 데이터가 두 개 이상의 레코드에 존재하는 행을 선택하는 쿼리입니다.
mysql> SELECT DISTINCT tbl1.* FROM DemoTable tbl1 JOIN DemoTable tbl2 on tbl2.UserId <> tbl1.UserId AND tbl2.UserName=tbl1.UserName;
실행 결과는 다음과 같습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 14 | Larry | | 12 | Larry | +--------+----------+ 2 rows in set (0.14 sec)
쿼리 동작 원리
이 쿼리는 같은 테이블(DemoTable)을 tbl1과 tbl2라는 두 개의 별칭으로 조인하는 셀프 조인(Self Join) 기법을 사용합니다. 조인 조건은 다음 두 가지입니다.
tbl2.UserId <> tbl1.UserId: 자기 자신을 제외한 서로 다른 레코드끼리만 비교합니다.tbl2.UserName = tbl1.UserName: UserName 값이 동일한 경우에만 매칭합니다.
마지막으로 DISTINCT를 사용해 중복된 결과 행을 제거함으로써, 동일한 이름을 가진 모든 레코드를 깔끔하게 출력할 수 있습니다. 이 방식은 이메일, 사용자명 등 고유해야 하는 값의 중복 여부를 점검할 때도 유용하게 활용됩니다.