- 서브쿼리(쿼리안의 쿼리)를 사용하여 서브쿼리의 결과에 존재하는 자료와 메인쿼리에 사용된 테이블 간의 조인
- 사용되는 연산자가 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;
이렇게 서로 맞지않는 조건은 전부 무시해버리는 것이 내부조인!
(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;
비교대상은 부서테이블의 부서아이디는 기본키이기 떄문에 (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 |