SQL 명령에 포함되어 실행되는 SELECT 명령
다수의 SQL 명령으로 얻을 수 있는 결과를 하나의 SQL 명령으로 얻기 위해 사용하는 기능
SELECT 명령(MAINQUERY)에 포함되어 실행되는 SELECT 명령(SUBQUERY)
서브쿼리의 명령 실행 후 제공되는 검색결과를 가지고 메인쿼리의 명령 실행하여 검색
서브쿼리는 메인쿼리의 FROM, WHERE, HAVING에서 ( )안에 작성하여 실행
--EMP 테이블에서 사원이름이 SCOTT인 사원보다 많은 급여를 받은 사원의 사원번호,사원이름,급여 검색
--SELECT 명령을 2번 사용하여 원하는 결과 검색
SELECT SAL FROM EMP WHERE ENAME='SCOTT';--검색결과 : 3000
SELECT EMPNO,ENAME,SAL FROM EMP WHERE SAL>3000;
SELECT EMPNO,ENAME,SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME='SCOTT');
--EMP 테이블에서 사원번호가 7844인 사원과 같은 업무를 하는 사원의 사원번호,사원이름,업무,급여 검색
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7844)
AND EMPNO<>7844;
--EMP 테이블에서 사원번호가 7521인 사원과 같은 업무를 하는 사원 중 사원번호가 7844인 사원보다
--많은 급여를 받는 사원의 사원번호,사원이름,업무,급여 검색
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7521)
AND EMPNO<>7521 AND SAL>(SELECT SAL FROM EMP WHERE EMPNO=7844);
--EMP 테이블에서 SALES 부서에 근무하는 사원의 사원번호,사원이름,업무,급여 검색
--부서이름은 DEPT 테이블에 저장되어 있으므로 테이블 결합을 사용하여 검색
SELECT EMPNO, ENAME, JOB, SAL FROM EMP JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO WHERE DNAME='SALES';
--테이블 결합 대신 서브쿼리를 사용하여 검색 가능
SELECT EMPNO, ENAME, JOB, SAL FROM EMP
WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES');
--EMP 테이블에 저장된 모든 사원 중 가장 적은 급여를 받는 사원의 사원번호,사원일,업무,급여 검색
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL=(SELECT MIN(SAL) FROM EMP);
--EMP 테이블에서 SALES 부서에 근무하는 사원 중 가작 적은 급여를 받는 사원의 사번,이름,업무,급여 검색
--오라클은 서브쿼리 안에 서브쿼리 사용 가능
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL=(SELECT MIN(SAL) FROM EMP
WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES'));
--EMP 테이블에서 부서별 평균 급여 중 가장 많은 평균 급여를 받는 부서의 부서번호와 평균급여 검색
SELECT DEPTNO,CEIL(AVG(SAL)) AVG_SAL FROM EMP GROUP BY DEPTNO
HAVING AVG(SAL)=(SELECT MAX(AVG(SAL)) FROM EMP GROUP BY DEPTNO);
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL=(SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);
-- 다중행 오류 발생
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE SAL IN(SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);
--EMP 테이블에서 부서번호가 10인 부서에 근무하는 어떠한 사원보다 급여가 적은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL < ANY (SELECT SAL FROM EMP WHERE DEPTNO=10) AND DEPTNO<>10;
--EMP 테이블에서 부서번호가 10인 부서에 근무하는 모든 사원보다 급여가 적은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL < ALL (SELECT SAL FROM EMP WHERE DEPTNO=10);
--EMP 테이블에서 부서번호가 20인 부서에 근무하는 어떠한 사원보다 급여가 많은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL > ANY (SELECT SAL FROM EMP WHERE DEPTNO=20) AND DEPTNO<>20;
--EMP 테이블에서 부서번호가 20인 부서에 근무하는 모든 사원보다 급여가 많은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO=20);
---EMP 테이블에서 부서번호가 10인 부서에 근무하는 어떠한 사원보다 급여가 적은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL < (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=10) AND DEPTNO<>10;
--EMP 테이블에서 부서번호가 10인 부서에 근무하는 모든 사원보다 급여가 적은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL < (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=10);
--EMP 테이블에서 부서번호가 20인 부서에 근무하는 어떠한 사원보다 급여가 많은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=20) AND DEPTNO<>20;
--EMP 테이블에서 부서번호가 20인 부서에 근무하는 모든 사원보다 급여가 많은 사원의
--사원번호, 사원이름, 급여, 부서번호 검색
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=20);
SELECT EMPNO,ENAME,MGR,JOB FROM EMP WHERE MGR=(SELECT MGR FROM EMP WHERE ENAME='ALLEN')
AND JOB=(SELECT JOB FROM EMP WHERE ENAME='ALLEN') AND ENAME<>'ALLEN';
--중복되는 구문 발생
SELECT EMPNO, ENAME, MGR, JOB, SAL FROM EMP
WHERE (MGR,JOB)=(SELECT MGR,JOB FROM EMP WHERE ENAME='ALLEN') AND ENAME<>'ALLEN';
--문제1.사원 테이블에서 BLAKE 보다 급여가 많은 사원들의 사번,이름,급여를 검색하시오.
SELECT EMPNO,ENAME,SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME='BLAKE');
--문제2.사원 테이블에서 MILLER 보다 늦게 입사한 사원의 사번,이름,입사일을 검색하시오.
SELECT EMPNO, ENAME, HIREDATE FROM EMP
WHERE HIREDATE > (SELECT HIREDATE FROM EMP WHERE ENAME='MILLER');
--문제3.사원 테이블에서 사원 전체 평균 급여보다 급여가 많은 사원들의 사번,이름,급여 검색하시오.
SELECT EMPNO, ENAME, SAL FROM EMP WHERE SAL > (SELECT AVG(SAL) FROM EMP);
--문제4.사원 테이블에서 CLARK와 같은 부서이며, 사번이 7698인 직원의 급여보다
--많은 급여를 받는 사원들의 사번, 이름, 급여를 검색하시오.
SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE ENAME='CLARK')
AND SAL>(SELECT SAL FROM EMP WHERE EMPNO=7698);
--문제5.사원 테이블에서 부서별 최대 급여를 받는 사원들의 사번,이름,부서코드,급여를 검색하시오.
SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP
WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO) ORDER BY DEPTNO;