하나의 SQL문 처리 결과를 다른 SQL문에 전달하기 위해서
두 개 이상의 SQL문을 하나의 SQL문을 연결
외부 질의의 WHERE 절에서 다시 SELECT ... FROM ... WHERE 형태로 포함된 SELECT문
부질의(subquery)라고 함
중첩 질의는 외부 질의와 구분하기 위해 괄호로 묶는다
INSERT, DELETE, UPDATE문에도 사용
한 속성에 대한 다중 값 반환
외부 질의의 WHERE 절에서 IN,ANY(SOME),ALL,EXISTS 연산자를 사용
IN : 한 속성 값이 값들의 집합에 속하는지 여부를 판단
CASE 1
질의 : 영업부나 개발부에 근무하는 사원들의 이름을 검색
SELECT EMPNAME FROM EMPLOYEE
WHERE DNO IN
(SELECT DEPTNO FROM DEPARTMENT
WHERE DEPTNAME ='영업' OR DEPTNAME = '개발');
CASE 2
질의 : 영업부나 개발부에 근무하지 않는 사원들의 이름을 검색
SELECT EMPNAME FROM EMPLOYEE
WHERE DNO NOT IN
(SELECT DEPTNO FROM DEPARTMENT
WHERE DEPTNAME ='영업' OR DEPTNAME = '개발');
질의 : 영업 부서에 근무하는 사원들이 받는 급여와 같은 급여를 받는 사원들의 사원 번호와 이름, 부서명을 검색
SELECT EMPNO, EMPNAME, DEPTNAME FROM EMPLOYEE E,
WHERE E.DNO = D.DEPTNO AND DEPTNAME <> '영업' AND
SALARY = ANY
(SELECT SALARY FROM EMPLOTEE E, DEPT D
WHERE E.DNO = D.DEPTNO AND
D.DEPTNAME = '영업');
질의 : 영업 부서에 근무하는 모든 사원들의 급여보다 높은 급여를 받는 사원의 사번과 이름을 검색
SELECT EMPNO, EMPNAME FROM EMPLOYEE
WHERE SALARY > ALL
(SELECT SALARY FROM EMPLOYEE E, DEPT D
WHERE E.DNO = D.DEPTNO AND D.DEPTNAME = '영업');
EXISTS 연산자를 사용하여 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사
= 중첩 질의의 결과가 빈 릴레이션 ? 참 : 거짓
CASE 1
질의 : 영업부나 개발부에 근무하는 사원들의 이름 검색
SELECT EMPNAME FROM EMPLOYEE E
WHERE EXISTS
(SELECT * FROM DEPARTMENT D WHERE E.DNO = D.DEPTNO AND
(DEPTNAME = '영업' OR D.DEPTNAME = '개발'));
CASE 2
질의 : 영업부나 개발부에 근무하지않는 사원들의 이름 검색
SELECT EMPNAME FROM EMPLOYEE E
WHERE NOT EXISTS
(SELECT * FROM DEPARTMENT D WHERE E.DNO = D.DEPTNO AND
(DEPTNAME = '영업' OR D.DEPTNAME = '개발'));