단일 행 서브쿼리 서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 수가 반드시 1건 이하 2건 이상일 경우 오류 발생
-- 서브쿼리의 결과는 1건
SELECT
emp.*
FROM employees emp
WHERE
emp.emp_id = (
SELECT deptm.emp_id
FROM department_managers deptm
WHERE
deptm.end_at IS NULL
AND deptm.dept_code = 'D002'
)
;
다중 행 서브쿼리 서브쿼리가 2건 이상 반활 될 경우에는 반드시 다중 행 비교연산자(IN, ALL, ANY, SOME, EXISTS 등)을 사용
SELECT
emp.*
FROM employees emp
WHERE
emp.emp_id in (
SELECT deptm.emp_id
FROM department_managers deptm
WHERE
deptm.dept_code = 'D002'
)
;
다중 열 서브쿼리 서브쿼리의 결과가 여러개의 컬럼을 반환 할 경우 메인 쿼리의 조건과 동시에 비교
SELECT
depte.*
FROM department_emps depte
WHERE
(depte.dept_code, depte.emp_id) in (
SELECT
deptm.dept_code
,deptm.emp_id
FROM department_managers deptm
WHERE
deptm.dept_code = 'D002'
)
;
연관 서브쿼리 서브쿼리 내에서 메인쿼리의 컬럼이 사용된 서브쿼리
SELECT
emp.*
FROM employees emp
WHERE
emp.emp_id in (
SELECT deptm.emp_id
FROM department_managers deptm
WHERE
deptm.emp_id = emp.emp_id
)
;
SELECT
emp.emp_id
,(
SELECT AVG(sal.salary)
FROM salaries sal
WHERE sal.emp_id = emp.emp_id
) avg_sal
FROM employees emp
;
SELECT
tmp.*
FROM (
SELECT
emp_id
,birth
FROM employees
) tmp
;