Programming/SQL

[Oracle] 서브쿼리 (SUBQUERY) / 다중열 서브쿼리 / 다중행 다중열 서브쿼리

Jayna. 2024. 2. 20. 13:52
728x90

 

 

[Oracle] 서브쿼리 (SUBQUERY) / 다중행 서브쿼리(MULTI ROW SUBQUERY)

서브쿼리 구분 서브쿼리를 수행한 결과값이 몇 행 몇 열이냐에 따라서 분류한다. - 단일행 (단일열) 서브쿼리 - 다중행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행일 떄 - (단일행)

jaynarecord.tistory.com

서브쿼리 구분

서브쿼리를 수행한 결과값이 몇 행 몇 열이냐에 따라서 분류

- 단일행 (단일열) 서브쿼리

- 다중행 (단일열) 서브쿼리

- (단일행) 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 열일 때

- 다중행 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러행  여러열일 때

728x90

다중열 서브쿼리

조회 결과값은 하나의 행이지만 나열된 컬럼수가 여러 개일 때

--홍길동 사원과 같은 부서코드 AND 같은 직급코드에 해당하는 사원들 조회
-- 1) 홍길동 사원의 부서코드, 직급코드 조회
SELECT DEPT_CODE 부서코드
     , JOB_CODE 직급코드
  FROM EMPLOYEE
 WHERE EMP_NAME = '홍길동'; -- D5 / J5
 
-- 2) 부서코드가 D5이면서 직급코드가 J5인 사원 조회
SELECT EMP_NAME
     , DEPT_CODE
     , JOB_CODE
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5'
   AND JOB_CODE = 'J5';
   
-- 1) + 2)
SELECT EMP_NAME
     , DEPT_CODE
     , JOB_CODE
  FROM EMPLOYEE
 WHERE DEPT_CODE = (SELECT DEPT_CODE
                      FROM EMPLOYEE
                     WHERE EMP_NAME = '홍길동')
   AND JOB_CODE = (SELECT JOB_CODE
                      FROM EMPLOYEE
                     WHERE EMP_NAME = '홍길동');
                     
-->> 다중열 서브쿼리
SELECT EMP_NAME
     , DEPT_CODE
     , JOB_CODE
  FROM EMPLOYEE
 WHERE (DEPT_CODE, JOB_CODE) = (SELECT DEPT_CODE   --결과값이 1행인 여러 컬럼
                                     , JOB_CODE
                                  FROM EMPLOYEE
                                 WHERE EMP_NAME = '홍길동');

 

 

다중행 다중열 서브쿼리

서브쿼리 조회 결과값이 여러행 여러 컬럼일 경우

--각 직급별 최소급여를 받는 사원들 조회
-- 1) 각 직급별 최소급여
SELECT JOB_CODE
     , MIN(SALARY)
  FROM EMPLOYEE
 GROUP BY JOB_CODE;
 
/*
('J2',3000000)
('J1',2000000)
('J3',2500000)
('J5',3500000)
('J4',3300000)
*/ 

-- 2) 위의 목록들 중에 일치하는 사원
SELECT EMP_ID
     , EMP_NAME
     , JOB_CODE
     , SALARY
  FROM EMPLOYE
 WHERE (JOB_CODE, SALARY) IN (('J2',3000000),
                              ('J1',2000000),
                              ('J3',2500000),
                              ('J5',3500000),
                              ('J4',3300000));
                              
-- 1) + 2)
SELECT EMP_ID
     , EMP_NAME
     , JOB_CODE
     , SALARY
  FROM EMPLOYE
 WHERE (JOB_CODE, SALARY) IN (SELECT JOB_CODE
                                   , MIN(SALARY)
                                FROM EMPLOYEE
                               GROUP BY JOB_CODE);
-- 각 부서별 최고급여를 받은 사원들 조회
-- 1) 각 부서별 최고급여
SELECT NVL(DEPT_CODE, '부서없음')
     , MAX(SALARY)
  FROM EMPLOYEE
 GROUP BY DEPT_CODE;
 
-- 2) 
SELECT EMP_ID
     , EMP_NAME
     , NVL(DEPT_CODE, '부서없음')
     , SALARY
  FROM EMPLOYEE
 WHERE (NVL(DEPT_CODE, '부서없음'), SALARY) IN (SELECT NVL(DEPT_CODE, '부서없음')
                                                     , MAX(SALARY)
                                                  FROM EMPLOYEE
                                                 GROUP BY DEPT_CODE)
 ORDER BY EMP_ID;

 

 

 

[Oracle] 인라인 뷰(INLINE-VIEW) / RANK() OVER / DENSE_RANK() OVER / ROWNUM

인라인 뷰(INLINE-VIEW) FROM절에서 서브쿼리 제시 -- 보너스 포함 연봉이 3000만원 이상인 사원들 조회 SELECT EMP_ID , EMP_NAME , (SALARY + (SALARY * NVL(BONUS, 0))) * 12 "보너스 연봉" , DEPT_CODE FROM EMPLOYEE WHERE (SALARY

jaynarecord.tistory.com

 

728x90