카테고리 없음

Oracle(2022.02.22)-ANSI JOIN, SEMI JOIN

AIN99 2022. 2. 22. 15:47
728x90

ANSI JOIN, SEMI JOIN
 -오라클에서는 SEMI-JOIN이나 ANTI-JOIN을 위한 명시적 문법은 존재하지 않음
 -다만 연산자 EXISTS/IN 이나 NOT EXISTS/ NOT IN을 사용하면 Optimizer는 
  semi join 또는 anti join으로 인식
  - 이 연산자 모두 서브쿼리를 동반함
  -Optimizer:사용자가 명령을 내리면 그러한 쿼리를 실행할 수 있도록 하는 모듈,알고리즘 

사용예) 사원테이블에서 20~60번 부서에 속한 사원들의 사원번호,사원명, 부서번호, 부서명
        을 조회하시오.
    (일반조인문)
        SELECT A.EMPLOYEE_ID AS 사원번호,
               A.EMP_NAME AS 사원명, 
               A.DEPARTMENT_ID AS 부서번호, 
               B.DEPARTMENT_NAME AS 부서명
          FROM HR.EMPLOYEES A, HR.DEPARTMENTS B
          WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
            AND A.DEPARTMENT_ID BETWEEN 20 AND 60 
         ORDER BY 3;

 (SEMI JOIN : EXISTS연산자) --데이터가 있으면 1을 출력하세요 의미없는 숫자이며 WHERE절이 참이면 1이네 참을출력 WHERE절안의 내용을 참과 거짓만 판단,내용을 반환X 
                              -- EXISTS는 서브쿼리 필수 1대신 *써줘도 동일 
     SELECT A.EMPLOYEE_ID AS 사원번호,
               A.EMP_NAME AS 사원명, 
               A.DEPARTMENT_ID AS 부서번호,
               C.DEPARTMENT_NAME AS 부서명
          FROM HR.EMPLOYEES A, HR.DEPARTMENTS C
        WHERE EXISTS (SELECT *
                        FROM HR.DEPARTMENTS B
                       WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
                         AND A.DEPARTMENT_ID BETWEEN 20 AND 60 )
           AND A.DEPARTMENT_ID=C.DEPARTMENT_ID             
        ORDER BY 3;

데이터 일부.. 

 

  (ANTI JOIN : EXISTS연산자)                          
     SELECT A.EMPLOYEE_ID AS 사원번호,
               A.EMP_NAME AS 사원명, 
               A.DEPARTMENT_ID AS 부서번호,
               C.DEPARTMENT_NAME AS 부서명
          FROM HR.EMPLOYEES A, HR.DEPARTMENTS C
        WHERE NOT EXISTS (SELECT 1
                        FROM HR.DEPARTMENTS B
                       WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
                         AND A.DEPARTMENT_ID BETWEEN 20 AND 60 )
           AND A.DEPARTMENT_ID=C.DEPARTMENT_ID             
        ORDER BY 3;

데이터 일부..

 **세미조인: 서브쿼리와 메인쿼리의 공통으로 존재하는 데이터 조회
   안티조인: 서브쿼리에는 존재하지 않고 메인 쿼리에만 존재하는 자료 조회

보충설명

-세미 조인(SEMI-JOIN)은 서브 쿼리를 사용해 서브 쿼리에 존재하는 데이터만 메인 쿼리에서 추출하는 조인 방법으로 IN과 EXISTS 연산자를 사용한 조인이다. 서브 쿼리에 있는 테이블을 B, 메인 쿼리에 사용된 테이블을 A라고 한다면 세미 조인은 B 테이블에 존재하는 A 테이블의 데이터를 추출하는 조인이다.

-안티 조인(ANTI-JOIN)은 서브 쿼리의 B 테이블에는 없는 메인 쿼리의 A 테이블의 데이터만 추출하는 조인 방법이다. 한쪽 테이블에만 있는 데이터를 추출하는 것이므로 조회 조건에서 NOT IN이나 NOT EXISTS 연산자를 사용한다. 세미 조인과 반대 개념이다.
   

사용예)
   세미조인
   SELECT A.DEPARTMENT_ID,
          A.EMP_NAME
     FROM HR.EMPLOYEES A
    WHERE EXISTS (SELECT 1
                    FROM HR.EMPLOYEES B
                    WHERE COMMISSION_PCT IS NOT NULL
                      AND A.EMPLOYEE_ID=B.EMPLOYEE_ID);

데이터생략..

 

 안티조인--이 포함되어있는 사람을 반대로 즉 널이아닌사람의 반대로 
     SELECT A.DEPARTMENT_ID,
          A.EMP_NAME
     FROM HR.EMPLOYEES A
    WHERE A.EMPLOYEE_ID NOT IN(SELECT B.EMPLOYEE_ID
                                 FROM HR.EMPLOYEES B
                                WHERE B.COMMISSION_PCT IS NOT NULL)
    ORDER BY 1;

80번 제외한 데이터 일부..

728x90