가정


id(아이디),password(비밀번호),idx(고유번호) 세개의 field를 갖는 test라는 테이블이 있고 이 안에는 72개의 데이터가 insert 되어 있다고 가정한다.


 


limit


mysql에서 지원하는 limit은 두개의 인자를 갖는다.





select * from test order by idx desc limit 5,10

위에서 보면 앞에 인자는 위치정보이면 뒤에 인자는 select에 의해 불러오는 데이터의 수량이다. 따라서 위의 쿼리문을 해석하면 test 테이블을 idx로 내림차순 정렬을 한 것을 6번째부터 15번째까지 10개의 데이터만을 불러오라는 내용이다.


 


다음의 쿼리문을 보자





select * from test order by idx desc limit 10

위의 내용은 다음과 같은 결과값을 갖는다.





select * from test order by idx desc limit 0, 10

즉 앞의 인자가 0일때는 생략이 가능하다는 것이다.


 


rownum


oracle에서 전체 테이블에서 특정 부분만을 가져올때는 rownum을 사용할 수 있다.


rownum은 가져오는 데이터의 수량으로 인식하면 된다.





select * from test where rownum<=5 order by idx desc

위의 쿼리문에 대한 해석은 test 테이블을 idx로 내림차순 정렬하여 첫번째부터 5번째까지 5개의 데이터만 불러오라는 내용이다.


 


여기서는 rownum이 단순히 수량만을 나타내는 것처럼 보이지만 실제는 위치정보도 포함할 수 있다.


 


다음을 보도록 하자.





select id,password, rownum from test where rownum<=5 order by idx desc

 



























id password idx
aaaa 0000 1
bbbb 1111 2
cccc 2222 3
dddd 3333 4
eeee 4444 5

 


위에서 처럼 rownum은 데이터 필드안에 삽입이 되서 보여 줄 수 있으며 이것을 통해 정렬도 가능하다.





1. select id, password, rownum as rnum from test where rownum<=5
order by rnum desc

 

2, select * from (select id, password, rownum as rnum from test where rownum<=5)
order by rnum desc

 



























id password idx
eeee 4444 5
dddd 3333 4
cccc 2222 3
bbbb 1111 2
aaaa 0000 1

 


위의 두개의 쿼리문은 동일한 결과값을 갖는다. 하지만 둘의 차이점은 첫번째 쿼리문은 order by를 rnum에게 할당함으로써 정렬하는 방법을 빼앗겼지만 두번째 쿼리문은 서브쿼리내에 정렬을 할 수가 있어 원하는 데이터를 가져오는데 훨씬 수월하다. 그렇다면 첫번째 방법으로는 완전히 불가능 한걸까? 아니다.


오라클에서 지원하는 힌트를 사용하면 가능하다.


먼저 인덱스를 생성한다.


 





create index test_indx on test(idx);

 


그리고 힌트를 사용하여 쿼리문을 만든다.


 





select /*+ index_desc(test test_indx) */ id, password, rownum as rnum from test
where rownum<=5 order by rnum desc

 


이렇게 하면 order by 부분은 hint에서 처리할 수 있다.


결론적으로 oracle의 rownum은 불러오는 데이터의 수량을 결정할 수 있으며 데이터의 안에서 글번호와 같은 위치에 대한 정보를 담아서 처리하는 기능을 지원해준다는 것이다.


 


top


mssql에서 지원하는 top은 위의 두개와 비교했을 때 정말 원초적인 기능이다. 단순히 불러오는 데이터의 수량만을 결정하는 것이기 때문이다.


top은 위치정보로 사용할 수도 없으며 이를 보완하고 도와줄 다른 어떤 기능도 없다. 계층형 게시판에서 원하는 데이터를 축출한다는 것은 아마도 가장 험난한 길을 인도하는 기능이다.


 





select top 5 * from test order by idx desc

 


top을 통해 원하는 부분만 가져올려면 여러번의 subquery를 작성해서 가져 와야 한다.

Posted by 아름프로
BLOG main image

카테고리

분류 전체보기 (539)
이야기방 (19)
토론/정보/사설 (16)
IBM Rational (9)
U-IT (0)
SOA/WS/ebXML (110)
개발방법론/모델링 (122)
J2SE (34)
J2EE (60)
DataBase (39)
Open Projects (30)
BP/표준화 (50)
Apache Projects (15)
Web/보안/OS (22)
Tools (7)
AJAX/WEB2.0 (1)
Linux/Unix (1)
영어 (0)
비공개방 (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

글 보관함

Total :
Today : Yesterday :