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

EXISTS 연산자로 여러 표현식을 반환하는 MySQL INTERSECT 쿼리 시뮬레이트하기

MySQL은 표준 SQL의 INTERSECT 연산자를 지원하지 않습니다. 하지만 EXISTS 연산자를 활용하면 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 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와 동일한 교집합 연산을 손쉽게 구현할 수 있습니다.