DB(SQL)

[SQL] 서브쿼리 - 단일행(단일열), 다중행(단일열)

이나피스 2022. 3. 27. 00:42
반응형

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

서브쿼리의 조회결과 값이 한 개인 경우

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

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

--부서별 급여 합이 가장 큰 부서 하나만을 조회하여 부서코드, 부서명, 급여합 출력
--ORACLE
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);
--ANSI
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);

 

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

서브쿼리의 조회결과 하나의 컬럼에 행의 개수가 여러 개인 경우

- 조건

   IN (10,20,30) : 여러 개의 결과 값 중에서 하나라도 일치하는 것이 있다면

   NOT IN(10,20,30) : 여러 개의 결과 값 중에서 하나라도 일치하는 것이 없다면

   > ANY (10,20,30) : 여러개의 결과값중에서 하나라도 클 경우

   < ANY (10,20,30) : 여러개의 결과값중에서 하나라도 작을 경우

   > ALL : 여러개의 결과값의 모든 값보다 클 경우(결과값 중 가장 큰 값보다 클 경우)

   < ALL : 여러개의 결과값의 모든 값보다 작을 경우(결과값 중 가장 작은 값보다 작을 경우)

--각 부서 별 최고 급여를 받는 사원의 이름, 직급코드, 급여 조회
--1)각 부서별 최고급여 조회(여러행,단일열)
SELECT DEPT_CODE, MAX(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE; --2890000,3660000,8000000,3760000,3900000,2490000,2550000
--2)위에서 조회한 급여들을 받는 사원들 조회
SELECT EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY IN(2890000,3660000,8000000,3760000,3900000,2490000,2550000);
--3)합치기
SELECT EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY IN(SELECT MAX(SALARY)
                FROM EMPLOYEE
                GROUP BY DEPT_CODE);

--이오리 또는 하동운 사원과 같은 직급인 사원 조회(사원명,직급코드,부서코드,급여)
SELECT EMP_NAME,JOB_CODE,DEPT_CODE,SALARY
FROM EMPLOYEE
WHERE JOB_CODE IN (SELECT JOB_CODE
                    FROM EMPLOYEE
                    WHERE EMP_NAME IN('이오리','하동운'));

--대리 직급인데 과장보다 급여 많이 받는 사원들 조회 (사번,이름,직급명,급여)
SELECT EMP_ID,EMP_NAME,JOB_NAME,SALARY
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE=J.JOB_CODE
AND SALARY > ANY(SELECT SALARY
             FROM EMPLOYEE E, JOB J
             WHERE E.JOB_CODE=J.JOB_CODE
             AND J.JOB_NAME='과장')
AND JOB_NAME='대리';

반응형