MySQL에서 INTERSECT를 대체해야 하는 이유
표준 SQL에서 INTERSECT는 여러 SELECT 문의 결과 집합 중 공통으로 존재하는 행만 반환하는 집합 연산자입니다. 하지만 MySQL(8.0.31 이전 버전)에는 이 연산자가 기본적으로 제공되지 않습니다. 따라서 두 테이블 간의 교집합이 필요할 때는 IN 연산자와 서브쿼리를 조합하여 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, Name, Address, Subject)를 가지며, 일부 학생 정보가 양쪽에 모두 존재합니다.
IN 연산자로 교집합 구현하기
다음 쿼리는 IN 연산자와 서브쿼리를 활용하여, 두 테이블 모두에 존재하는 'studentid' 값만 반환합니다. 이것이 바로 INTERSECT 연산과 동일한 결과입니다.
mysql> Select Student_detail.studentid FROM Student_detail WHERE student_detail.studentid IN(SELECT Student_info.studentid FROM Student_info); +-----------+ | studentid | +-----------+ | 101 | | 105 | | 130 | | 132 | | 133 | +-----------+ 5 rows in set (0.06 sec)
결과 분석
실행 결과 101, 105, 130, 132, 133의 다섯 개 studentid가 반환되었습니다. Student_detail에만 존재하는 150(Rajesh)과 160(Pradeep)은 Student_info에 없기 때문에 결과에서 제외된 것입니다.
참고: INNER JOIN을 활용한 대안
IN 연산자 외에도 INNER JOIN을 사용하면 동일한 교집합 결과를 얻을 수 있으며, 대량의 데이터에서 성능 면에서 유리한 경우가 많습니다.
mysql> Select DISTINCT sd.studentid FROM Student_detail sd INNER JOIN Student_info si ON sd.studentid = si.studentid;
참고로 MySQL 8.0.31부터는 공식적으로 INTERSECT 연산자가 지원되므로, 최신 버전을 사용한다면 별도의 시뮬레이션 없이 바로 활용할 수 있습니다.