OracleDB Sub Query

Sub Query

Sub Query는 가장 먼저 실행되야 하므로 괄호로 쌓여져 있어야 합니다. 고로 메인쿼리 이전에 서브쿼리가 먼저 실행됩니다.
Sub Query는 뒤에 붙는 유형이 3가지로 나누어 집니다.

  • WHERE
  • FROM
  • HAVING
select sal from emp where ename='SCOTT';
select ename, sal from emp where sal > 3000;

첫째 줄에서 값을 찾고 그 값을 찾아 입력한 표현이 위의 질의 입니다.

select ename, sal from emp where sal>
(select sal from emp where ename='SCOTT');

같은 내용을 서브쿼리를 넣어서 바꾼 형식이 위의 질의 입니다.

select job, avg(sal) from emp
group by job
having avg(sal) = (select  min(avg(sal)) from emp group by job);

 

  • rownum
select rownum ,ename from emp where rownum <=5;


ROWNUM은 이런식으로 씁니다. 상위 몇개를 추출 할 때에 많이 쓰는데, 반대의 경우에는 쓰지 못합니다.

연봉이 높은 사람을 3명까지 출력하려고 합니다.

select * from emp where rownum<=3 order by sal desc;


하지만 결과가 의도한 바와는 다르게 나왔습니다. ORDER BY가 나오기 전에 WHERE절을 먼저 실행하기 때문에 조건에 의해서 추려진 자료가 정렬되어 나왔습니다.

select sal from emp Order by sal desc;
select *from (select * from emp Order by sal desc) where rownum<=3  ;


이렇게 서브쿼리를 이용해서 처리를 하면 됩니다.

밑의 질의는 종합적인 질의입니다.

select * from emp where sal > 
(select sal from emp where empno=7876) 
and job = (select job from emp where empno=7369);


이런식으로 한 행만 돌려주는 스칼라 서브쿼리는 이렇게 써도 상관 없지만, 다중 행으로 나오는 경우에는 IN,ANY,ALL 같은 다중행 연산자를 써 줍니다.

select empno , ename from emp  where sal IN (select min(sal) from emp group by deptno);