DB/오라클(Oracle)

[Oracle] 오라클 서브쿼리(SubQuery) 사용법

푸코잇 2023. 12. 3. 00:10
728x90

 

오라클에서 자주 사용되는 서브쿼리(SubQuery)에 대해 배워보자.

여기서 말하는 서브쿼리는 쿼리 안에 쿼리가 들어가 있는 형태이다.

스칼라 서브쿼리, 인라인 뷰, 중첩 서브쿼리 3가지가 있다.

 

스칼라 서브쿼리(Scalar SubQuery)

SELECT 
	e.ENAME 이름,
	e.SAL 급여,
	(
	SELECT DNAME FROM DEPT d 
	WHERE d.DEPTNO = e.DEPTNO
	) 부서명
FROM EMP e 
WHERE SAL >= 2500;

SCALAR-SUBQUERY

 

EMP 테이블에서 SAL이 2500이상인 직원의 부서명을 출력하는 예제이다.

스칼라 서브쿼리는 SELECT 절에서 사용하므로 주의할 게 있다.

위의 경우 다중 행이 조회되는 경우 에러가 발생한다.

다중 행을 처리하고 싶다면 IN, NOT IN과 같은 연산자를 사용하면 된다.

ORA-00900에러

 

인라인 뷰(Inline View)

SELECT d.DNAME 부서명, 급여평균, 인원수
FROM 
	(
	SELECT DEPTNO, ROUND(AVG(SAL)) 급여평균, COUNT(*) 인원수
	FROM EMP 
	GROUP BY DEPTNO
	) e, DEPT d
WHERE e.DEPTNO = d.DEPTNO;

INLINE-VIEW

 

부서별 급여평균, 인원수를 출력하는 예제이다.

FROM절에 사용하는 서브쿼리는 인라인 뷰라 한다.

해당 쿼리문에서만 사용하는 임시 뷰이다.

인덱스가 없기때문에 데이터가 많을 경우 실행시간이 오래 걸릴 수 있으니 주의하자.

 

중첩 서브쿼리(Nested SubQuery)

SELECT ENAME, SAL FROM EMP e
WHERE SAL < (SELECT AVG(SAL) FROM EMP);

NESTED-SUBQUERY

 

평균급여보다 낮은 직원 이름과 급여를 출력하는 예제이다.

WHERE절에서 집계함수인 AVG를 사용할 수 없으므로 중첩 서브쿼리를 사용해 평균급여를 구할 수 있다.