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='대리';
반응형