프로그래밍/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