Building value

Oracle SQL 기본 문법[SubQuery] 본문

RDBMS/Oracle DB

Oracle SQL 기본 문법[SubQuery]

developer_Michael 2023. 3. 15. 17:43
반응형

ORACLE SQL에서 SubQuery는 하나의 SQL문 내에 다른 SQL문을 사용하여 질의하는 방법입니다. 

하나의 SQL문에서 두 개 이상의 SELECT 문이 존재하는데, 

 

하나의 SELECT 문에서 다른 SELECT 문을 사용하는 것입니다.

 

SubQuery는 다른 집합 연산자와 함께 사용될 때 특히 유용합니다. 

SubQuery를 사용하면 결과를 미리 계산하고 결과를 다른 SELECT 문에 대한 입력으로 사용할 수 있습니다. 

이를 통해 복잡한 쿼리를 작성할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다.

 

SubQuery는 크게 두 가지 유형으로 구분됩니다.

 

 

1. 단일 행 SubQuery: 하나의 행만 반환하는 SubQuery입니다. 

 

이 유형의 SubQuery는 다른 비교 연산자와 함께 사용됩니다.

 

SELECT ENAME, SAL
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP);

위 쿼리는 "EMP" 테이블에서 급여(SAL)가 최대인 직원의 이름(ENAME)과 급여(SAL)를 출력하는 쿼리입니다.

출력 결과

2. 다중 행 SubQuery: 여러 개의 결과 행을 반환하는 SubQuery이며, IN, NOT IN, ANY, ALL 연산자와 함께 사용됩니다.

SELECT EMPNO, JOB, DEPTNO
FROM EMP
WHERE JOB IN (SELECT JOB FROM EMP WHERE EMPNO IN(7369, 7499))
AND DEPTNO IN (SELECT DEPTNO FROM EMP WHERE EMPNO IN (7369, 7499));

위 쿼리는 "EMP" 테이블에서 직무(JOB)가 'CLERK' 또는 'SALESMAN'인 직원들 중에서, 

 

사번(EMPNO)이 7369 또는 7499인 직원과 동일한 부서(DEPTNO)에 속하는

 

직원의 사번(EMPNO), 직무(JOB), 부서번호(DEPTNO)를 출력하는 쿼리입니다.

 

서브쿼리는 두 개 사용되었는데, 

 

첫 번째 서브쿼리는 "(7369, 7499)"와 같이 지정된 두 개의 사번(EMPNO)에 해당하는 직원들의 직무(JOB)를 

 

반환하는 다중 행 서브쿼리이며, 두 번째 서브쿼리는 "(7369, 7499)"와 같이 지정된 두 개의 사번(EMPNO)에 해당하는 

 

직원들이 속한 부서(DEPTNO)를 반환하는 다중 행 서브쿼리입니다.

 

메인 쿼리에서는 첫 번째 서브쿼리의 결과와 두 번째 서브쿼리의 결과를 조건식으로 사용하여 "IN" 연산자를 이용해 

 

결과를 필터링하고 있습니다. 

 

따라서 두 개의 서브쿼리가 모두 다중 행 서브쿼리이므로, 전체 쿼리도 다중 행 서브쿼리를 사용한 쿼리입니다.

출력 결과

 

SELECT ENAME, JOB, DEPTNO, SAL 
FROM EMP 
WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'JONES')
OR SAL >= (SELECT SAL FROM EMP WHERE ENAME = 'FORD') 
ORDER BY JOB, SAL DESC;

위 쿼리는 "EMP" 테이블에서 직무(JOB)가 'JONES'와 동일한 직원 또는 급여(SAL)가 'FORD'라는 이름을 가진

 

직원의 급여 이상을 받는 직원들의 이름(ENAME), 직무(JOB), 부서번호(DEPTNO), 급여(SAL)를 출력하는 쿼리입니

다.

서브쿼리는 두 개 사용되었는데, 

 

첫 번째 서브쿼리는 'JONES'라는 이름을 가진 직원의 직무(JOB)를 반환하는 단일 행 서브쿼리이며, 

 

두 번째 서브쿼리는 'FORD'라는 이름을 가진 직원의 급여(SAL)를 반환하는 단일 행 서브쿼리입니다.

메인 쿼리에서는 두 개의 서브쿼리를 사용하여 "OR" 연산자로 조건식을 구성하고 있습니다.

 

따라서, 두 개의 서브쿼리가 모두 단일 행 서브쿼리이므로,

 

전체 쿼리도 단일 행 서브쿼리를 사용한 쿼리입니다.

 

결과는 직무(JOB)를 기준으로 오름차순으로 정렬하고,

 

동일한 직무(JOB) 내에서는 급여(SAL)를 기준으로 내림차순으로 정렬됩니다.

 

출력 결과

반응형