하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장. 서브 쿼리를 포함하고 있는 쿼리문을 메인쿼리, 포함된 또하나의 쿼리를 서브 쿼리라 한다.
리턴값이 1개 이하인 서브쿼리
단일행 비교연산자와 사용 (=, <, <=, >=, >, <>)
SELECT ENAME , SAL , MGR FROM EMP WHERE mgr =
( SELECT EMPNO FROM emp WHERE ENAME ='KING' );
리턴값이 여러행
다중행 비교연산자와 사용 (IN, ALL, ANY, SOME, EXISTS)
--<in 연산자>
--서브쿼리의 검색 결과 중에서 하나라도 일치되면 참이된다.
--Q. 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에서 근무하는
-- 사원들의 정보를 출력하는 SQL문 작성?
select ename, sal, deptno from emp where deptno in
(select distinct deptno from emp where sal >= 3000); -- 10, 20
--<all 연산자>
--메인쿼리의 비교조건이 서브쿼리의 검색 결과와 모든 값이 일치되면 참이된다.
--Q. 30번 부서에 소속된 사원 중에서 급여를 가장 많이 받는 사원보다 더 많은
-- 급여를 받는 사원의 이름과 급여를 출력하는 SQL문 작성?
--1) 단일행 서브쿼리로 구하기
select ename, sal from emp where sal >
(select max(sal) from emp where deptno = 30); -- 2850
--2) 다중행 서브쿼리로 구하기
select ename, sal from emp where sal >all
(select sal from emp where deptno = 30); -- 다중행 서브쿼리
--<any 연산자>
--메인쿼리의 비교 조건이 서브쿼리의 검색 결과와 하나 이상 일치되면 참이된다.
--Q. 부서번호가 30번인 사원들의 급여중 가장 낮은 급여(950)보다 더높은 급여를
-- 받는 사원명과 급여를 출력하는 SQL문 작성?
--1) 단일행 서브쿼리로 구하기
select ename, sal from emp where sal >
(select min(sal) from emp where deptno=30); -- 950
--2) 다중행 서브쿼리로 구하기
select ename, sal from emp where sal >any
(select sal from emp where deptno=30); -- 다중행 서브쿼리
조건절에서 사용하며 다수의 비교값과 비교하여 그 중 하나라도 같은 값이 있다면 True
다수의 비교값 중 한개라도 만족하면 True. IN과 다른점은 비교 연산자를 사용한다는 것이다.
IN은 각 요소에 대해 == 연산, ANY는 앞에 주어진 비교 연산자를 수행한다.
ANY : 최소값 보다 크면
= ANY : 최소값보다 크거나 같으면
< ANY : 최대값보다 작으면
<= ANY : 최대값보다 작거나 같으면
= ANY : IN과 같은 효과
!= ANY : NOT IN과 같은 효과
전체 값을 비교하여 모두 만족해야만 True
ALL : 최대값 보다 크면
= ALL : 최대값보다 크거나 같으면
< ALL : 최소값보다 작으면
<= ALL : 최소값보다 작거나 같으면
= ALL : SUBSELECT의 결과가 1건이면 상관없지만 여러 건이면 오류가 발생합니다.
!= ALL : 위와 마찬가지로 SUBSELECT의 결과가 여러 건이면 오류가 발생합니다.