Oracle SQL 강좌
Inline View (From절 Subquery) 13 14 99,999+

by 구루비 FROM절 서브쿼리 INLINE VIEW Subquery 서브쿼리 [2002.08.30]


Inline View (From절 Subquery)란?

FROM절에 오는 Subquery이다.

FROM절에서 원하는 데이터를 조회하여 가상의 집합을 만들어 조인을 수행하거나 가상의 집합을 다시 조회 할 때 사용한다.

Inlivew View 안에 또 다른 Inline View가 올 수 있다.

 
-- 부서번호 20의 평균 급여보다 크고, 
-- 부서번호 20에 속하지 않은 관리자를 조회하는 예제이다.
SELECT b.empno, b.ename, b.job, b.sal, b.deptno
  FROM (SELECT empno
          FROM emp  
         WHERE sal >(SELECT AVG(sal) 
                       FROM emp 
                      WHERE deptno = 20)) a, emp b
 WHERE a.empno = b.empno
   AND b.mgr is NOT NULL
   AND b.deptno != 20;

 EMPNO ENAME      JOB         SAL     DEPTNO
 ----- --------- --------- ------- ---------
  7698 BLAKE      MANAGER     2850        30
  7782 CLARK      MANAGER     2450        10

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1505

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 오라쿨 [2004.12.29 12:22:13]
select *
from (select * from emp where deptno not in (20))
where sal > (select avg(sal) from emp where deptno = 20)
and mgr is not null;

예제만 보고 해봤습니다.
결과는 같게 나온데, 위에 처럼 한 이유가 있을것 같은데...
아니면 제가 한게 잘 못될 수도 있을거고요.
어떤 차이가 있는지요?

by 최승훈 [2005.01.25 11:04:00]
수행결과가 더 느릴듯...

by smile [2005.11.09 20:28:04]
퍼갑니다. ^^
이 강좌의 제목을 보세요.. 결과보다 보여주기 위함이지 않을까요?

by 시근땀 [2006.03.20 14:59:48]
AND b.mgr is NOT NULL => 요 구문이
왜 '사원을 관리하는 사원' 의 조건이 되는거죠?
일반 사원도 mgr값이 있지 않나요?

by 몰름 [2006.07.30 02:21:01]
president(사장)를 제외한 겁니다.

by 한홍섭 [2009.06.02 21:16:09]
위의 예제로 보여준 문장을 풀어보면 다음과 같습니다.
From절 안의 서브쿼리의 결과는
7566
7698
7782
7788
7839
7902
이 나옵니다.
이를 WHERE a.empno = b.empno 로 조인하고
AND b.deptno != 20 로 20부서 인 7566, 7788, 7902가 제거됩니다.
그리고 AND b.mgr is NOT NULL 으로 mgr이 없는 KING이 제거되고
위의 예제의 결과처럼 7698, 7782만 남게 됩니다.
즉, 위의 질의문에선 '관리하는 사원'의 조건이 잘못된 것이라 봅니다

위의 예제의 조건대로 하려면 다음과 같이 하면 됩니다.
SELECT empno,ename,job,sal, deptno
FROM emp
WHERE sal >(SELECT AVG(sal)
FROM emp WHERE deptno = 20)
and
empno in (select mgr from emp)
AND deptno != 20
;

그럼 오늘도 모두 평안하시기를 빕니다


by 양한마리 [2010.02.03 10:54:29]
잘 봤어요~

by 서병준 [2012.10.10 21:10:52]
우와우 감사합니다 

by 손님 [2013.01.14 19:22:22]
분명 EMP는 사원 테이블인데 

예제에서는 관리자를 뽑는건데...

쿼리는 관리가가 있는 사원이네요;;;


by 정존 [2013.07.12 13:20:14]
좋은 자료 감사요^^    

by 손님 [2013.09.05 16:09:32]

샘플 Table데이터를 보질 않아서 모르겟는대
mgr is not null 로 매니저코드가 없는 사원들은 filter 시키는 것같은대요?
emp 테이블의 mgr 컬럼이 사원들을 관리하는 매니저를 말하는건지 아니면 그 사원이 매니저라는
값이 있는거에 따라 결과가 맞다 아니다 싶네요.

by 박군 [2013.12.31 16:15:45]

사장을 제외하거나 매니저의 역할을 하는 사람들만 보고싶다는 의미겠죵~!
이 사이트는 너무 좋네요
2013년 알게된 사이트에서 가장 만족합니다.

by 주정래 [2014.11.14 13:28:57]

- 부서번호 20의 평균 급여보다 크고,

- 부서번호 20에 속하지 않은 관리자를 조회하는 예제이다.
가 아니라
- 부서번호 20의 평균 급여보다 크고,
- 부서번호 20에 속하지 않은 관리자가 아닌 사람을 조회하는 예제이다.
아닐까요?

by 꿈꾸는DBA [2017.05.12 11:34:22]

저같은 경우엔 셀프조인을 썼는데요
SELECT a.deptno, a.sal, b.deptno, b.sal, b.ename, b.job
FROM emp a JOIN emp b ON (a.empno=b.mgr)
WHERE b.sal > (SELECT AVG(sal)
FROM emp
WHERE deptno=20)
AND b.deptno !=20
근데 이렇게 하면 a.emp 에 대한 부서번화와 급여까지 나와버리는데
셀프조인을 활용한 문구방법은 없을까요?

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입