티스토리 뷰

DBMS에서 많이 쓰이는 oracle과 mysql에는 기본적으로 비슷하지만 다른 부분이 있다.

그중에서 mysql에서 사용되는 limit이 oracle에서는 rownum으로 비슷하게 쿼리를 다룰 수 있게 한다.

limit, rownum의 사용법은 반환하는 쿼리의 수를 제한해서 볼 수 있게 하는 것이다. top-n을 확인하는 쿼리에 많이 쓰이게 된다!

 

MySQL limit

mysql limit은 0-based 인덱스를 사용하므로 limit 5,10을 하면 6번째행부터 읽어오게 된다.

 //결과테이블에서 5개행을 읽어온다
 SELECT * FROM [TABLE NAME] LIMIT 5;  
 
 //결과테이블에서 6번째부터 10개행을 읽어온다
 SELECT * FROM [TABLE NAME] LIMIT 5, 10;  

Oracle rownum

oracle rownum은 1-based 인덱스를 사용한다. rownum은 oracle에서 내부적으로 각행에 대해 1씩 증가하면서 부여된다.

//테이블에서 rownum1~5까지 총 5행을 읽어온다
SELECT * FROM [TABLE_NAME] WHERE ROWNUM <=5;

※여기서 주의할 점

rownum의 경우 결과 테이블이 생성된 후에 부여되는 것이므로 위의 코드처럼 처 음행부터 읽어오는 즉 1번부터 읽어오는 것은 가능하지만 WHERE ROWNUM BETWEEN 6 AND 10  이런 식으로는 읽어올 수 없다. 또한 ORDER BY [칼럼명]으로 했을 경우 rownum이 이미 부여된 상태로에서 뽑아오므로 원하는 결과를 읽어올 수 없다.

 

중간 순서의 행부터 읽어오고 싶고 ORDER BY가 적용된 결과를 얻으려면 아래 코드처럼 작성해야 한다.

 

 

//inline view를 통해 같은레벨이 아닌 
//한단계 전 레벨의 결과의 정렬된 테이블에서 rownum을 이용함 
SELECT *
FROM(SELECT 컬럼명1,컬럼명2
        FROM [테이블명]
        ORDER BY 2) T
WHERE ROWNUM <=10;  

//한단계 전 레벨에서 생성된 rownum을 이용해 중간순서부터 읽어옴 6~10번째 행
SELECT T.*
FROM(SELECT rownum "count",컬럼명1,컬럼명2
        FROM [테이블명]
        ORDER BY 2) T
WHERE count BETWEEN 6 AND 10 ; 

//order by, 중간 순서부터 읽기 6~10번째 행
SELECT ROWNUM "3rd", T.*
FROM(
        SELECT ROWNUM "2nd",T.*
                FROM (
                        SELECT ROWNUM "1st",컬럼명1 , 컬럼명2
                        FROM [테이블명]
                        ORDEY BY 컬럼명2 DESC
                )T
    )T
WHERE "2nd" BETWEEN 6 AND 10;

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함