SUBQUERY(1)
[ [ 서브쿼리 ] ]
하나의 SQL문 안에 포함된 또 다른 SELECT문
메인 SQL문을 위해 보조 역할을 하는 쿼리
[ 서브쿼리의 구분 ]
서브쿼리를 수행한 결과값이 몇행 몇열로 나오느냐에 따라서 분류
* 단일행 서브쿼리 : 서브쿼리의 조회 결과값이 오로지 1개일 때
* 다중행 서브쿼리 : 서브쿼리의 조회 결과값이 여러행일 때(여러행 한열)
* 다중열 서브쿼리 : 서브쿼리의 조회 결과값이 한행이지만 컬럼이 여러개일 때
* 다중행 다중열 서브쿼리 : 서브쿼리의 조회 결과값이 여러행 여러컬럼일 때
>> 서브쿼리의 결과값에 따라서 서브쿼리 앞쪽에 연산자가 달라진다.
< 단일행 서브쿼리 >
서브쿼리의 조회 결과값이 오로지 1개일 때(한행 한열)
일반 비교연산자 사용 가능( = != > <= ... )
EX1) 노옹철 사원과 같은 부서에 속한 사원들 조회
SELECT
emp_name
FROM
employee
WHERE
dept_code = (
SELECT
dept_code
FROM
employee
WHERE
emp_name = '노옹철'
);
< 다중행 서브쿼리 >
서브쿼리를 수행한 결과값이 여러행일 때(컬럼은 한개)
* IN (서브쿼리) : 서브쿼리의 여러개의 결과값 중에서 한개라도 일치하는 값이 있다면 조회
* > ANY (서브쿼리) : 서브쿼리의 여러개의 결과값 중에서 한개라도 클경우 조회
* < ANY (서브쿼리) : 서브쿼리의 여러개의 결과값 중에서 한개라도 작을경우 조회
* 비교대상 > ANY (서브쿼리의 결과값 -> 값1, 값2, 값3...)
* > ALL(서브쿼리) : 여러개의 모든 결과값들 보다 클 경우 조회
* < ALL(서브쿼리) : 여러개의 모든 결과값들 보다 작을 경우 조회
EX) 유재식 또는 윤은해사원과 같은 직급인 사원들의 사번, 사원명, 직급코드, 급여조회
SELECT
emp_id,
emp_name,
job_code,
salary
FROM
employee
WHERE
job_code IN (
SELECT
job_code
FROM
employee
WHERE
emp_name IN ( '유재식', '윤은해' )
);
EX2) 대리 직급임에도 과장 직급 급여들 중 최소 급여보다 많이받는 사원들의 사번, 이름, 직급, 급여 조회
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
JOIN job USING ( job_code )
WHERE
job_name = '과장'
);
< 다중열 서브쿼리 >
결과값은 한 행이지만 나열된 컬럼수가 여러개일 경우
EX1) 하이유 사원과 같은 부서코드, 같은 직급코드에 해당하는 사원들 조회
SELECT
emp_name,
dept_code,
job_code,
hire_date
FROM
employee
WHERE
dept_code = (
SELECT
dept_code
FROM
employee
WHERE
emp_name = '하이유'
)
AND job_code = (
SELECT
job_code
FROM
employee
WHERE
emp_name = '하이유'
);
WHERE 조건절 부분을 두 가지 방법으로 작성가능하다.
WHERE
dept_code = (
SELECT
dept_code
FROM
employee
WHERE
emp_name = '하이유'
)
AND job_code = (
SELECT
job_code
FROM
employee
WHERE
emp_name = '하이유'
);
WHERE
( dept_code,
job_code ) = (
SELECT
dept_code,
job_code
FROM
employee
WHERE
emp_name = '하이유'
);
< 다중행 다중열 서브쿼리 >
서브쿼리의 조회 결과값이 여러행 여러열일 경우
EX) 각 직급별 최소급여를 받는 사원조회(사번, 사원명, 직급코드, 급여)
SELECT
emp_id,
emp_name,
job_code,
salary
FROM
employee
WHERE
( job_code, salary ) IN (
SELECT
job_code, MIN(salary)
FROM
employee
GROUP BY
job_code
);