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 |