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

MySQL에서 WHERE 절과 IN 연산자로 INTERSECT 쿼리 시뮬레이트하기

MySQL에는 다른 관계형 데이터베이스처럼 INTERSECT 연산자가 기본적으로 제공되지 않습니다. 하지만 IN 연산자WHERE 절을 함께 사용하면 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)

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)에도 포함되어 있는 132133만 반환된 것을 확인할 수 있습니다.

동작 원리 정리

  • 외부 쿼리의 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 방식을 상황에 맞게 선택하여 사용하면 됩니다.