ROWNUM과 INLINE VIEW

ACAI BERRY DEVELOVER·2023년 3월 10일
0

ROWNUM

페이징 처리를 위해서 역순으로 게시물 목록을 조회하는 작업이 성공했다면,
이제는 전체가 아닌 필요한 만큼의 데이터를 가져오는 방식에 대해 학습한다.

오라클에는 페이지 처리를 위해 ROWNUM이라는 특별한 키워드를 사용해 데이터에 순번을 붙여 사용한다.

쉽게 말해 ROWNUM은 SQL이 실행된 결과에 넘버링을 해주는 것.

모든 SELECT문에는 ROWNUM이라는 변수를 이용해 해당 데이터가 몇 번째로 나오는지 알아낼 수 있다.

ROWNUM은 실제 데이터가 아닌 테이블에서 데이터를 추출 후 처리되는 변수로 상황에 따라 그 값은 매번 달라진다.

우선 아무 조건 없이 타겟 테이블에 접근하고 각 데이터에 ROWNUM을 적용하면 다음과 같다.

SELECT @ROWNUM := @ROWNUM + 1 AS RN , t.* FROM tbl_board t WHERE (@ROWNUM:=0) = 0;

SQL에 아무 조건이 없기 때문에 데이터는 테이블에 섞여 있는 상태 그대로 나온다.(테이블을 FULL SCAN한 것과 동일하다.)

(정렬되어 나오는 거 같긴한데...; 초보라 모르겠네..)

아래는 TIME/ ACTION/ RESPONSE/ DURATION/FETCH_TIME

21:00:16 SELECT @ROWNUM := @ROWNUM + 1 AS RN , t.* FROM tbl_board t WHERE (@ROWNUM:=0) = 0 LIMIT 0, 1000 1000 row(s) returned 0.0013 sec / 0.0015 sec

얼마 안걸린다. 생각보다 얼마 안걸린다.

MYSQL의 ROWNUM 변수선언 및 초기화

mysql 에는 rownum 이라는 키워드가 없다. 그래서 변수 선언을 통해서 임의로 rownum 을 표시할 수 있다.
mysql에서 @는 변수를 의미한다. @ROWNUM
변수 선언 방법은 크게 where절에서 초기화, 혹은 set 키워드로 변수 선언 가능하다.
위에 아무조건 없이 각 데이터에 ROWNUM을 적용한 SELECT문과 같이 where절에 @ROWNUM을 초기화하도록 한다.

  • WHERE절 초기화

"SELECT @ROWNUM := @ROWNUM + 1 AS RN , t.* FROM tbl_board t WHERE (@ROWNUM:=0) = 0;"

  • 혹은 SET을 이용한 초기화.

"SET @ROWNUM :=0;
SELECT @ROWNUM := @ROWNUM+1 AS NO, t.* FROM tbl_board t;
"

  • 아래의 SELECT문은 ROWNUM을 RN(alias)으로 내림차순으로 가져오는 문장이다.

    SELECT RN
    FROM (
    SELECT @ROWNUM := @ROWNUM + 1 AS RN
    FROM tbl_board A, (SELECT @ROWNUM:=0) RN_TB
    ) A
    ORDER BY RN DESC;

  • 아래의 SELECT문은 ROWNUM과 테이블 전체 컬럼을 bno 역순(내림차순)으로 20개를 가져온다.

    SELECT @ROWNUM:=@ROWNUM+1 AS ROWNUM
    , t.*
    FROM ( SELECT @ROWNUM := 0) R
    , tbl_board t
    where @ROWNUM <20 ORDER BY bno DESC ;

(둘은 from절에서 @ROWNUM을 초기화해주고 있음)
그리고 모든 SELECT 절에서 변수(@ROWNUM)를 1씩 증가시켜서 출력한다.

profile
쓸때 대충 쓰지 말고! 공부하면서 써!

0개의 댓글