ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ROWNUM
    Oracle-diary/DB의 중요성질 2020. 1. 29. 19:00
    요약
    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등으로 조절해서 원하는 값을 찾아라 .

    'Oracle-diary > DB의 중요성질' 카테고리의 다른 글

    SQL과 ascii코드  (0) 2020.01.29
    SQL과 SQLPLUS 명령어 비교  (0) 2020.01.29
    NULL특징  (0) 2020.01.29
    LOB  (0) 2020.01.29
    DB의 중요한 성질  (0) 2020.01.29

    댓글

Designed by Tistory.