② IN 사용
입력
SELECT department_id, department_name
FROM departments a
WHERE a.department_id IN ( SELECT b.department_id
FROM employees b
WHERE b.salary > 3000)
ORDER BY department_name;
결과
DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------
60 IT
110 경리부
30 구매/생산부
....
11개의 행이 선택됨.
①의 경우는 WHERE 절에 EXISTS 연산자를 사용하고 부서 테이블과의 조인 조건은 서브 쿼리에서 명시하였다. 반면 IN 연산자를 사용한 ②는 서브 쿼리 내에 두 테이블의 조인 조건이 없다는 점에 주의하자. 이는 IN과 EXISTS 연산자의 거동 방식의 차이점 때문이다. IN 연산자는 OR 조건으로 변환할 수 있는데, 즉 “이것이거나 저것이거나”로 풀어쓸 수 있다.EXISTS 연산자는 조건에 만족하는 데이터가 한 건이라도 있으면(존재하면) 결과를 즉시 반환한다.
세미 조인은 서브 쿼리에 존재하는 메인 쿼리 데이터가 여러 건 존재하더라도 최종 반환되는 메인 쿼리 데이터에는 중복되는 건이 없다는 점이 일반 조인과의 차이점이다. 반면 일반 조인을 하면 SELECT 절에 B 테이블 컬럼을 전혀 명시하지 않더라도 중복되는 건이 발생한다. 위 쿼리를 일반 조인문으로 변환해 보면 다음과 같은데, 결과 건수는 당연히 아래처럼 일반 조인 결과가 많아진다.
입력
SELECT a.department_id, a.department_name
FROM departments a, employees b
WHERE a.department_id = b.department_id
AND b.salary > 3000
ORDER BY a.department_name;
결과
DEPARTMENT_ID DEPARTMENT_NAME
------------- -----------------
60 IT
60 IT
60 IT
60 IT
60 IT
110 경리부
110 경리부
....
80개의 행이 선택됨.