13
SQL 기기기기 #7 상상 상상상상 (Correlated Sub Query) 기기기기기 (http://www.topcredu.co.kr), 기기기 This practice makes the expert

(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

  • Upload
    3-2

  • View
    808

  • Download
    1

Embed Size (px)

Citation preview

Page 1: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

SQL 기초과정 #7상관 서브쿼리

(Correlated Sub Query)

탑크리에듀 (http://www.topcredu.co.kr), 이종철

This practice makes the expert

Page 2: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

강의자료 , 실습코드는 다음 URL 에서 확인하실 수 있습니다 .

http://ojc.asia

Page 3: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

상관 서브쿼리 (Correlated Sub Query)

• 서브 쿼리와 메인쿼리간에 서로 상관 참조하는 쿼리로 Inner Query에서 Outer Query 의 어떤 컬럼을 이용하는 경우다 . • 일반적인 Query 는 서브 쿼리의 결과를 메인에서는 단순히 이용만 하지만 ( 이때 서브쿼리는 제공자로서의 역할을 한다 ) 상관 서브 쿼리에서는 서브 쿼리가 메인 쿼리의 값을 이용하여 값을 구하면 그 값을 다시 메인 쿼리에서 이용하는 구조이므로 서브쿼리는 값을 확인하는 확인자 역할을 하게된다 .

This practice makes the expert

Page 4: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

상관 서브쿼리 실행 순서• 1. Outer query 를 실행하여 행을 하나 읽는다 . • 2. (1) 에서 읽은행의 값을 이용하여 서브쿼리에서 필요한 값을 넣고

Subquery 를 수행한다 .• 3. (2) 의 결과값으로 Outer query 의 WHERE 절을 평가하여 읽은 행의 선택여부를 결정한다 . 참이면 데이터 추출 , 아니면 버리고

Outer Query 의 다음 레코드를 읽음• 4. Outer query 의 테이블에 행이 없을 때까지 (1)-(3) 을 반복 수행한다 . This practice makes the expert

Page 5: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 1

• 각 부서의 최대 급여를 받는 사원의 부서코드 , 이름 , 급여를 출력하는데 부서코드 순으로 오름차순 정렬하여 출력하는 예문 첫번째 상관서브쿼리로 구현select deptno, ename, sal from emp e1where sal = (select max(sal) from emp e2 where e1.deptno = e2.deptno)order by deptno;

DEPTNO ENAME SAL---------- ---------- ---------- 10 KING 5000 20 SCOTT 3000 20 FORD 3000 30 BLAKE 2850

This practice makes the expert

Page 6: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 2• 각 부서의 최대 급여를 받는 사원의 부서코드 , 이름 , 급여를 출력하는데 부서코드 순으로 오름차순 정렬하여 출력하는 예문 • Pairwise 서브쿼리로 구현select ename, sal, deptno from emp where (deptno, sal ) in (select deptno, max(sal) from emp group by deptno)order by deptno;

DEPTNO ENAME SAL---------- ---------- ---------- 10 KING 5000 20 SCOTT 3000 20 FORD 3000 30 BLAKE 2850

This practice makes the expert

Page 7: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 3• 각 부서의 최대 급여를 받는 사원의 부서코드 , 이름 , 급여를 출력하는데 부서코드 순으로 오름차순 정렬하여 출력하는 예문 • 조인 , 인라인뷰로 구현select e1.ename, e1.sal, e1.deptno from emp e1, ( select deptno, max(sal) as msal from emp group by deptno ) e2 where e1.deptno = e2.deptno and e1.sal = e2.msal order by e1.deptno;

DEPTNO ENAME SAL---------- ---------- ---------- 10 KING 5000 20 SCOTT 3000 20 FORD 3000 30 BLAKE 2850

This practice makes the expert

Page 8: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 4

• 각 직무 (JOB) 별로 최대 급여를 받는 사원의 직무 , 이름 , 급여를 출력하는데 직무명순으로 오름차순 정렬하여 출력하는 예문select job, ename, sal from emp e1 where sal = (select max(sal) from emp e2 where e1.job = e2.job)order by deptno;

JOB ENAME SAL--------- ---------- ----------PRESIDENT KING 5000CLERK MILLER 1300MANAGER JONES 2975ANALYST SCOTT 3000………… This practice makes the expert

Page 9: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 5

• 자신이 속한 부서의 평균 급여보다 급여를 적게 받는 사원의 부서 , 사원명 , 급여를 출력하되 부서 순으로 오름차순 정렬하여 출력 select deptno, ename, sal from emp e1 where sal < (select avg(sal) from emp e2 where e1.deptno = e2.deptno)order by deptno;

DEPTNO ENAME SAL---------- ------------ ---------- 10 CLARK 2450 10 MILLER 1300 20 SMITH 800 20 ADAMS 1100…………

This practice makes the expert

Page 10: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 6

• EMP 테이블에서 급여가 높은 사원 5 명을 출력 하는 예문select ename, sal from emp e1 where 5 > (select count(*) from emp e2 where e2.sal > e1.sal) order by sal desc;

ENAME SAL---------- ----------KING 5000SCOTT 3000FORD 3000JONES 2975BLAKE 2850

This practice makes the expert

Page 11: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 7

• 각 부서별로 급여가 높은 사람 2 명씩 출력 하는 예문select deptno, ename, sal from emp e1where 2 > (select count(*) from emp e2 where e2.sal > e1.sal and e2.deptno = e1.deptno)order by deptno, sal desc;

DEPTNO ENAME SAL---------- ------------- ---------- 10 KING 5000 10 CLARK 2450 20 SCOTT 3000 20 FORD 3000 30 BLAKE 2850 30 ALLEN 1600

This practice makes the expert

Page 12: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

예문 - 8• 사원이 한명이라도 있는 부서명 출력SELECT dname FROM dept d WHERE EXISTS ( SELECT 1 FROM emp WHERE deptno = d.deptno);  DNAME-----------------------ACCOUNTINGRESEARCHSALES This practice makes the expert

Page 13: (오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)

This practice makes Expert!PL/SQL 단기속성 (1일완성 )SQL 힌트 / 튜닝 (단기 2일교육 )SQL기초과정