하나의 SQL 문장 절에 포함된 또 다른 SELECT 문장으로
두 번 질의를 해야 얻을 수 있는 결과를 한 번의 질의로 해결이 가능하게 하는 쿼리
용어 Main-Query 또는 Outer-Query
Sub-Query 또는 Inner-Query 두 쌍이 같은 의미이다
특징 - 괄호를 반드시 묶어야 한다
SQL> select job from emp where empno = 7900;
실행결과
job
----
CLERK
SQL> select empno,ename from emp where job = 'CLERK';
SQL> select empno,ename
from emp
where job = (select job from emp where empno = 7900);
사원들의 평균 급여보다 급여를 많이 받는 사원들의 사원번호,이름,급여를 출력해보세요
SQL> select empno,ename,sal from emp where sal > (select avg(sal) from emp) ;
사원번호가 7369인 사원과 같은 부서인 사원들의 부서번호, 이름, 급여를 출력해보세요
SQL> select deptno, ename, sal from emp where deptno = (select deptno from emp where empno = 7369);
사원번호가 7900인 사원과 같은 부서이고, 사원번호가 7369번인 사원보다 많은 급여를 받는
사원의 이름,부서번호,급여를 출력해보세요SQL> select ename,deptno,sal from emp where deptno = (select deptno from emp where empno = 7900) and sal > (select sal from emp where empno = 7369);
각 부서의 최소 급여가 부서번호가 30번인 부서의 최소 급여보다
많은 급여를 받는 부서의 부서번호, 최소 급여를 출력해보세요
SQL> select deptno,min(sal)
from emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno = 30);
-쿼리의 실행 결과가 여러 개의 칼럼이거나 여러 행을 리턴해주는 쿼리
-반드시 다중행 연산자와 함께 써야 한다
부서번호가 10번이거나 20번인 사원번호와 이름, 부서번호를 출력하세요
SQL> select empno,ename,deptno from emp where deptno=10 or deptno=20;
IN 연산자를 사용한다면?
SQL> select empno,ename,deptno from emp where deptno in(10,20)
다중행 쿼리 사용하기
부서번호가 30번인 사원들의 급여와 커미션이 같은 사원의 이름과 커미션을 출력해보세요
SQL> select ename,comm,deptno from emp where (sal,comm) in (select sal,comm from emp where deptno=30);
사원 테이블에서 적어도 한 명의 사원으로부터 보고를 받을 수 있는
사원의 사원번호, 이름, 직업, 입사일을 출력해보세요
SQL> select empno,ename,job,hiredate
from emp e1
where exists (select * from emp e2 where e2.mgr = e1.empno);
SQL> select empno,ename,job,hiredate
from emp
where empno in (select mgr from emp group by mgr);
SQL> select empno,ename,job,hiredate
from emp
where empno in (select distinct(mgr)from emp);
SQL> select e1.empno,e1.ename,e1.job,e1.hiredate
from emp e1,emp e2
where e1.empno = e2.mgr;
활용 예제 1) sal > 300 OR sal > 400 OR sal > 500 이므로 sal이 300보다 크면 조건을 만족한다.
SELECT ename, salFROM emp WHERE sal > ANY(300, 400, 500);
활용 예제 1) sal > 300 AND sal > 400 AND sal > 500 이므로 sal이 500보다 크면 조건을 만족한다.
SELECT ename, salFROM emp WHERE sal > ALL(300, 400, 500);
활용 예제) 서브쿼리에서 반환하는 행이 1개라도 있으면 true를 반환합니다.
SELECT ename, sal FROM emp WHERE EXISTS( SELECT * FROM emp WHERE sal = 300 );
SELECT ename, sal FROM emp WHERE NOT EXISTS( SELECT * FROM emp WHERE sal = 300 );