Study
[Oracle/오라클] 서브쿼리 (SUBQUERY)
_유니
2023. 1. 2. 18:11
서브쿼리 (SUBQUERY)
하나의 SQL문 안에 포함된 또 다른 SELECT문
메인 SQL문을 위해 보조 역할을 하는 쿼리문
- 단일행 서브쿼리 (SINGLE ROW SUBQUERY)
서브쿼리의 조회 결과값의 개수가 오로지 1개일 때 (한 행 한열)
일반 비교 연산자 사용 가능 (= != ^= > < >=, ....)
-- 최저 급여를 받는 사원의 사번, 이름, 급여, 입사일 조회
SELECT EMP_ID, EMP_NAME, 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_CODE, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID
AND SALARY > (SELECT SALARY
FROM EMPLOYEE
WHERE EMP_NAME = '노옹철');
-- ANSI 구문
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE SALARY > (SELECT SALARY
FROM EMPLOYEE
WHERE EMP_NAME = '노옹철');
-- 부서별 급여합이 가장 큰 부서의 부서코드, 급여 합 조회
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) = (SELECT MAX(SUM(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE);
-- 전지연 사원과 같은 부서원들의 사번, 사원명, 전화번호, 입사일, 부서명(전지연 제외)
-- 오라클 전용 구문
SELECT EMP_ID, EMP_NAME, PHONE, HIRE_DATE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE (DEPT_CODE = DEPT_ID)
AND DEPT_CODE = (SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '전지연')
AND EMP_NAME != '전지연';
-- ANSI 구문
SELECT EMP_ID, EMP_NAME, PHONE, HIRE_DATE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE DEPT_CODE = (SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '전지연')
AND EMP_NAME != '전지연';
- 다중행 서브쿼리 (MULTI ROW SUBQUERY)
서브쿼리를 수행한 결과값이 여러 행일 때(여러 행 한열)
IN 서브쿼리 : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면
> ANY 서브쿼리 : 여러 개의 결과값 중에서 한 개라도 클 경우
< ANY 서브쿼리 : 여러 개의 결과값 중에서 한 개라도 작을 경우
> ALL 서브쿼리 : 여러 개의 모든 결과값들보다 클 경우
< ALL 서브쿼리 : 여러 개의 모든 결과값들보다 작을 경우
-- 유재식 또는 윤은해 사원과 같은 직급인 사원들의 사번, 사원명, 직급코드, 급여
SELECT EMP_ID, EMP_NAME, JOB_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
JOIN JOB USING (JOB_CODE)
WHERE JOB_NAME = '대리'
AND SALARY > ANY (SELECT SALARY
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE
AND JOB_NAME = '과장');
- 다중열 서브쿼리
서브쿼리의 조회 결과값이 한 행이지만 컬럼이 여러 개일 때 (한 행 여러 열)
-- 하이유 사원과 같은 부서코드, 같은 직급코드에 해당하는 사원들 조회 (사원명, 부서코드, 직급코드, 입사일)
SELECT EMP_NAME, DEPT_CODE, JOB_CODE, HIRE_DATE
FROM EMPLOYEE
WHERE (DEPT_CODE, JOB_CODE) = (SELECT DEPT_CODE, JOB_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '하이유');
- 다중행 다중열 서브쿼리
서브쿼리의 조회 결과값이 여러 행 여러컬림일 때 (여러 행 여러 열)
-- 각 부서별 최고급여를 받는 사원들의 사번, 사원명, 부서코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE (DEPT_CODE, SALARY) IN (SELECT DEPT_CODE, MAX(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE);