SQL 특정 개수의 값 출력 - SELECT TOP N / TOP % / LIMIT / ROWNUM

많은 데이터들 가운데 특정 개수의 데이터만 출력하고 싶을 때 어떻게 하면 될까?

아래방법을 사용하면된다

MSSQL - SELECT TOP

MYSQL - LIMIT절

ORACLE - ROWNUM

MSSQL - SELECT TOP

SELECT 바로 뒤에 TOP 숫자 (표시할 개수) 또는 TOP 숫자% (표시할 개수의 비율)을 적으면 된다

ID NAME SALARY
1 철수 300
2 영희 350
3 훈이 200
4 정우 400
5 민우 370
6 현우 220

 

이 테이블에서 SALARY가 높은 3명을 출력하면

SELECT TOP 3 *
  FROM TABLE
 ORDER BY SALARY DESC

-  SALARY를 기준으로 내림차순 정렬한 곳에서 3개의 ROW만 출력이 된다

ID NAME SALARY
4 정우 400
5 민우 370
2 영희 350

 

SELECT TOP 50 PERCENT *
  FROM TABLE
 ORDER BY SALARY DESC

-  SALARY를 기준으로 내림차순 정렬한 곳에서 전체 기준 50%의 ROW만 출력이 된다

-  총 6개 중 50%인 3개가 출력되어 위의 결과와 같은 결과가 출력된다

 

++특정 조건을 기준으로 상위 N퍼센트를 구할 때 조건이 같은 개체가 있을 수 있다

++예를 들어 10명 중 연봉 상위 30%를 출력하는데 연봉이 같은 사람이 있는 경우다

-  이런 경우 에는 TOP 숫자% WITH TIES 구문을 사용한다

-  연봉 1등(4000) 1명, 2등(3000) 1명, 3등(2000) 4명일 때 WITH TIES 구문을 추가하면 공동 3등 전부 출력이 됩니다


MYSQL - LIMIT

다음은 MYSQL에서 사용하는 LIMIT입니다

SELECT문 끝에 LIMIT 시작할 지점 , 표시할 개수를 통해 특정 개수의 데이터를 출력합니다

-  숫자 하나만 입력할 경우는 시작할 지점은 자동으로 0 이 되고 [ 0부터 시작 ] 입력받은 숫자는 표시할 개수가 됩니다

SELECT *
  FROM TABLE
 ORDER BY SALARY DESC
 LIMIT 3 --(LIMIT 0,3 과 똑같습니다)

-  SALARY를 기준으로 내림차순 정렬한 곳에서 첫 번째 ROW부터 3개의 ROW만 출력한다

-  아래의 결과가 출력이 됩니다.

ID NAME SALARY
4 정우 400
5 민우 370
2 영희 350

 

SELECT *
  FROM TABLE
 ORDER BY SALARY DESC
 LIMIT 2,2 --(0부터 시작임으로 2는 세번째 ROW)

-  SALARY를 기준으로 내림차순 정렬한 곳에서 세번째 ROW부터 2개의 ROW만 출력한다

ID NAME SALARY
2 영희 350
1 철수 300

ORACLE - ROWNUM

마지막으로 ORACLE에 ROWNUM을 살펴보자

ROWNUM은 조회된 결과에 순서대로 순번을 붙여준다

SELECT ROWNUM, *
  FROM TABLE
ROWNUM ID NAME SALARY
1 1 철수 300
2 2 영희 350
3 3 훈이 200
4 4 정우 400
5 5 민우 370
6 6 현우 220

이 출력된 ROWNUM을 이용해서 특정 개수의 ROW를 출력할 수 있다

 

위에서 2개만 출력을 한다고 하면

SELECT ROWNUM, *
  FROM TABLE
 WHERE ROWNUM <= 2
ROWNUM ID NAME SALARY
1 1 철수 300
2 2 영희 350

이런식으로 어렵지 않아 쉽게 사용할 수 있는데

주의할 점이 하나 있습니다 순위를 매겨서 2등까지 추출하는 형식을 보면

SELECT ROWNUM, *
  FROM TABLE
 WHERE ROWNUM <= 2
 ORDER BY DESC

이렇게 할 경우 여전히 위의 테이블과 같은 결과입니다

ROWNUM ID NAME SALARY
1 1 철수 300
2 2 영희 350

왜냐하면 정렬이 되기 전에 ROWNUM이 붙었기 때문에 SALARY가 높은 순으로 ROWNUM이 1, 2, 3... 붙은 게 아니라

원래 정렬되어있던 대로 ROWNUM이 붙고 그 뒤에 SALARY순으로 정렬이 된 거죠

 

이런 경우는 서브 쿼리를 사용하거나

++ ROW_NUMBER구문을 사용하면 되는데 이 구문은 이 포스팅에서는 다루지 않으니 검색을 추천드립니다

 

서브 쿼리를 사용하는 경우를 보겠습니다

SELECT ROWNUM, *
  FROM (
        SELECT *
          FROM TABLE
         ORDER BY SALARY DESC
       )
 WHERE ROWNUM <= 3

-  SALARY를 기준으로 내림차순 한 테이블에다 ROWNUM을 붙이고 3등까지 출력하는 내용입니다

ROWNUM ID NAME SALARY
1 4 정우 400
2 5 민우 370
3 2 영희 350

위와 같은 결과가 출력이 됩니다

 

유용하게 사용하시기 바랍니다~^^