카테고리 없음
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;
728x90