Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 INTERSECT 쿼리를 시뮬레이트하는 방법

MySQL에서 INTERSECT를 대체해야 하는 이유

표준 SQL에서 INTERSECT는 여러 SELECT 문의 결과 집합 중 공통으로 존재하는 행만 반환하는 집합 연산자입니다. 하지만 MySQL(8.0.31 이전 버전)에는 이 연산자가 기본적으로 제공되지 않습니다. 따라서 두 테이블 간의 교집합이 필요할 때는 IN 연산자와 서브쿼리를 조합하여 INTERSECT와 동일한 결과를 얻을 수 있습니다.

아래 예제를 통해 그 방법을 자세히 살펴보겠습니다.

예제 준비: 두 개의 테이블

이 예제에서는 Student_detailStudent_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 연산자가 지원되므로, 최신 버전을 사용한다면 별도의 시뮬레이션 없이 바로 활용할 수 있습니다.