티스토리 뷰

쿼리 중, 특정조건에 따라 원하는 갯수 만큼 만 데이터를 가져오고 싶은 경우가 있다. Oracle의 경우 rownum 을 이용하여, 원하는 갯수 만큼 데이터를 가져올 수 있다. SQL Server의 경우, TOP을 이용하여 이러한 것이 가능하다. TOP의 사용방법은 아래와 같다.

SELECT TOP([갯수]) *
FROM [테이블명]
WHERE  [조건]
ORDER BY  [정렬조건]

유사한 기능으로, ROW_NUMBER()를 이용하여 Oracle의 rownum과 유사하게 사용을 하는 것도 가능하다. 사용법은 아래와 같다.

SELECT ROW_NUMBER() OVER (ORDER BY [정렬기준컬럼] [정렬기준]) [명명할 컬럼명], *
FROM [테이블명]


* 예제를 통하여 알아보기


1. 먼저 테스트를 위해 테이블을 생성하자. 축구선수 데이터를 입력하는 테이블을 만들었다. Primary Key 는 NUMBER(선수의 등번호)로 하였다. 인덱스는 NUMBER(선수의 등번호) 로, 오름차순으로 하였다.

-- 테이블 생성
CREATE TABLE FOOTBALL_PLAYER
(
    NAME          NVARCHAR(32),
    POSITION    NCHAR(2),
    NUMBER      NCHAR(2)    NOT NULL
    CONSTRAINT [PK_FOOTBALL_PLAYER] PRIMARY KEY CLUSTERED ([NUMBER] ASC)
) ON [PRIMARY]


-- 데이터 입력
INSERT INTO FOOTBALL_PLAYER (NAME, POSITION, NUMBER)
VALUES ('이동국', 'FW', '20');

INSERT INTO FOOTBALL_PLAYER (NAME, POSITION, NUMBER)
VALUES ('김상식', 'MF', '04');

INSERT INTO FOOTBALL_PLAYER (NAME, POSITION, NUMBER)
VALUES ('서정진', 'MF', '26');

INSERT INTO FOOTBALL_PLAYER (NAME, POSITION, NUMBER)
VALUES ('조성환', 'DF', '16');

INSERT INTO FOOTBALL_PLAYER (NAME, POSITION, NUMBER)
VALUES ('최철순', 'DF', '25');


2. 일단 전체 데이터를 조회하여 보자. 총 5건의 데이터가 선수의 등번호가 오름차순으로 정렬되어 데이터가 출력된다.

-- 전체 데이터 조회 쿼리
SELECT *
FROM FOOTBALL_PLAYER;

-- 조회결과



3. 내림차순으로 정렬한 후, TOP() 을 이용하여 상위 3개의 레코드를 뽑아 보자.

-- 내림차순으로 정렬 후, TOP()을 이용하여 상위 3개의 레코드를 뽑는 쿼리
SELECT TOP(3)
FROM FOOTBALL_PLAYER
ORDER BY NUMBER DESC;

-- 조회결과



4. 3번과 동일한 레코드를 뽑는 것을, ROW_NUMBER()를 이용하여 뽑아보자.

-- 내림차순으로 정렬 후, ROW_NUMBER()를 이용하여 상위 3개의 레코드를 뽑는 쿼리
SELECT *
FROM
( SELECT ROW_NUMBER() OVER (ORDER BY NUMBER DESC) rownum, *
  FROM FOOTBALL_PLAYER ) t
WHERE t.rownum <= 3;

-- 조회결과




5. 내림차순으로 정렬한 후, 이번에는 TOP() 을 이용하여 2~4번째 위치한 데이터를 뽑아보자. 아래와 같은 방법을 이용하면 된다. TOP을 이용하여 바깥 쪽의 쿼리문에 TOP()을 이용하여 몇개의 데이터를 뽑을지 지정하고, WHERE 절의 내부 쿼리에, TOP()을 이용하여, 몇번째를 제외할지 지정하면 된다. 즉, 2~4번째 데이터를 뽑기 위해서는 데이터 중, 내부쿼리에서 1번째를 제외하고, 외부에서 뽑을 갯수인 3개를 지정하면 된다.

-- 내림차순으로 정렬 후, TOP()을 이용하여 2~4번째의 레코드를 뽑는 쿼리
SELECT TOP(3)
FROM FOOTBALL_PLAYER
WHERE NUMBER NOT IN (SELECT TOP(1) FROM FOOTBALL_PLAYER ORDER BY NUMBER DESC)
ORDER BY NUMBER DESC;

-- 조회결과




6. 5번과 동일한 레코드를 뽑는 것을, ROW_NUMBER()를 이용하여 뽑아보자. 4번에서 했던 쿼리에서 간단하게 WHERE 절만 수정하면 범위의 데이터를 뽑는 것이 가능하다. WHERE 절에 BETWEEN을 이용하여 범위를 지정해 주면 된다.

-- 내림차순으로 정렬 후, ROW_NUMBER()를 이용하여 2~4번째의 레코드를 뽑는 쿼리
SELECT *
FROM
( SELECT ROW_NUMBER() OVER (ORDER BY NUMBER DESC) rownum, *
  FROM FOOTBALL_PLAYER ) t
WHERE t.rownum BETWEEN 2 AND 4;

-- 조회결과

최근에 올라온 글
최근에 달린 댓글
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
글 보관함