요약 |
ROWNUM정의 행마다 수를 붙여 뽑아 정렬하는 것. |
사용처 정보에서 주어진 조건에 따라 몇명 혹은 특정 갯수만 물어볼 수 있도록 하는 기능. |
INLINE-VIEW FROM절과 SUBQUERY문의 결합(VIEW와 연관). |
ROWNUM의 성질 조건을 만족하지 않으면 바로 중단하게 된다. |
|
ROWNUM이란? |
rownum은 첫번째로 뽑은 row , 두번째로 뽑은 row...를 말한다. row를 numbering. |
---------------------------------------------------------------------------------------------------------------------------------- |
ROWNUM을 사용하는 경우? |
|
급여를 많이 받는 순으로 3명만 출력하고 싶다면? |
|
이럴때 ROWNUM을 써준다. |
|
ROWNUM의 개념 PSEUDO COLUMN |
|
EX) |
서울A>select rownum,rowid,empno <-rownum,rowid를 pseudo column 가짜열이라고 한다. |
2 from emp; |
|
ROWNUM ROWID EMPNO |
--------- ------------------ ---------- |
1 AAAR3sAAEAAAACXAAA 7369 |
2 AAAR3sAAEAAAACXAAB 7499 |
3 AAAR3sAAEAAAACXAAC 7521 |
4 AAAR3sAAEAAAACXAAD 7566 |
5 AAAR3sAAEAAAACXAAE 7654 |
6 AAAR3sAAEAAAACXAAF 7698 |
7 AAAR3sAAEAAAACXAAG 7782 |
8 AAAR3sAAEAAAACXAAH 7788 |
9 AAAR3sAAEAAAACXAAI 7839 |
10 AAAR3sAAEAAAACXAAJ 7844 |
11 AAAR3sAAEAAAACXAAK 7876 |
|
ROWNUM ROWID EMPNO |
--------- ------------------ ---------- |
12 AAAR3sAAEAAAACXAAL 7900 |
13 AAAR3sAAEAAAACXAAM 7902 |
14 AAAR3sAAEAAAACXAAN 7934 |
|
서울A>select rownum,rowid,deptno <- rownum은 첫번째로 뽑은 row , 두번째로 뽑은 row...를 말한다. row를 numbering함. |
2 from dept <- rowid 는 row의 고유한 주소를 일컫는다. |
3 ; |
|
ROWNUM ROWID DEPTNO |
---------- ------------------ ---------- |
1 AAAR3qAAEAAAACEAAA 1 |
2 AAAR3qAAEAAAACHAAA 10 |
3 AAAR3qAAEAAAACHAAB 20 |
4 AAAR3qAAEAAAACHAAC 30 |
5 AAAR3qAAEAA |
|
|
이제 ROWNUM을 뽑아보면 |
|
EX) |
서울A>select rownum,empno,ename,sal |
2 from emp |
3 order by sal desc; |
|
ROWNUM EMPNO ENAME SAL |
--------- ---------- ---------- ---------- <-rownum이 정렬이 안되어있다. (ROWNUM먼저 작용을함 )뽑은 다음에 정렬하기 때문. |
9 7839 KING 5000 |
13 7902 FORD 3000 |
8 7788 SCOTT 3000 |
4 7566 JONES 2975 |
6 7698 BLAKE 2850 |
7 7782 CLARK 2450 |
2 7499 ALLEN 1600 |
10 7844 TURNER 1500 |
14 7934 MILLER 1300 |
3 7521 WARD 1250 |
5 7654 MARTIN 1250 |
|
ROWNUM EMPNO ENAME SAL |
--------- ---------- ---------- ---------- |
11 7876 ADAMS 1100 |
12 7900 JAMES 950 |
1 7369 SMITH 800 |
|
|
그래서 먼저 정렬을 한후에 뽑도록 하기위해 SUBQUERY를 이용해야 한다. VIEW를 만들어보면 |
|
서울A>create view topn <-TOPN이 가진 내용 |
2 as |
3 select empno,ename,sal |
4 from emp |
5 order by sal desc; |
|
|
서울A>select rownum,empno,ename,sal <-view에서는 rownum이 순서대로 나온다. 뽑고나서 정렬한후 번호를 붙인다. |
2 from topn; |
|
ROWNUM EMPNO ENAME SAL |
---------- ---------- ---------- ---------- |
1 7839 KING 5000 |
2 7902 FORD 3000 |
3 7788 SCOTT 3000 |
4 7566 JONES 2975 |
5 7698 BLAKE 2850 |
6 7782 CLARK 2450 |
7 7499 ALLEN 1600 |
8 7844 TURNER 1500 |
9 7934 MILLER 1300 |
10 7521 WARD 1250 |
11 7654 MARTIN 1250 |
|
ROWNUM EMPNO ENAME SAL |
---------- ---------- ---------- ---------- |
12 7876 ADAMS 1100 |
13 7900 JAMES 950 |
14 7369 SMITH 800 |
|
최종적으로 |
서울A>select rownum,empno,ename,sal <-응용하면 답이나온다. |
2 from topn |
3 where rownum <=3; |
|
ROWNUM EMPNO ENAME SAL |
---------- ---------- ---------- ---------- |
1 7839 KING 5000 |
2 7788 SCOTT 3000 |
3 7902 FORD 3000 |
|
|
*INLINE-VIEW |
이름을 붙여서 일일이 만드는 것은 외우기 어려우니 |
SUBQUERY문장을 FROM절과 결합해도 같은 기능을 하게 된다. |
서울A>select empno,ename,sal <-상위 몇명 하위 몇명 뽑을때 사용하는 걸 TOP-N 분석이라고 한다. <-ORACLE에서만. MYSQL같은경우엔 LIMIT QUERY라고 따로 있다. |
2 from(select empno,ename,sal <-view의 이름을 하나하나 붙이면 기억하기도 어려우니 |
3 from emp |
4 order by sal desc) from절에 사용되는 subquery는 마치 view처럼 작용해 inline-view라고 한다. |
5 where rownum <=3; |
밖에 있는 ROWNUM이라 정렬된다. |
EMPNO ENAME SAL |
--------- ---------- ---------- |
7839 KING 5000 |
7788 SCOTT 3000 |
7902 FORD 3000 |
|
|
rownum이 밖에 있다 : 표가 sal순으로 정렬되어 나옴 -> rownum이 주어진 표에 위에서부터 표를 매김 -> 값이 정렬되어 나옴 . |
rownum이 안에 있다 : 표를 만들기 위해 기존 테이블에서 가져올때 rownum이 번호를 붙임 -> sal 순으로 정렬 -> 값이 뒤죽박죽 나옴. |
|
|
------------------------------------------------------------------------------------------------------------------------------------- |
ROWNUM의 성질 |
조건을 만족할때까지 하고 만족 하지 않으면 스스로 중단하는 기능이 내제 되어 있다. |
|
EX) |
|
SELECT ROWNUM,EMPNO,ENAME,SAL |
FROM TOPN |
WHERE ROWNUM=3 <-조건이 안맞으면 멈춘다. 3이 아니면 아예 멈춰버림. |
그래서 항상 무엇보다 작거나 같다라는 형식밖에 안된다. |
왜냐하면 >이 되면 시작할때 1과 마주치는데 조건이 안맞아서 바로 멈춰버린다.! |
|
ORDER BY SAL ASC 또는 DESC등으로 조절해서 원하는 값을 찾아라 . |