서브쿼리
단일행 서브쿼리 / 다중행 서브쿼리

상호연관 서브쿼리
<단일행 서브쿼리>
–월급 많은 순으로 5개 가져오기
–★★★페이지 가져올때 쓰인다!
SELECT ename,sal,rownum FROM (SELECT ename,sal FROM emp ORDER BY sal DESC) WHERE rownum<=5;
–전체 평균보다 작은 급여를 받는 사원의 이름, 급여, 입사일 출력
SELECT ename,sal,hiredate FROM emp WHERE sal<(SELECT AVG(sal) FROM emp);
–SALES부서에서 가장 많이 받는 사원의 급여
SELECT MAX(sal) FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname=’SALES’);
–SMITH보다 급여를 많이 받는 사원의 급여와 이름
SELECT sal,ename FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename=’SMITH’);
–BLAKE와 같은 부서에서 근무하는 사원의 이름,급여,입사일
SELECT ename,sal,hiredate FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename=’BLAKE’);
<다중행 서브쿼리>
–이름 중에 T를 포함하고 있는 사원과 같은 부서에서 근무하는 사원의 이름, 부서번호, 급여 출력
SELECT ename,deptno,sal FROM emp WHERE deptno IN(SELECT deptno FROM emp WHERE ename LIKE ‘%T%’);
–30번 그룹에서 최고 급여보다 더 많이 받는 사원의 이름,급여
SELECT ename,sal FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30);
–또는
SELECT ename,sal FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE deptno=30);
–DALLAS에서 근무하는 모든 사원의 이름, 급여, 입사일
SELECT ename,sal,hiredate FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE loc=’DALLAS’);
<다중 컬럼> (거의 등장하지 않는다)
–아래 쿼리문은 어떤 의미인가?
SELECT deptno,ename,sal
FROM emp
WHERE (deptno,sal) IN(SELECT deptno,MAX(sal) FROM emp GROUP BY deptno) ORDER BY deptno;
<상호연관>
SELECT ename,job,sal FROM emp e1
WHERE sal>=(SELECT AVG(sal) FROM emp e2 WHERE e1.job=e2.job);
–직위별로 평균보다 연봉 높은사람
<스칼라 서브쿼리>
SELECT ename,(SELECT dname FROM dept WHERE emp.deptno=dept.deptno) dname FROM emp;
–아래와 같은 의미.
SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno;
–but, 왜 스칼라 서브쿼리를 쓰느냐? 데이터 양이 적을 때는 조인보다 스칼라가 빠름(데이터가 많을 때는 조인이 빠를수도)