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

MySQL에서 LEFT JOIN을 활용해 MINUS 쿼리를 구현하는 방법

MySQL에는 Oracle이나 SQL Server에서 제공하는 MINUS(또는 EXCEPT) 연산자가 기본적으로 지원되지 않습니다. 하지만 걱정할 필요가 없습니다. LEFT JOINIS NULL 조건을 조합하면 MINUS 쿼리와 동일한 결과를 손쉽게 얻을 수 있습니다.

MINUS 쿼리란?

MINUS는 첫 번째 쿼리 결과 집합에서 두 번째 쿼리 결과 집합에 포함된 행들을 제거한 차집합을 반환하는 연산자입니다. MySQL에서는 이를 직접 사용할 수 없기 때문에 LEFT JOIN을 활용한 우회 방법이 널리 사용됩니다.

예제 데이터 준비

이해를 돕기 위해 두 개의 테이블, 즉 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)

LEFT JOIN으로 MINUS 시뮬레이션하기

다음 쿼리는 LEFT JOIN을 사용하여 Student_info에는 존재하지만 Student_detail에는 없는 'studentid' 값을 반환합니다. 핵심은 조인 후 상대 테이블의 값이 NULL인 행, 즉 매칭되지 않은 행만 필터링하는 것입니다.

mysql> SELECT studentid FROM student_info 
LEFT JOIN Student_detail USING(studentid) 
WHERE student_detail.studentid IS NULL;
+-----------+
| studentid |
+-----------+
|       165 |
+-----------+
1 row in set (0.07 sec)

결과를 보면 학번 165(Abhimanyu)만 조회되었습니다. 이 학생은 Student_info 테이블에만 존재하기 때문입니다.

반대 방향의 차집합 구하기

이번에는 반대로 Student_detail에는 있지만 Student_info에는 없는 'studentid' 값을 조회해 보겠습니다. 조인 순서만 바꾸면 됩니다.

mysql> SELECT studentid FROM student_detail 
LEFT JOIN Student_info USING(studentid) 
WHERE student_info.studentid IS NULL;
+-----------+
| studentid |
+-----------+
|       150 |
|       160 |
+-----------+
2 rows in set (0.00 sec)

학번 150(Rajesh)과 160(Pradeep)이 조회되었는데, 이들은 Student_detail에만 등록된 학생들입니다.

동작 원리 정리

LEFT JOIN은 왼쪽 테이블의 모든 행을 유지하면서 오른쪽 테이블에서 일치하는 행을 찾습니다. 만약 오른쪽 테이블에 일치하는 값이 없다면 해당 컬럼은 NULL로 채워집니다. 따라서 WHERE 오른쪽테이블.키컬럼 IS NULL 조건을 추가하면, 왼쪽 테이블에만 존재하는 행, 즉 차집합 결과를 얻을 수 있는 것입니다.

이 패턴은 MySQL에서 NOT IN 서브쿼리보다 성능이 뛰어난 경우가 많으며, 특히 대량의 데이터를 다룰 때 인덱스와 함께 사용하면 효율적인 차집합 처리가 가능합니다.