티스토리 뷰
SUBQUERY ( 서브쿼리 ) 란 ?
-
하나의 SQL문 내에 또 다른 SQL문이 있는 쿼리문
-
전체 SQL문을 메인 쿼리라고 하며, 메인 쿼리에 종속된 내부 쿼리를 서브쿼리라고 합니다.
-
반드시 괄호 ( ) 안에 넣어 표현해야 합니다.
단일 행 서브쿼리
-
서브 쿼리의 결과가 1개의 행만 나오는 것
-
메인 쿼리의 WHERE절에서 단일 행 연산자 (=, <>, >, >=, <, <=)를 이용
/* JONES보다 더 많은 월급을 받는 사람의 이름과 월급 출력 */
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME='JONES');
다중 행 서브쿼리
-
서브 쿼리의 결과가 2개 이상인 것
-
다중 행 연산자 (IN, NOT IN, ANY, ALL, EXISTS)만 사용 가능
IN, NOT IN
/* 부하직원이 없는 사원의 사원번호와 이름 출력 */
SELECT EMPNO, ENAME
FROM EMP
WHERE EMPNO NOT IN (SELECT NVL(MGR,0) FROM EMP);
ANY, SOME
: 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과 중 하나 이상 만족되면 출력
/* SALESMAN들의 급여와 같은 급여를 받는 사원을 조회해보자. */
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL = ANY(SELECT SAL FROM EMP WHERE JOB='SALESMAN');
ALL
: 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과 모두와 일치하면 출력
/* MANAGER들의 급여보다 높은 급여를 받는 사원을 출력해보자. */
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE JOB='MANAGER');
EXISTS
: 서브 쿼리의 데이터가 존재하는 지의 여부를 먼저 따지고, 존재하는 값들만 출력
/* 관리자로 등록되어 있는 사원들을 조회해보자. */
SELECT EMPNO, ENAME
FROM EMP E
WHERE EXISTS (SELECT EMPNO FROM EMP WHERE E.EMPNO=MGR);
다중 열 서브 쿼리
-
서브 쿼리의 결과가 두 개 이상의 컬럼으로 반환되어 메인 쿼리에 전달되는 것
/* SALESMAN들과 같은 부서에서 근무하고 같은 월급을 받는 사원들을 조회해보자. */
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, SAL FROM EMP WHERE JOB='SALESMAN');
스칼라 서브 쿼리
-
SELECT문에서 쓰이는 단일 행 서브 쿼리
상관 쿼리
-
메인 쿼리의 특정 컬럼을 JOIN 조건으로 사용하는 서브 쿼리
/* 사원들의 이름, 직업, 부서이름을 조회해보자. */
SELECT ENAME, JOB,
(SELECT DNAME
FROM DEPT
WHERE DEPTNO=E.DEPTNO) DNAME
FROM EMP E;
/* SALES 부서의 사원 이름과 직업을 조회해보자. */
SELECT ENAME, JOB
FROM EMP E
WHERE DEPTNO = (SELECT DEPTNO
FROM DEPT
WHERE DEPTNO=E.DEPTNO AND DNAME='SALES');
FROM절 서브 쿼리 ( = 인라인 뷰 )
/* 20번 부서의 평균 급여보다 높고, MANAGER인 사원들을 조회해보자. */
SELECT E.EMPNO, E.ENAME, E.JOB, E.SAL, E.DEPTNO
FROM (SELECT EMPNO
FROM EMP
WHERE SAL > (SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO=20) ) A, EMP E
WHERE A.EMPNO = E.EMPNO
AND E.MGR IS NOT NULL;
'DATABASE > 이론' 카테고리의 다른 글
[DB] 집합 연산자 - UNION , UNION ALL , INTERSECT , MINUS (0) | 2020.01.06 |
---|---|
[DB] [ORACLE] JOIN - EQUI , NON-EQUI , SELF , INNER , OUTER (0) | 2020.01.02 |
[DB] [ORACLE] TOP N QUERY - ROWNUM ( 조회한 결과에 순위 매기기 ) (0) | 2019.12.31 |
[DB] 분석 함수 3 - 다중 행 함수 ( 집계함수 , 그룹함수 ) , GROUP BY , HAVING (0) | 2019.12.31 |
[DB] 분석 함수 2 - 날짜 함수 , 변환 함수 , 기타 함수 (0) | 2019.12.31 |