학원수업_Oracle

201026 세미조인

logloglog 2020. 10. 26. 10:18

- 서브쿼리(쿼리안의 쿼리)를 사용하여  서브쿼리의 결과에 존재하는 자료와 메인쿼리에 사용된 테이블 간의 조인

- 사용되는 연산자가 in, any, some, all, exists 연산자 사용

-서브쿼리는 위의 연산자들 오른쪽에만 나온다.

 

EX 사원테이블에서 급여가 5000이상인 사원이 근무하는 부서코드와 부서명을 출력하시오

(세미조인을 사용하지 않는 경우)

SELECT  DISTINCT A.DEPARTMENT_ID 부서코드,
        A.DEPARTMENT_NAME 부서명
FROM    DEPARTMENTS A, EMPLOYEES B
WHERE   B.SALARY>=5000
        AND B.DEPARTMENT_ID = A.DEPARTMENT_ID
ORDER BY 1;

사장은 7000받는데 왜 안나왓을까? 부서테이블에 NULL부서가 없음.. 근데 A와 B의 ID가 같은놈만 출력하라했는데 DEPARTMENTS테이블의 ID가 기본키니까 NULL이라는 부서코드가 없을것!(기본키의 조건)

 

사원테이블에는 부서에없는 NULL 부서값이 있는것처럼 부서테이블에는 사원테이블에 없는 120~부터의 부서가있다.

이렇게 서로 맞지않는 조건은 전부 무시해버리는 것이 내부조인!

(1) IN 연산자 사용

SELECT  A.DEPARTMENT_ID 부서코드,
        A.DEPARTMENT_NAME 부서명
FROM    DEPARTMENTS A
WHERE   A.DEPARTMENT_ID IN (SELECT B.DEPARTMENT_ID
                            FROM EMPLOYEES B
                            WHERE B.SALARY>=5000)
ORDER BY 1;

FROM 으로 부서테이블 가져오고, 웨어절을 가져오는데,  ()안의 쿼리는 서브쿼리 인데, 웨어절에서 서브쿼리가 가장 먼저 실행되고,5000이상 받는 사원의 부서번호 (57개(중복해서))가 나열이됨 근데 왜 결과에선 중복이 되지 않았을까?

비교대상은 부서테이블의 부서아이디는 기본키이기 떄문에 (NULL x 중복x) 니까 중복이 안됨.

(2) ANY나 SOME

- IN연산자가 '관계연산자 ANY(SOM)' 형태로 변환

SELECT  A.DEPARTMENT_ID 부서코드,
        A.DEPARTMENT_NAME 부서명
FROM    DEPARTMENTS A
WHERE   A.DEPARTMENT_ID = SOME (SELECT B.DEPARTMENT_ID
                            FROM EMPLOYEES B
                            WHERE B.SALARY>=5000)
ORDER BY 1;

A.DEPARTMENT_ID = ANY (SELECT B....

 

(3) EXISTS 연산자 사용

- EXISTS 오른쪽은 반드시 서브쿼리만 올 수 있음

- EXISTS 왼편은 컬럼명을 기술하지 않음

- 서브쿼리의 결과가 하나이상의 행이 존재하면 전체가 참(TRUE) 

SELECT  A.DEPARTMENT_ID 부서코드,
        A.DEPARTMENT_NAME 부서명
FROM    DEPARTMENTS A
WHERE   EXISTS (SELECT B.DEPARTMENT_ID
                FROM EMPLOYEES B
                WHERE B.DEPARTMENT_ID = A.DEPARTMENT_ID
                AND B.SALARY>=5000)
ORDER BY 1;
WHERE B.DEPARTMENT_ID = A.DEPARTMENT_ID

이렇게 조건이 있고,

WHERE EXISTS (SELECT B.D

EXISTS옆에는 암것도 없고

EXISTS 쓸떈 SELECT절에

WHERE EXISTS (SELECT *

*를 써도 같다. 존재하느냐 마느냐만 묻는거기 때문에  EXIST는 줄이 존재하는지 안하는지만 판단하니까

WHERE EXISTS (SELECT 1

주로 1을 쓴다. 여기서 1은 의미없음 

 

 

 

 

 

'학원수업_Oracle' 카테고리의 다른 글

201027  (0) 2020.10.27
201026 외부조인(OUTER JOIN)  (0) 2020.10.26
201023 SELF JOIN  (0) 2020.10.23
201023 ANSI JOIN  (0) 2020.10.23
201022 JOIN  (0) 2020.10.22