본문 바로가기

데이터베이스

[ORACLE 11일차] Subquery (2)

◈ 단일 행 Subquery와 다중 행 Subquery


서브쿼리는 반환하는 행 수가 한개인 것과 여러 개인 것에 따라서 단일 행 서브쿼리와 멀티 행 서브쿼리로 분류된다.


단일 행 서브쿼리는 단 하나의 행만 반환하는 서브쿼리로 비교 연산자 (=,<,<=,>=,<>)를 사용한다.

결과는 반드시 한 행만 조회된다.


다중 행 서브쿼리는 여러 개의 행을 반환하는 것으로 IN, ANY, ALL, EXISTS를 사용한다.

서브쿼리를 실행하면 그 결과는 여러 개의 행이 조회된다.


◈ 다중 행 서브쿼리

다중 행 서브쿼리는 서브쿼리 결과가 여러 개의 행을 반환하는 것으로 다중 행 연산자를 사용해야 한다.


** 다중 행 비교 연산자


IN (Subquery) - Main Query의 비교조건이 Subquery의 결과 중 하나만 동일하면 참이 된다 (OR 조건)

ALL (Subquery) - Main Query와 Sub Query의 결과가 모두 동일하면 참이 된다.

                        <ALL : 최솟값을 반환한다

                        >ALL : 최댓값을 반환한다


ANY (Subquery) - Main Query의 비교조건이 Subquery의 결과 중 하나 이상 동일하면 참이 된다.

                         <ANY 하나라도 크게 되면 참

                         >ANY 하나라도 작게 되면 참


EXISTS (Subquery) - Main Query와 Subquery의 결과가 하나라도 존재하면 참이 된다





◈ IN 

여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산이다.


SELECT ENAME, DEPTNAME, SAL 

FROM EMP, DEPT 

WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.EMPNO IN (SELECT EMPNO FROM EMP WHERE SAL>1000);



위의 예에서는 EMP 테이블에서 SAL이 1000원 이상인 사원번호를 반환하고!!!!!!!!!!!!!

반환된 사원번호와 메인쿼리의 사원번호와 비교해서 같은 것을 조회하는 것이다.



◈ ALL 

메인쿼리와 서브쿼리의 결과가 모두 동일하면 참이다.


SELECT * FROM EMP

WHERE DEPTNO <= ALL (20, 30);


DEPTNO가 20,30 보다 작거나 같은 것을 조회한다.

DEPTNO가 10,20 인 행이 모두 출력된다.



◈ EXISTS

EXISTS는 Subquery로 어떤 데이터 존재 여부를 확인하는 것

즉, EXISTS의 결과는 참과 거짓이 반환된다.

다음의 예는 직원 중에서 급여가 1000 이상이 있으면 참이 반환되고 없으면 거짓이 반환된다.


SELECT ENAME, DEPTNAME, SAL

FROM EMP, DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO AND EXISTS (SELECT 1 FROM EMP WHERE SAL>1000);


급여가 1000원 이상이 있으면 참이 반환되고 없으면 거짓이 반환된다.



◈ Scalar Subquery

스칼라 서브쿼리는 반드시 한 행과 한 칼럼만 반환하는 서브쿼리다.

만약 여러 행이 반환되면 오류가 발생한다.


SELECT ENAME AS "이름", SAL AS "급여", (SELECT AVG(SAL) FROM EMP) AS "평균급여"

FROM EMP

WHERE EMPNO=101;


◈ Correlated Subquery

연관 서브쿼리는 서브쿼리 내에서 Main Query 내의 칼럼을 사용하는 것을 의미한다.


다음 시간에는 서브쿼리를 활용하는 예제를 찾아가며 공부하자. 




































'데이터베이스' 카테고리의 다른 글

오라클 실습 (190501)  (0) 2019.05.01
Connection이란  (0) 2019.05.01
[ORACLE 10일차]Subquery (1)  (0) 2019.01.16
[ORACLE 9일차] UNION, MINUS, Connect by  (0) 2019.01.15
[ORACLE 8일차] JOIN  (0) 2019.01.14