더북(TheBook)

② 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개의 행이 선택됨.
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.