두 개의 테이블을 다루다 보면, 한 테이블의 특정 열 값이 다른 테이블의 열 값과 일치하는 경우에만 해당 데이터를 조회해야 하는 상황이 자주 발생합니다. 이럴 때 서브쿼리(subquery)와 EXISTS 연산자를 함께 사용하면 간단하게 해결할 수 있습니다.
아래 예제를 통해 단계별로 살펴보겠습니다.
1. 첫 번째 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1 -> ( -> Id int, -> SubjectName varchar(20) -> ); Query OK, 0 rows affected (0.58 sec)
INSERT 명령으로 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1 values(111,'MySQL'); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1 values(112,'MongoDB'); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable1 values(113,'Java'); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable1 values(114,'C'); Query OK, 1 row affected (0.27 sec) mysql> insert into DemoTable1 values(115,'MySQL'); Query OK, 1 row affected (0.23 sec)
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1;
실행 결과는 다음과 같습니다.
+------+-------------+ | Id | SubjectName | +------+-------------+ | 111 | MySQL | | 112 | MongoDB | | 113 | Java | | 114 | C | | 115 | MySQL | +------+-------------+ 5 rows in set (0.00 sec)
2. 두 번째 테이블 생성하기
이제 비교 대상이 될 두 번째 테이블을 생성합니다.
mysql> create table DemoTable2 -> ( -> FirstName varchar(20), -> StudentSubject varchar(20) -> ); Query OK, 0 rows affected (0.73 sec)
마찬가지로 INSERT 명령으로 레코드를 추가합니다.
mysql> insert into DemoTable2 values('Chris','MySQL');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable2 values('Bob','MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2 values('Sam','MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2 values('Carol','C');
Query OK, 1 row affected (0.19 sec)테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable2;
실행 결과는 다음과 같습니다.
+-----------+----------------+ | FirstName | StudentSubject | +-----------+----------------+ | Chris | MySQL | | Bob | MySQL | | Sam | MySQL | | Carol | C | +-----------+----------------+ 4 rows in set (0.00 sec)
3. EXISTS를 활용한 조건부 데이터 조회
이제 핵심 쿼리입니다. 아래 쿼리는 DemoTable1의 SubjectName 값이 DemoTable2의 StudentSubject 값과 일치하는 행이 존재하는 경우에만 해당 Id를 조회합니다.
mysql> select Id from DemoTable1 -> where exists -> ( -> select 1 from DemoTable2 -> where SubjectName=StudentSubject -> );
실행 결과는 다음과 같습니다.
+------+ | Id | +------+ | 111 | | 114 | | 115 | +------+ 3 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 Id가 111(MySQL), 114(C), 115(MySQL)인 행만 반환되었습니다. 이는 세 과목명이 모두 DemoTable2의 StudentSubject 열에 존재하기 때문입니다. 반면 MongoDB(112)와 Java(113)는 두 번째 테이블에 일치하는 값이 없으므로 결과에서 제외되었습니다.
이처럼 EXISTS 연산자와 서브쿼리를 조합하면, 두 테이블 간의 값 일치 여부를 손쉽게 판단하여 원하는 데이터만 정확하게 추출할 수 있습니다.