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