-
Oracle - 서브쿼리(SUBQUERY) - Part 1데이터베이스/Oracle 2020. 11. 16. 14:27728x90반응형
SUBQUERY
SUBQUERY란 SELECT 문장 안에 포함된 또 다른 SELECT 문장으로 메인 쿼리가 실행되기 전 한 번만 실행된다.
비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 묶어야 한다.
서브쿼리와 비교할 항목은 반드시 서브쿼리의 SELECT한 항목의 개수와 자료형을 일치시켜야 한다.
즉, 메인퀘리 SELECT문을 보조하는 역할로 사용하는 SELECT문이다.
[ SUBQUERY 예시 ]
전 직원의 평균 급여보다 많은 급여를 받고 있는 직원의 사번, 이름, 직급코드 ,급여 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY FROM EMPLOYEE WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEE); -- 서브쿼리 예시
서브쿼리에서는 단일행 서브쿼리, 다중행 서브쿼리, 다중열 서브쿼리, 다중행 다중열 서브쿼리, 상(호연)관 서브쿼리 ,
스칼라 서브쿼리가 있다.
단일 행 서브쿼리
단일 행 서브쿼리란 서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리이다.
서브쿼리의 조회 결과값의 개수가 1개일 때 단일행 서브쿼리 앞에는 일반 연산자를 사용한다.
일반 연산자에는 ( < , >, <=, >=, =, !=/<>/^= ) 가 있다.
[ 단일행 서브쿼리 예시 ]
- 전 직원의 급여 평균보다 많은 급여를 받는 직원의 이름, 직급, 부서, 급여 조회
SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY FROM EMPLOYEE E WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEE) ORDER BY 2;
여기서 WHERE절 안에 있는 SELECT문인
SELECT AVG(SALARY) FROM EMPLOYEE
이 코드의 결과값은 이렇게 나타난다.
그래서 WHERE절에 있는 서브쿼리가 AVG(SALARY)의 값으로 바뀌어져
SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY FROM EMPLOYEE E WHERE SALARY >= 3047622.6086 -- ..... ORDER BY 2;
이러한 값으로 변환이 되어 결가값이 이렇게 나타난다.
다중 행 서브쿼리
다중행 서브쿼리란 서브쿼리의 조회 결과 값의 행이 여러 개인 서브쿼리이다.
다중행 서브쿼리에는 일반 비교연산자를 사용할 수 없다.
사용할 수 있는 비교연산자는 IN, NOT IN, ANY, ALL, EXISTS, NOT EXISTS 가 있다.
[ 다중행 서브쿼리 예시 ]
- 부서 별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여 조회
SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY IN (SELECT MAX(SALARY) -- 다중행 서브쿼리 FROM EMPLOYEE GROUP BY DEPT_CODE) ORDER BY 3;
여기서 WHERE절에 있는 SELECT문인
SELECT MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE
이 코드를 실행하면
이러한 결과가 나타나는데 이 결과를 부서별로 매칭시킨다.
다중 열 서브쿼리
다중열 서브쿼리란 서브쿼리의 조회 결과 컬럼의 개수가 여러 개인 서브쿼리이다.
[ 다중열 서브쿼리 예시 ]
- 퇴사한 여직원과 같은 부서, 같은 직급에 해당하는 사원의 이름, 직급, 부서, 입사일 조회
SELECT EMP_NAME, JOB_CODE, DEPT_CODE, HIRE_DATE FROM EMPLOYEE WHERE (DEPT_CODE, JOB_CODE) IN (SELECT DEPT_CODE, JOB_CODE FROM EMPLOYEE WHERE SUBSTR(EMP_NO, 8, 1)=2 AND ENT_YN=‘Y’);
여기서 WHERE절에 있는 SELECT를 살펴보면
SELECT DEPT_CODE, JOB_CODE FROM EMPLOYEE WHERE SUBSTR(EMP_NO, 8, 1)=2 AND ENT_YN=‘Y’;
퇴사자들을 조회하는 코드이다. 이걸 실행해서 부서 코드와 직업 코드를 조회한다.
이 결과값을 이제 메인쿼리에 매칭시켜 조회한다.
728x90반응형'데이터베이스 > Oracle' 카테고리의 다른 글
Oracle - DDL (Data Definition Language) CREATE - Part 1 (0) 2020.11.17 Oracle - 서브쿼리(SUBQUERY) - Part2 (0) 2020.11.16 Oracle - CROSS JOIN / NON_EQUI JOIN / SELF JOIN (0) 2020.11.13 Oracle - JOIN (0) 2020.11.12 Oracle - GROUP BY 의 ROLLUP과 CUBE (0) 2020.11.11