학습자료(~2017)/오라클

6. 오라클 - Sub Query

단세포소년 2011. 3. 11. 13:38
반응형

. 단일행 Sub Query : Sub Query 의 결과로 하나의 행 리턴
. 다중행 Sub Query : Sub Query 의 결과로 하나이상의 행 리턴
. 다중열 Sub Query : Sub Query 의 결과로 하나 이상의 열 리턴

사용지침
.WHERE 절, HAVING 절, FROM 절에 Sub Query를 사용 할수 있다.
.Sub Query 는 ()로 둘러싸여 있다.
.Sub Query는 연산자의 오른쪽에 위치하여야 한다.'
.단일행 Sub Query 는 단일행 연산자를 다중행 Sub Query는 다중행 연산자를 사용해야 한다.


예)
질문1) jones 보다 급여를 많이 받는 사원은?
답1) SELECT empno, ename, sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='jones');
 - > 단일열 Sub Query와 단일행 Sub Query 사용



그룹함수를 이용한 Sub Query
예) SELECT empno, ename, sal FROM emp WHERE sal = (SELECT MIN(sal) FROM emp);

HAVING 절에서의 Sub Query
예) SELECT job, MAX(sal) FROM emp GROUP BY job HAVING MAX(sal) > (SELECT MAX(sal) FROM WHERE job='manager');

PAIRWISE Column 비교 :  두개의 컬럼을 묶어서 같은 경우만 참으로 보고 조회한다.
예) SELECT empno, ename, deptno ,sal comm FROM emp WHERE (sal, NVL(com, -1)) IN(SELECT sal, NVL(comm,-1) FROM emp WHERE deptno = 30) ;

FROM 절에서의 Sub Query
 - > FROM 절에서는 Sub Query 가 하나의 VIEW(테이블) 표현
 - > 별칭을 사용해야 한다.
예)SELECT a.empno, a.ename, a.sal, a.deptno, b.avg FROM emp a , (SELECT deptno, ROUND(AVG(sal)) avg FROM emp GROUP BY deptno) b WHERE a.deptno = b.deptno ;



질문2) 급여를 많이 받은 순으로 앞에서 랭킹을 붙여 조회
 - > ROWNUM 이라는 컬럼을 사용하는 것이 관건. ROWNUM은 행 위치를 나타냄
답) SELECT rownum, empno, ename, sal FROM (SELECT * FROM emp ORDER BY sal DESC)
 - > FROM 절에 Sub Query 로 임시 VIEW를 생성한다. 임시 VIEW는 급여로 내림차순 되어 있고 rownum값이 랭킹 값이 된다.



질문3) 급여를 많이 받는 사원 순으로 6위에서 10위까지 랭킹 붙여서 출력
답) SELECT ranking, empno, ename, sal FROM (SELECT rownum ranking, empno, ename, sal FROM (SELECT empno, ename, sal FROM emp ORDER BY sal DESC)) WHERE ranking BETWEEN 6 AND 10;
 - > rownum은 실제 존재 컬럼이 아니다. alias(별칭)를 만들면 복사본이 만들어지고 임시적으로 컬럼이 된다.



반응형