Programming/SQL

[Oracle] 서브쿼리 (SUBQUERY) / 단일행 서브쿼리(SINGLE ROW SUBQUERY)

Jayna. 2024. 2. 20. 11:35
728x90

SUBQUERY (서브쿼리)

하나의 주된 SQL문(SELECT, INSERT, UPDATE, DELETE, CREATE, ...) 안에

포함된 또 하나의 쿼리문. 메인 SQL문의 보조역할을 하는 쿼리문

 

>> 특정 사원과 같은 부서인 사원들을 조회화기

-- 홍길동 사원과 같은 부서인 사원들
-- 1) 홍길동 사원의 부서코드 조회
SELECT DEPT_CODE
  FROM EMPLOYEE
 WHERE EMP_NAME = '홍길동'; -- D1
 
-- 2) 부서코드가 D1인 사원들 조회
SELECT EMP_NAME
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D1';
 
-- 두 쿼리문 합치기
SELECT EMP_NAME
  FROM EMPLOYEE
 WHERE DEPT_CODE = (SELECT DEPT_CODE
                      FROM EMPLOYEE
                     WHERE EMP_NAME = '홍길동');
728x90

>> 전체 사원의 평균급여보다 더 많은 급여를 받고 있는 사람들의 정보 조회하기

--전체 사원의 평균급여보다 더 많은 급여를 받고 있는 사원들의 사번, 이름, 직급코드 조회
-- 1) 전체 사원의 평균 급여
SELECT ROUND(AVG(SALARY))
  FROM EMPLOYEE; --3,047,663

--2) 급여가 평균 이상인 사원들 조회
SELECT EMP_ID 사번,
     , EMP_NAME 이름
     , JOB_CODE 직급코드
 FROM EMPLOYEE
WHERE SALARY >= 3047633;

-- 1) + 2) 쿼리 합치기
SELECT EMP_ID 사번,
     , EMP_NAME 이름
     , JOB_CODE 직급코드
 FROM EMPLOYEE
WHERE SALARY > (SELECT ROUND(AVG(SALARY))
                  FROM EMPLOYEE);

 

 

서브쿼리 구분

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

- 단일행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 오로지 1개일 때

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

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

- 다중행 다중열 서브쿼리

 

단일행 서브쿼리 (SINGLE ROW SUBQUERY)

일반연산자 (=, !=, <=, < ... ) 사용 가능

 

>> 전체 직원의 평균 급여보다 적게 받는 사원들의 정보 조회하기

SELECT EMP_NAME
     , JOB_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY < (SELECT AVG(SALARY)
                   FROM EMPLOYEE);

 

>> 최저급여를 받는 사원의 정보 조회하기

SELECT EMP_ID
     , EMP_NAME
     , JOB_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY = (SELECT MIN(SALARY)
                   FROM EMPLOYEE);

 

>> 특정사원의 급여보다 더 많은 받는 사원들의 정보 조회

SELECT EMP_ID
     , EMP_NAME
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > ( SELECT SALARY
                    FROM EMPLOYEE
                   WHERE EMP_NAME LIKE '홍길동');

>> 특정사원관 같은 부서 사원들의 정보 조회

--홍길동과 같은 부서인 사원들의 사번, 사원명, 직급명 조회( 단, 홍길동은 제외)
-- 1) ORACLE
SELECT E.EMP_ID
     , E.EMP_NAME
     , J.JOB_NAME
  FROM EMPLOYEE E, JOB J
 WHERE E.JOB_CODE = J.JOB_CODE
   AND E.DEPT_CODE = (SELECT DEPT_CODE
                      FROM EMPLOYEE
                     WHERE EMP_NAME = '홍길동')
   AND E.EMP_NAME != '홍길동';
      
-- 2) ANSI
SELECT E.EMP_ID
     , E.EMP_NAME
     , J.JOB_NAME
  FROM EMPLOYEE E
  JOIN JOB USIUNG (JOB_CODE)
 WHERE DEPT_CODE = (SELECT DEPT_CODE
                      FROM EMPLOYEE
                     WHERE EMP_NAME = '홍길동')
   AND DEPT_NAME != '홍길동';

 

>> 부서별 급여의 합이 가장 큰 부서 조회

SELECT DEPT_CODE
     , DEPT_TITLE
     , SUM(SALARY)
  FROM EMPLOYEE
  JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
 GROUP BY DEPT_CODE, DEPT_TITLE
HAVING SUM(SALARY) = (SELECT MAX(SUM(SALARY))
                        FROM EMPLOYEE
                       GROUP BY DEPT_CODE);

 

 

 

 

 

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

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

jaynarecord.tistory.com

 

 

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

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

jaynarecord.tistory.com

 

 

[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