많은 데이터들 가운데 특정 개수의 데이터만 출력하고 싶을 때 어떻게 하면 될까?
아래방법을 사용하면된다
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 |
위와 같은 결과가 출력이 됩니다
유용하게 사용하시기 바랍니다~^^