본문 바로가기

MSSQL/SQL Server 2005 new Feature

향상된 top N 고찰


안녕하세요 박성원입니다.

쿠쿠 이번에 저와 함께 보실 과제는 바로바로바로~~ 'TOP N'구문입니다.

사실 DBA에게는 너무나도 필요한 구문이죠!!

이번에 조사하면서 느낀건데 말이죠!!
인간이 공기의 소중함을 모르듯이 DBA는 top나 limit의 소중함을 모르는듯합니다!!!

사실 거창하게 고찰이라고 할 것까지는 없고, 각 버전별 차이점과 단순히 예제를 통해서 정리 해 볼까합니다.
그럼 들어가보죵~~ ^-^


■ top N?
DML과 함께 사용되며 Query 결과집합에서 주어진 row의 N 수만큼 혹은 % 만큼의 결과를 반환한다.


■ 버전별 차이점?
A. 7.0에서는 조건에 해당되는 모든 데이터를 읽은 후 full sort방식으로 통해서 결과 집합을 추출했지만
    이후 버전부터는 N개의 데이터를 임시로 저장할 수 있는 버퍼를 메모리에 생성한 후 이 버퍼에
    저장된 가장 큰 값이나 작은 값만으로 비교대상으로 산정한다.
B. 2000에서는 select와 함께 쓰이며 N을 변수가 아닌 상수로 명시해야한다.
C. 2005에서는 DML과 함께 쓰이며 N을 변수(or Query)와 상수 모두 사용 가능하다.


■ 문법
[
	Top (expression) [PERCENT]
	[ WITH TIES]
]

■ 정의
    A. expression
        Top에 지정할 수 있는 변수 혹은 상수, 또는 표현식이 오며 ‘( )’를 통한 표기를 권장합니다.
    B. WITH TIES
        Order by와 함께 사용되며 지정된 expression 내에서 중복값이 있는 경우 중복값을 포함하여
        결과를 리턴합니다.


■ 예제
create table test_top (
	a int not null,
    b varchar(2) not null
);

insert into test_top values (0, 'a');
insert into test_top values (1, 'b');
insert into test_top values (2, 'c');
insert into test_top values (3, 'd');
insert into test_top values (4, 'e');
insert into test_top values (5, 'f');
insert into test_top values (6, 'g');
insert into test_top values (7, 'h');
insert into test_top values (8, 'h');

   


    A. 2000에서의 사용예 (동적쿼리를 이용)
Declare @num char(1)
declare @query_str varchar(200)
Set @num=4

set @query_str = 'select  top ' + @num + ' * from test_top

exec(@query_str)

    B. 2005에서의 사용예
        - 변수를 이용한 TOP
declare @num int

set @num = 4

select top(@num) * from test_top

        - 쿼리를 이용한 TOP
select top(
select count(b)
from test_top 
where b = 'h'
) * from test_top
order by b desc

        


         - DML을 이용한 TOP
              a. delete top(1) from test_top
              b. select top(1) * into test_copy from test_top
              c. insert into test_copy select top(1) * from test_top
              d. update top(1) test_top set b = 'i' where b='h'

         - WITH TIES
select top(1) with ties b from test_top order by b desc




        

'MSSQL > SQL Server 2005 new Feature' 카테고리의 다른 글

데이터베이스의 분리 및 이동, 연결  (0) 2009.12.07
Sql Server CLR Integration  (0) 2009.12.01
Cascading Referential Integrity Constraint  (0) 2009.11.26
사용자와 스키마 분리  (3) 2009.11.25
TRIGGER 고찰  (0) 2009.11.19