프로그래밍/Oracle

[Oracle] having/from/select 절의 서브 쿼리

eunki 2022. 6. 2. 17:58
728x90
select 검색하고자 하는 컬럼명
    from 검색하고자 하는 데이터가 있는 테이블명
    where 검색 조건
    group by 그룹핑할 컬럼명
    having 그룹 함수로 조건을 줄 때 사용하는 절
    order by 정렬해서 보고싶은 컬럼명
select 서브쿼리 사용가능
    from 서브쿼리 사용가능
    where 서브쿼리 사용가능
    group by 서브쿼리 사용 불가능
    having 서브쿼리 사용가능
    order by 서브쿼리 사용가능

 

 

 

 

예제 1. 직업과 직업 별 토탈 월급을 출력하는데, 직업이 SALESMAN 인 토탈 월급보다 더 큰 것만 출력

select job, sum(sal)
    from emp
    group by job
    having sum(sal) > (select sum(sal)
                        from emp
                        where job = 'SALESMAN');

GROUP 함수로 조건을 줄 수 있는 절은 where 절이 아니라 having 절이다.

 

 

 

예제 2. 부서 번호, 이름, 월급, 부서 번호 별로 각각 월급에 대한 순위를 출력하는데, 순위가 2등인 사원들만 출력

select *
    from ( select deptno, ename, sal
                    , dense_rank() over (partition by deptno
                                         order by sal desc) 순위
                from emp )
    where 순위 = 2;

from 절을 서브 쿼리로 감싸서 미리 from 절의 쿼리문을 출력해서 메모리에 올린다.

그리고 그 메모리에 올라간 결과가 마치 하나의 테이블처럼 사용된다.

 

 

 

예제 3. 이름, 월급, 사원 테이블의 평균 월급을 출력

select ename, sal, (select avg(sal) from emp)
    from emp;
select ename, sal, avg(sal) over ()
    from emp;

2개의 SQL 중에서 아래의 SQL이 훨씬 좋은 SQL이다.

왜냐하면 emp 테이블을 한 번만 엑세스하기 때문이다.

그러나 2개 중 위쪽의 SQL을 더 많이 사용할 수 밖에 없는 문제들이 많다.

 

 

 

예제 4. 이름, 월급, 직업이 SALESMAN 인 사원들의 평균 월급을 출력

select ename, sal, (select avg(sal) from emp where job = 'SALESMAN')
    from emp;

select 절의 서브 쿼리를 스칼라(scalar) 서브 쿼리라고 한다.

스칼라 서브 쿼리의 특징이 하나의 값만 출력할 수 있다는 것이다.

728x90