MySQL에는 다른 관계형 데이터베이스처럼 INTERSECT 연산자가 기본적으로 제공되지 않습니다. 하지만 IN 연산자와 WHERE 절을 함께 사용하면 INTERSECT와 동일한 결과, 즉 두 테이블의 교집합 데이터를 손쉽게 구할 수 있습니다. 아래 예제를 통해 구체적인 방법을 알아보겠습니다.
예제 준비: 샘플 테이블 생성
이번 예제에서는 Student_detail과 Student_info라는 두 개의 테이블을 사용합니다. 각 테이블의 데이터는 다음과 같습니다.
mysql> Select * from Student_detail; +-----------+---------+------------+------------+ | studentid | Name | Address | Subject | +-----------+---------+------------+------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Chandigarh | Literature | | 130 | Ram | Jhansi | Computers | | 132 | Shyam | Chandigarh | Economics | | 133 | Mohan | Delhi | Computers | | 150 | Rajesh | Jaipur | Yoga | | 160 | Pradeep | Kochi | Hindi | +-----------+---------+------------+------------+ 7 rows in set (0.00 sec) mysql> Select * from Student_info; +-----------+-----------+------------+-------------+ | studentid | Name | Address | Subject | +-----------+-----------+------------+-------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Chandigarh | Literature | | 130 | Ram | Jhansi | Computers | | 132 | Shyam | Chandigarh | Economics | | 133 | Mohan | Delhi | Computers | | 165 | Abhimanyu | Calcutta | Electronics | +-----------+-----------+------------+-------------+ 6 rows in set (0.00 sec)
IN 연산자로 INTERSECT 시뮬레이트하기
다음 쿼리는 WHERE 절과 IN 연산자를 조합하여, 두 테이블 모두에 존재하면서 studentid 값이 130보다 큰 행만 조회합니다. 이것이 바로 INTERSECT 연산의 결과와 같습니다.
mysql> Select Student_detail.studentid FROM Student_detail
-> WHERE student_detail.studentid > 130
-> AND student_detail.studentid IN
-> (SELECT Student_info.studentid FROM Student_info
-> WHERE Student_detail.studentid > 0);
+-----------+
| studentid |
+-----------+
| 132 |
| 133 |
+-----------+
2 rows in set (0.00 sec)결과를 보면 Student_detail 테이블에서 studentid가 130보다 큰 값 중, 서브쿼리로 조회한 Student_info 테이블의 studentid 목록(101, 105, 130, 132, 133, 165)에도 포함되어 있는 132와 133만 반환된 것을 확인할 수 있습니다.
동작 원리 정리
- 외부 쿼리의 WHERE 절: 첫 번째 테이블(
Student_detail)에서 studentid > 130인 조건으로 행을 필터링합니다. - IN 연산자와 서브쿼리: 두 번째 테이블(
Student_info)의 studentid 값 목록을 가져와, 외부 쿼리 결과 중 이 목록에 포함되는 행만 남깁니다. - 최종 결과: 두 조건을 모두 만족하는 행, 즉 두 테이블의 교집합만 출력됩니다.
참고: INNER JOIN을 활용한 대안
같은 결과는 INNER JOIN을 통해서도 얻을 수 있으며, 대량의 데이터를 다룰 때는 옵티마이저가 더 효율적으로 처리하는 경우가 많습니다.
SELECT DISTINCT a.studentid FROM Student_detail a INNER JOIN Student_info b ON a.studentid = b.studentid WHERE a.studentid > 130;
이처럼 MySQL에서 INTERSECT가 필요할 때는 IN 연산자를 이용한 서브쿼리 방식 또는 INNER JOIN 방식을 상황에 맞게 선택하여 사용하면 됩니다.