본문 바로가기

oracle

서브쿼리(SINGLE ROW 서브쿼리,MULTI ROW 서브쿼리)

반응형

1. SINGLE ROW 서브쿼리

: SINGLE ROW SUB QUERY는 서브쿼리의 가장 일반적이며 단수한 형태이다.

 

[따라하기] SINGLE ROW 서브쿼리의 사용 예

EX) TEMP에서 연봉이 가장 많은 직원의 ROW를 찾아서 이 금액과 동일한 금액을 받는 직원의 사번고 성명을 보여 줘라.

SELECT EMP_ID, EMP_NAME
FROM TEMP
WHERE SALARY=(SELECT MAX(SALARY)
                           FROM TEMP);

SUB QUERY가 조건의 비교문으로 사용될 때 연산자가 IN, ANY,ALL, EXISTS 등이 아닌 경우는 QUERY에서 나오는 결과 행의 수가 1보다 클 수 없다. 이렇게 서브쿼리의 결과가 항상 한 행 보다 클 수 없는 경우를 SINGLE ROW 서브쿼리라고 한다.

 

EX) TEMP의 자료를 이용해 SALARY의 평균을 구하고 이보다 큰 금액을 SALARY로 받는 직원의 사번과, 성명, 연봉을 보여주자.

SELECT EMP_ID, EMP_NAME, SALARY
FROM TEMP
WHERE SALARY >(SELECT AVG(SALARY)FROM TEMP);

 

<실행결과>

 

 

============================================================================

2. MULTI ROW 서브쿼리

:MULTI ROW 서브쿼리는 SINGLE ROW와 달리 서브쿼리의 결과 행이 한 행 이상이 될 수 있는 경우를 의미하고 IN, ANY, ALL, EXISTS등의 연산시에만 가능하다.

IN연산자

:OR절을 연속으로 받는다고 생각하면 편하다.

EX) SELECT * FROM EMP WHERE EMPNO=10 OR EMPNO=20 OR EMPNO=30;

== SELCT * FROM EMP WHERE EMPNO IN(10,20,30);

 

ANY연산자

: ANY 연산자는 서브쿼리의 결과값 중 어느 하나의 값이라도 만족이 되면 결과값을 반환한다.

select * from emp
where salary > any (100,200,300)
위의 쿼리는 조건값 100,200,300 중 아무거나(any)중에 하나만
조건에 해당되면 참이 되는겂니다.
즉 위의 쿼리는 select * from emp where sal > 100 과 같은 얘기가 됩니다.

ALL연산자

:ALL연산자는 서브쿼리의 결과값 중 모든 결과 값이만족 되야만 결과값을 반환한다.                                             select * from emp
where salary > all (100,200,300)
위의 쿼리는 100,200,300 조건값보다 모두(all) 커야 합니다.
따라서 select * from emp where sal>300 과 같은 얘기가 됩니다.

EXISTS 연산자

:EXISTS연사자를 사용하면 서브쿼리의 데이터가 존재하는가의 여부를 먼저 따져 존재하는 값들만을 결과로 반환해 준다.  서브쿼리에서 적어도 1개의 행을 RETURN하면 논리식은 참이고, 그렇지 않으면 거짓이다.

 

 

[따라하기] MULTI ROW서브쿼리의 사용 예

EX) TEMP의 직원 중 인천에 근무하는 직원ㄷ의 사번과 성명을 읽어보는 SQL을 SUB QUERY를 이용해 만들어 보자. 이때 부서가 위치하는 AREA가 근무지가 된다.

SELECT EMP_ID        "사번",            <----"사번"은 별칭
             EMP_NAME  "성명"             <----"성명"은 별칭
FROM TEMP
WHERE DEPT_CODE IN(SELECT DEPT_CODE
                                  FROM TDEPT
                                 WHERE AREA='인천');

 

 

 

 

서브쿼리에서 '인천'에 위치하는 부서를 SELECT하면 부서가 하나 이상이 된다. 이렇게 하나 이상의 행이 서브쿼리의 결과로 나올 가능성이 있는 경우를 NUTI ROW 서브쿼리라고 부른다.

============================================================================================================

3.  MULTI COLUMN 서브쿼리

:  MULTI COLUMN 서브쿼리는 서브쿼리에서 결과로 나오는 행(들)이 한 칼럼이 아닌 두 개 이상을 갖는 경우이다.

 

[따라하기] MULTI COLUMN 서브쿼리 사용 예

EX)  TDEPT에서 부서코드와 BOSS_ID를 읽어서, 이 두개의 칼럼이 TEMP의 부서코드와 사번에 일치하는 사람의 사번과 성명을 읽어오는 쿼리를 만들어 보자.

 

SELECT EMP_ID,
             EMP_NAME
FROM TEMP
WHERE (DEPT_CODE, EMP_ID) IN
            (SELECT DEPT_CODE, BOSS_ID
              FROM TDEPT);

 

 

 

 

[따라하기]  MULTI COLUMN 서브쿼리의 사용

EX) TEMP에서 부서별 최고 연봉금액을 읽어서, 해당 무서와 최고 연봉금액이 동시에 일치하는 사원의 사번, 성명, 연봉을 읽어보라

 

SELECT EMP_ID,
             EMP_NAME,
             SALARY
FROM TEMP
WHERE (DEPT_CODE,SALARY) IN
           (SELECT DEPT_CODE,MAX(SALARY)
            FROM TEMP
            GROUP BY DEPT_CODE);

 

 

 

 

 

 

 

 

-전문가로 가는 지름길 오라클 실습 예제 발췌-

 

반응형

'oracle' 카테고리의 다른 글

ROWNUM  (0) 2013.10.24
ANY, ALL,EXISTS 사용 예  (0) 2013.10.24
SELF JOIN  (1) 2013.10.21
Non-Equl Join(비등가 Join)  (0) 2013.10.21
오라클 JOIN  (0) 2013.10.21