DB-디비는 즐겁다

Oracle Database - 1) SUBQUERY

광형 2022. 6. 30. 23:40
728x90
728x90
SMALL

https://kwanghyung.tistory.com/entry/Oracle-Database-2JOIN

 

Oracle Database - 2)JOIN

https://kwanghyung.tistory.com/entry/Oracle-Database-1JOIN Oracle Database - 1)JOIN https://kwanghyung.tistory.com/entry/Oracle-Database-JOIN Oracle Database- JOIN https://kwanghyung.tistory.com/ent..

kwanghyung.tistory.com

<SUBQUERY (서브쿼리)>
    하나의 주된 SQL(SELECT, CREATE, INSERT, UPDATE,..) 안에 포함된 또 하나의 SELECT문
    
    메인 SQL문을 위해 보조 역할을 하는 SELECT문


간단 서브쿼리 예시
노옹철 사원과 같은 부서인 사원들


1)먼저 노옹철 사원의 부서코드를 조회
SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME ='노옹철'; --노옹철 사원의 부서코드는 D9

2)부서코드가 D9인 사원들 조회
SELECT EMP_NAME
FROM EMPLOYEE
WHERE DEPT_CODE='D9'; --선동일, 송중기, 노옹철

위에 두 단계를 합쳐보자.
SELECT EMP_NAME
FROM EMPLOYEE
WHERE DEPT_CODE = (SELECT DEPT_CODE FROM EMPLOYEE WHERE EMP_NAME='노옹철');--D9 노옹철사원 부서코드

간단 서브쿼리 예시2
전체 사원의 평균 급여보다 더 많은 급여를 받고 있는 사원들의 사번, 이름 , 직급코드 조회

1) 전체 사원의 평균 급여를 구하기
SELECT FLOOR(AVG(SALARY))
FROM EMPLOYEE; --3047662

2)급여가 3047662 원 보다 많은 사원들의 사번,이름,직급코드를 조회해보자
SELECT EMP_ID,EMP_NAME,JOB_CODE
FROM EMPLOYEE
WHERE SALARY >3047662;

위의 두단계를 하나의 쿼리문으로 합쳐보자(서브쿼리)
SELECT EMP_ID,EMP_NAME,JOB_CODE
FROM EMPLOYEE
WHERE SALARY >(SELECT FLOOR(AVG(SALARY))
                FROM EMPLOYEE);
                

    서브쿼리 구문
    서브쿼리를 수행한 결과값이 몇행 몇알이냐에 따라서 분류
    
    -단일행(단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 오로지 1개일 때 (한칸의 컬럼값으로 나올때)
    -다중행(단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행일때
    -(단일행) 다중열서브쿼리 : 서브쿼리를 수행한 결과값이 여러 열일때
     -다중행 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행 여러 열일때
     
     -> 서브쿼리를 수행한 결과값이 몇행 몇열이냐에 따라서 사용 가능한 연산자가 달라진다.
     



    1.단일행 (단일열) 서브쿼리 (SINGLE ROW SUBQUERY)
    서브쿼리의 조회 결과값이 1개일때
    일반 연산자 사용가능 (=,!=,>,<,<=,>=,..)


전 직원의 평균 급여보다 더 적게 받는 사원들의 사원명 직급코드 급여를 조회해보자
SELECT FLOOR(AVG(SALARY))
FROM EMPLOYEE; --평균급여 3047662

SELECT EMP_NAME,JOB_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY <3047662; -- 전 직원 평균 급여보다 적게 받는 사원 조회

SELECT EMP_NAME,JOB_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY < (SELECT FLOOR(AVG(SALARY))
                FROM EMPLOYEE);--결과 값은 1행 1열 오직 1개의 값
                
최저급여를 받는 사원의 사번,사원명, 직급코드,급여,입사일을 조회해보자.
최저급여를 조회해보자
SELECT MIN(SALARY)
FROM EMPLOYEE; --최저급여 1380000

최저급여를 받는 사람을 조회하자
SELECT EMP_ID,EMP_NAME,JOB_CODE,SALARY,HIRE_DATE
FROM EMPLOYEE
WHERE SALARY = 1380000;

서브쿼리로 합쳐보기
SELECT EMP_ID,EMP_NAME,JOB_CODE,SALARY,HIRE_DATE
FROM EMPLOYEE
WHERE SALARY = (SELECT MIN(SALARY)
                FROM EMPLOYEE);

노옹철 사원의 급여보다 더 많이 받는 사원들의 사번, 이름, 부서코드, 급여 조회를 해보자.

SELECT EMP_ID,EMP_NAME,DEPT_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY > (SELECT SALARY FROM 
                EMPLOYEE WHERE EMP_NAME = '노옹철');
노옹철 사원의 급여보다 더 많이 받는 사원들의 사번,이름,부서명,급여 조회해보기

SELECT EMP_ID,EMP_NAME,DEPT_TITLE,SALARY
FROM EMPLOYEE E , DEPARTMENT D
WHERE E.DEPT_CODE=D.DEPT_ID 
AND SALARY > (SELECT SALARY FROM 
                EMPLOYEE WHERE EMP_NAME ='노옹철');
                
SELECT EMP_ID,EMP_NAME,DEPT_TITLE,SALARY
FROM EMPLOYEE E 
LEFT JOIN DEPARTMENT D ON(DEPT_CODE=DEPT_ID) 
AND SALARY > (SELECT SALARY FROM 
                EMPLOYEE WHERE EMP_NAME ='노옹철');

부서별 급여 합이 가장 큰 부서 하나만을 조회,부서코드,부서명,급여의 합(서브쿼리+GROUP BY +HAVING)

SELECT DEPT_CODE,DEPT_TITLE,(SUM(SALARY))
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_CODE=D.DEPT_ID
GROUP BY DEPT_CODE,DEPT_TITLE
HAVING SUM(SALARY)= (SELECT MAX(SUM(SALARY)) 
                    FROM EMPLOYEE 
                    GROUP BY DEPT_CODE); --부서별 급여합중 가장 큰값

728x90
300x250
LIST