MySQL은 표준 SQL의 INTERSECT 연산자를 지원하지 않습니다. 하지만 EXISTS 연산자를 활용하면 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)
두 테이블을 비교해 보면 studentid 101(YashPal), 105(Gaurav), 130(Ram), 132(Shyam), 133(Mohan)에 해당하는 학생 정보가 양쪽 모두에 존재합니다. 반면 Student_detail에만 있는 150(Rajesh), 160(Pradeep)과 Student_info에만 있는 165(Abhimanyu)는 교집합에서 제외됩니다.
EXISTS 연산자로 INTERSECT 시뮬레이트하기
아래 쿼리는 WHERE 절과 함께 EXISTS 연산자를 사용하여, 두 테이블 모두에 존재하면서 이름이 'Yashpal'이 아닌 학생의 studentid, Name, Address라는 여러 표현식(컬럼)을 한 번에 반환함으로써 INTERSECT를 시뮬레이트합니다.
mysql> Select Student_detail.studentid,Student_detail.name, student_detail.address FROM student_detail WHERE Student_detail.studentid >100 AND EXISTS (SELECT * FROM Student_info WHERE Student_info.Name <> 'Yashpal' AND Student_info.studentid = Student_detail.studentid AND Student_info.name = Student_detail.name); +-----------+--------+------------+ | studentid | name | address | +-----------+--------+------------+ | 105 | Gaurav | Chandigarh | | 130 | Ram | Jhansi | | 132 | Shyam | Chandigarh | | 133 | Mohan | Delhi | +-----------+--------+------------+ 4 rows in set (0.00 sec)
쿼리 동작 원리
- 외부 쿼리: Student_detail 테이블에서 studentid가 100보다 큰 행을 조회 대상으로 삼습니다.
- EXISTS 서브쿼리: Student_info 테이블에서 동일한 studentid와 동일한 name을 가진 행이 실제로 존재하는지 검사합니다.
- 이름 조건:
Student_info.Name <> 'Yashpal'조건 때문에 두 테이블 모두에 존재하더라도 이름이 'Yashpal'인 행은 최종 결과에서 제외됩니다.
그 결과, 두 테이블의 교집합에 해당하면서 이름이 'Yashpal'이 아닌 4개의 행(Gaurav, Ram, Shyam, Mohan)만 반환되었습니다. 이처럼 EXISTS 연산자를 응용하면 MySQL 환경에서도 INTERSECT와 동일한 교집합 연산을 손쉽게 구현할 수 있습니다.