서브쿼리 : 메인 SQL문에 포함되어 있는 또 다른 SQL문을 말한다.

  • 반드시 괄호( )로 감싸서 사용한다.
  • 메인SQL문보다 서브쿼리가 먼저 실행된다.
  • 서브쿼리만 가지고도 실행되어야 한다.
  • 서브쿼리의 결과가 바깥쿼리의 인자(매개변수)로 사용된다.
  • 서브쿼리의 대부분을 조인으로 만들 수 있다.
  • 서브쿼리와 조인(JOIN)문은 병행되어 사용이 가능하다.
  • 서브쿼리 안에서 ORDER BY절은 사용할 수 없다.
  • 서브쿼리는 위치에 따라 명칭이 다르다.
    • FROM절에 사용시 인라인 뷰 (Inline view)
    • SELECT문에 사용시 스칼라 서브쿼리 (Scala Subquery)
    • WHERE절에 사용시 서브쿼리(Subquery) - 일반적

 


 

  • JONES의 부서명을 구해서 JONES와 같은부서의 부서명과 사원명 출력하기
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.DEPTNO =
    (SELECT DEPTNO FROM EMP WHERE ENAME = 'JONES');

 

  • 10번 부서에서 근무하는 사원의 이름과 부서명을 출력하기
--JOIN 사용
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E. DEPTNO = 10;

--서브쿼리 사용
SELECT E.ENAME, D.DNAME
FROM EMP E, (SELECT DEPTNO, DNAME FROM DEPT WHERE DEPTNO = 10) D
WHERE E.DEPTNO = D.DEPTNO;

 

  • 평균보다 더 많은 급여를 받는 사원들을 검색해 출력하기
SELECT EMPNO, ENMAE, SAL
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP);

 

  • 'BLAKE'가 속한 부서의 사원 이름과 고용일자 출력하기
SELECT ENAME, HIREDATE
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'BLAKE');

 

  • 급여가 3000 이상인 사원이 소속된 부서의 사원명, 급여, 부서번호 출력하기 (다중행 처리 -리턴값이 여러개 IN연산자 활용)
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL >= 3000)
ORDER BY DEPTNO;

 

  • 30번 부서원들 중 제일 많이 급여를 받는 사람보다, 더 많이 받는 사람들의 이름과 급여를 출력하기 (ALL)
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30);
--컬럼 > (전체만족)ALL : 가장 큰 값보다 큰 값/ 위와 같은 결과
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);
--컬럼 < (전체만족)ALL : 가장 작은 값보다 작은 값
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);

 

  • 20번 부서원들 중 가장 낮은 급여를 받는 사람보다, 더 많은 급여를 받는 사람의 이름과 급여를 출력 (ANY)
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=20);
--컬럼 > (부분만족)ANY : 가장 작은 값보다 큰값/ 위와 같은 결과
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY(SELECT SAL FROM EMP WHERE DEPTNO=20);
--컬럼 < (부분만족)ANY : 가장 큰 값보다 작은값
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ANY(SELECT SAL FROM EMP WHERE DEPTNO=20);

 

  • 급여가 평균 급여보다 많고, 이름에 S가 들어가는 사원과 동일한 부서에서 근무하는 사원의 사번, 이름, 급여 출력하기

- 이중 서브쿼리

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL >
    (SELECT AVG(SAL) FROM EMP) AND ENAME LIKE '%S%');

+ Recent posts