컴퓨터 공부/Advanced Database

[5월 28일 3교시] 서브쿼리

려리군 2009. 5. 28. 16:08

서브쿼리

서브쿼리라고 불리는 SELECT 구문 안에 포함된(nested) 쿼리

select deptno, ename,sal from emp where deptno
= (select deptno from emp where ename='MILLER')


서브쿼리의 종류

리턴 행 수에 따라 : single row, multiple row

실행 방법에 따라 : nested, correlated(조인관련)

비교 컬럼 수에 따라 : single column, multiple column


single-row 서브쿼리

서브 쿼리(안쪽 쿼리)가 오직 한 줄만 리턴한다.

=,>,<,>=,<= 와 같은 single-row 연산자를 사용한다.


multiple-row 서브쿼리

서브 쿼리(안쪽 쿼리)가 오직 여러 줄을 리턴한다.

ANY, ALL, EXISTS와 같은 연산자를 사용한다.


FROM절 안에 서브쿼리

FROM 절 안에 서브쿼리가 올 수 있다.

FROM 절 안에서 사용되는 서브쿼리는 '인라인 뷰'라고 불린다.

인라인 뷰 : SQL에서 수행할 동안에만 존재하는 테이블.


TOP-N 쿼리

SELECT ename,sal 

FROM

(SELECT ename, sal FROM emp WHERE sal IS NOT NULL ORDER BY sal DESC)

WHERE rownum<4


※ WHERE절의 서브쿼리 안의 변수는 블록 안의 변수와 비슷하기 때문에 사용할 수 없다. 

예시) select ename, sal, avg_sal from emp where sal < (select avg(sal) avg_sal from emp)

=> 위의 예시는 오류 난다.


예시) 급여를 많이 받는 순서대로 상위 3명을 출력하시오.

SELECT ename,sal 

FROM (SELECT ename, sal FROM emp WHERE sal IS NOT NULL ORDER BY sal DESC) 

WHERE rownum<4

※ rownum은 결과열 번호에 대한 pseudo 열이다.

※ rownum은 <, <=, = 부등호만 허용한다.


※ 아래와 같이 수행하면 ORDER BY의 우선순위가 가장 낮으므로 엉뚱한 결과에 대해서 앞의 3개 열만 출력한다.

SELECT ename,sal FROM emp where sal is not null and rownum<4 ORDER BY sal



HAVING절 안에 서브쿼리

inner 서브쿼리의 결과가 HAVING절에 의해 사용된다.


Correlated subquery(상호관련된 서브쿼리)

메인 쿼리(outer query)의 테이블을 서브쿼리가 참조하는 쿼리.

※ 지역변수(서브쿼리)가 전역변수(메인 쿼리)를 참조하는 프로그래밍 원리가 적용된다.

예시)

SELECT deptno, ename, sal

FROM emp m

WHERE sal < (SELECT avg(sal) 

FROM emp

WHERE deptno = m.deptno)