MySQL 두 테이블에서 일치하는 ID 레코드 가져오기
MySQL에서 서로 다른 두 테이블에 동일한 ID가 존재하는 레코드만 추출해야 하는 경우가 자주 있습니다. 이럴 때 IN 연산자와 서브쿼리를 활용하면 간단하게 해결할 수 있습니다. 이번 글에서는 실제 예제를 통해 두 테이블에서 공통된 ID를 가진 레코드를 조회하는 방법을 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성하기
먼저 첫 번째 테이블을 생성합니다.
mysql> create table DemoTable1
(
Id int
);
Query OK, 0 rows affected (1.26 sec)
2단계: 첫 번째 테이블에 데이터 삽입하기
INSERT 명령을 사용하여 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1 values(100);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1 values(110);
Query OK, 1 row affected (0.49 sec)
mysql> insert into DemoTable1 values(4);
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable1 values(3);
Query OK, 1 row affected (0.18 sec)
3단계: 첫 번째 테이블의 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 100 |
| 110 |
| 4 |
| 3 |
+------+
4 rows in set (0.00 sec)
4단계: 두 번째 테이블 생성하기
이번에는 Id와 Name 컬럼을 가진 두 번째 테이블을 생성합니다.
mysql> create table DemoTable2
(
Id int,
Name varchar(50)
);
Query OK, 0 rows affected (0.78 sec)
5단계: 두 번째 테이블에 데이터 삽입하기
INSERT 명령으로 레코드를 추가합니다.
mysql> insert into DemoTable2 values(4,'Chris');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2 values(1,'David');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2 values(110,'Adam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable2 values(210,'Bob');
Query OK, 1 row affected (0.19 sec)
6단계: 두 번째 테이블의 전체 레코드 확인하기
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 4 | Chris |
| 1 | David |
| 110 | Adam |
| 210 | Bob |
+------+-------+
4 rows in set (0.00 sec)
공통 ID 레코드를 조회하는 핵심 쿼리
두 테이블에서 일치하는 ID를 가진 레코드를 가져오려면 WHERE 절에 IN 연산자와 서브쿼리를 조합하면 됩니다. 아래 쿼리는 DemoTable1에 존재하는 ID와 동일한 값을 가진 DemoTable2의 레코드만 반환합니다.
mysql> select Id,Name from DemoTable2
where Id IN (select Id from DemoTable1);
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 110 | Adam |
| 4 | Chris |
+------+-------+
2 rows in set (0.39 sec)
결과 분석
DemoTable1에는 100, 110, 4, 3이라는 네 개의 ID가 있고, DemoTable2에는 4, 1, 110, 210이라는 네 개의 ID가 있습니다. 두 테이블 모두에 존재하는 ID는 110과 4뿐입니다. 따라서 위 쿼리 결과로 Adam(ID 110)과 Chris(ID 4)의 레코드만 출력된 것입니다.
참고: INNER JOIN을 활용한 대안 방법
동일한 결과를 얻기 위해 INNER JOIN을 사용할 수도 있습니다. 대용량 데이터를 다룰 때는 JOIN 방식이 더 나은 성능을 보이는 경우가 많습니다.
mysql> select t2.Id, t2.Name from DemoTable2 t2
inner join DemoTable1 t1 on t2.Id = t1.Id;
두 방법 모두 같은 결과를 반환하지만, 상황에 따라 적절한 방식을 선택하면 됩니다. 간단한 조건 확인에는 IN 서브쿼리가 직관적이며, 여러 컬럼을 기준으로 매칭하거나 성능 최적화가 필요하다면 JOIN을 권장합니다.