순위 매기기
EMP 테이블에서 급여 상위 1위~5위까지 데이터를 추출해보자. 아래와 같이 여러 방법으로 데이터를 추출할 수 있다. 급여순위로 내림차순 정렬이 필요할 것이고 앞에서 배운 rownum을 적절히 이용하면 된다.
SQL> select e.* from (select substr(ename,1, 20) ename, sal, deptno, rank() over (order by sal desc) "순위" 6 from emp) e 7 where rownum <= 5 ;
ENAME SAL DEPTNO 순위 -------------------- ---------- ---------- ---------- KING 5000 10 1 FORD 3000 20 2 SCOTT 3000 20 2 JONES 2975 20 4 BLAKE 2850 30 5
SQL> select rownum, e.* from ( select ename, sal from emp a where 5 > (select count(*) from emp b where b.sal > a.sal) order by sal desc ) e ;
ROWNUM ENAME SAL ---------- ---------- ---------- 1 KING 5000 2 SCOTT 3000 3 FORD 3000 4 JONES 2975 5 BLAKE 2850
SQL> SELECT rownum, ename ,sal FROM ( SELECT ename ,sal , row_number () over (ORDER BY sal DESC) rn FROM emp ) WHERE rn <= 5;
ROWNUM ENAME SAL ---------- ---------- ---------- 1 KING 5000 2 SCOTT 3000 3 FORD 3000 4 JONES 2975 5 BLAKE 2850
SQL> SELECT rownum, ename ,sal FROM ( SELECT ename ,sal FROM emp ORDER BY sal DESC) e WHERE rownum <= 5 ;
ROWNUM ENAME SAL ---------- ---------- ---------- 1 KING 5000 2 SCOTT 3000 3 FORD 3000 4 JONES 2975 5 BLAKE 2850
-- 이번에는 인덱스와 오라클 힌트구문을 이용해 보자. index_desc힌트는 인덱스 영역에서 인덱스 역순 스캔하라는 의미의 힌트다. SQL> create index idx_emp_sal on emp(sal); SQL> SELECT rownum, ename ,sal FROM ( SELECT /*+ index_desc(emp idx_emp_sal) */ ename ,sal FROM emp WHERE sal > 0) WHERE rownum <= 5;
ROWNUM ENAME SAL ---------- ---------- ---------- 1 KING 5000 2 FORD 3000 3 SCOTT 3000 4 JONES 2975 5 BLAKE 2850
위 방법 중 가장 현명한 방법은 무엇인지 고민해 보고 실습 테이블을 MYEMP1으로 바꾸어서 실습해보라. |
INLINE(잠시만요) VIEW : VIEW중에서 SQL명령어 라인 안에서 기술되는 VIEW로써 WHERE절의 서브쿼리 또는 FROM절 다음에 테이블처럼 사용하기 위해 사용된다. 간단한 예로 SELECT절의 FROM다음에 테이블이 오는데, 이곳에 또 다른 SELECT문을 기술하여 이를 인라인뷰(IN_LINE VIEW)하고 한다. 주로 조인 연산을 줄이기 위해 또는 분리된 쿼리를 하나의 쿼리에 모아서 사용하기 위해 사용한다. |
댓글 없음:
댓글 쓰기