페이징 처리를 위해서 역순으로 게시물 목록을 조회하는 작업이 성공했다면,
이제는 전체가 아닌 필요한 만큼의 데이터를 가져오는 방식에 대해 학습한다.
오라클에는 페이지 처리를 위해 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 이라는 키워드가 없다. 그래서 변수 선언을 통해서 임의로 rownum 을 표시할 수 있다.
mysql에서 @는 변수를 의미한다. @ROWNUM
변수 선언 방법은 크게 where절에서 초기화, 혹은 set 키워드로 변수 선언 가능하다.
위에 아무조건 없이 각 데이터에 ROWNUM을 적용한 SELECT문과 같이 where절에 @ROWNUM을 초기화하도록 한다.
"SELECT @ROWNUM := @ROWNUM + 1 AS RN , t.* FROM tbl_board t WHERE (@ROWNUM:=0) = 0;"
"SET @ROWNUM :=0;
SELECT @ROWNUM := @ROWNUM+1 AS NO, t.* FROM tbl_board t;
"
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:=@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씩 증가시켜서 출력한다.