티스토리 뷰

ROWNUM, LIMIT, CLICK COUNTER  


ROWNUM  

ROWNUM은 MySQL의 LIMIT 연산자와 같이 질의 결과로 생성될 각 레코드에 대한 순서를 나타내는 번호를 반환한다. 첫 번째 결과 레코드는 1, 두 번째 결과 레코드는 2를 가진다.

일반적으로 ROWNUM은 SELECT문의 WHERE절에 사용되며, ORDER BY 절을 포함한 SELECT문에서는 ORDERBY_NUM(), GROUP BY 절을 포함한 SELECT문에서는 GROUPBY_NUM()을 사용한다.


일반적인 ROWNUM
ROWNUM은 보통 세 가지의 방법으로 해당 ROW 개수를 제한한다.

    1. ROWNUM <= 10, ROWNUM은 1부터 시작되므로 1부터 10까지의 출력 번호를 가진 레코드를 출력한다.
    2. ROWNUM <= 10 AND ROWNUM > 5
    3. ROWNUM BETWEEN 5 AND 10, 2번과 3번은 동일하다. 출력 번호를 1부터가 아니라 사용자의 마음대로 정할 수 있다.

문제
participant 테이블을 조회하되 결과물이 10개만 출력되게 하라.

SQL문 1
SELECT * FROM participant
WHERE ROWNUM <= 10;


결과 1
no
host_year
nation_code
gold
silver
bronze
1
2004
ZAM
0
0
0
2
2004
YEM
0
0
0
3
2004
ISV
0
0
0
4
2004
VIE
0
0
0
5
2004
VAN
0
0
0
6
2004
URU
0
0
0
7
2004
UGA
0
0
0
8
2004
TKM
0
0
0
9
2004
TUN
0
0
0
10
2004
TGA
0
0
0

설명
위의 SQL문은 정상적으로 실행이 되었다. 하지만 만약에 GOLD 개수가 많은 순서대로 10개의 레코드만 출력하는 쿼리 문을 작성한다면 결과 2와 같이 예상했던 결과 값과 다른 값이 출력되는 것을 알 수 있을 것이다. #

SQL문 2
SELECT * FROM participant
WHERE ROWNUM <= 10 ORDER BY gold DESC;


결과 2
NO
host_year
nation_code
gold
silver
bronze
1
2004
ZAM
0
0
0
2
2004
YEM
0
0
0
3
2004
ISV
0
0
0
4
2004
VIE
0
0
0
5
2004
VAN
0
0
0
6
2004
URU
0
0
0
7
2004
UGA
0
0
0
8
2004
TKM
0
0
0
9
2004
TUN
0
0
0
10
2004
TGA
0
0
0

설명
예상과는 달리 출력된 레코드들의 모든 gold 개수가 모두 0이다. 이렇게 출력된 이후는 레코드들을 ORDER BY를 하기 전에 ROWNUM 연산자가 실행되어 먼저 10개의 레코드가 수집된 후에 ORDER BY가 적용된다.


ORDERBY_NUM() – 정렬 후 ROWNUM 적용
ORDER BY 컬럼 명 ASC | DESC
FOR ORDERBY_NUM() 조건 문


문제
ORDER BY NUM() 를 사용하여 gold 개수가 많은 순서대로 10개의 레코드를 출력하라.

SQL문 3
SELECT * FROM participant
ORDER BY gold DESC FOR ORDERBY_NUM() <= 10;


결과 3
NO
host_year
nation_code
gold
silver
bronze
1
1988
URS
55
31
46
2
1992
EUN
45
38
29
3
1996
USA
44
32
25
4
2000
USA
37
24
31
5
1992
USA
37
34
37
6
1988
GDR
37
35
30
7
1988
USA
36
31
27
8
2004
USA
36
39
27
9
1992
GER
33
21
28
10
2004
CHN
32
17
14

설명
ORDERBY_NUM()을 사용하지 않고 정렬을 하여 ROWNUM을 적용시키고자 하면 [결과 2]처럼 ROWNUM이 적용되기 전에 ORDER BY가 먼저 실행이 되어 예상했던 결과 값과 다르게 출력이 된다.

문제
국가들의 gold 개수 평균을 구하고 ORDERBY_NUM()을 사용하여 gold 평균 개수가 많은 국가 1위부터 10위까지를 출력하라.

SQL문 4
SELECT nation_code, AVG(gold) AS avg_gold 
FROM participant 
GROUP BY nation_code 
ORDER BY avg_gold  DESC FOR ORDERBY_NUM() <= 10;


결과 4
NO
nation_code
avg_gold
1
URS
55
2
EUN
45
3
USA
38
4
GDR
37
5
RUS
28
6
CHN
19
7
GER
19
8
FRG
11
9
AUS
10
10
CUB
10


GROUPBY_NUM() – 그룹 연산 후 ROWNUM 적용
GROUP BY 컬럼 명
HAVING GROUPBY_NUM() 조건 문


문제
GROUP BY NUM() 를 사용하여 국가들의 gold 평균을 구하여 100번 째부터 110번 째 국가와 gold 개수를 출력하라.

SQL문 5
SELECT nation_code, AVG(gold) AS avg_gold 
FROM participant 
GROUP BY nation_code HAVING GROUPBY_NUM() BETWEEN 100 AND 110;


결과 5
NO
nation_code
avg_gold
1
ITA
9
2
IVB
0
3
JAM
0
4
JOR
0
5
JPN
6
6
KAZ
2
7
KEN
2
8
KGZ
0
9
KIR
0
10
KOR
9
11
KSA
0


 

LIMIT  

LIMIT 절은 출력되는 레코드의 개수를 제한할 때 사용한다. 결과 셋의 특정 행부터 마지막 행까지 출력하기 위해 row_count에 매우 큰 정수를 지정할 수 있다. LIMIT 절은 prepared statement으로 사용할 수 있으며, 인자 대신에 바인드 파라미터(?)를 사용할 수 있다.
LIMIT 절을 포함하는 질의에서는 WHERE 절에 INST_NUM(), ROWNUM을 포함할 수 없으며, FOR ORDERBY_NUM(), HAVING GROUPBY_NUM()과 함께 사용할 수 없다.

LIMIT
LIMIT [offset,] row_count


문제
participant 테이블을 조회하되 결과물이 10개만 출력되게 하라.

SQL문 5
SELECT * FROM participant
LIMIT 10;



결과 6


 

no<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o />

host_year

nation_code

gold

silver

bronze

1

2004

ZAM

0

0

0

2

2004

YEM

0

0

0

3

2004

ISV

0

0

0

4

2004

VIE

0

0

0

5

2004

VAN

0

0

0

6

2004

URU

0

0

0

7

2004

UGA

0

0

0

8

2004

TKM

0

0

0

9

2004

TUN

0

0

0

10

2004

TGA

0

0

0

 

설명
위의 SQL문은 정상적으로 실행이 되었다. 하지만 만약에 GOLD 개수가 많은 순서대로 10개의 레코드만 출력하는 쿼리 문을 작성한다면 아래와 같이 작성하면 된다.


 

SQL 7

SELECT * FROM participant

ORDER BY gold DESC

LIMIT 10;



결과 7

NO

host_year

nation_code

gold

silver

bronze

1

1988

URS

55

31

46

2

1992

EUN

45

38

29

3

1996

USA

44

32

25

4

2000

USA

37

24

31

5

1992

USA

37

34

37

6

1988

GDR

37

35

30

7

1988

USA

36

31

27

8

2004

USA

36

39

27

9

1992

GER

33

21

28

10

2004

CHN

32

17

14


문제
LIMIT 를 사용하여 gold 개수가 많은 데이터를 구하여 5번 째부터 15번 째까지의10 개의 레코드를 출력하라.

SQL8

SELECT * FROM participant

ORDER BY gold DESC

LIMIT 5,10;



결과 8

NO

host_year

nation_code

gold

silver

bronze

1

1988

GDR

37

35

30

2

1988

USA

36

31

27

3

2004

USA

36

39

27

4

1992

GER

33

21

28

5

2004

CHN

32

17

14

6

2000

RUS

32

28

28

7

2000

CHN

28

16

15

8

2004

RUS

27

27

38

9

1996

RUS

26

21

16

10

1996

GER

20

18

27

 

 


Click Counter  

INCR 함수는 SELECT 절에 포함되어 인자로 주어진 컬럼의 값을 1 증가시켜 주는 기능을 한다DECR 함수는 해당 컬럼의 값을 1 감소시킨다.

INCR 함수와 DECR 함수는 '클릭 카운터' 함수로 불리며, 게시판 유형의 웹 서비스에서 게시물의 조회수를 증가시키는데 유용하게 사용될 수 있다. 게시물의 내용을 SELECT하고 곧바로 게시물의 조회수를 UPDATE 1 증가하는 유형의 시나리오에서 하나의 SELECT 문에 INCR 함수를 사용함으로써 한번에 게시물 내용 조회와 조회수 증가 작업을 수행할 수 있다.

INCR 함수는 인자로 명시된 컬럼 값을 증가시킨다. , 인자로는 정수 타입의 숫자형만 올 수 있고, 값이 NULL인 경우 INCR 함수를 수행하여도 값은 NULL을 유지한다. , 값이 설정되어야 INCR 함수를 써서 값을 증가시킬 수 있다. DECR 함수는 인자로 명시된 컬럼 값을 감소시킨다.

SELECT 절에 INCR 함수를 명시한 경우, COUNTER 값을 1 증가하고 질의 결과는 증가하기 전의 값으로 출력한다. 그리고, INCR 함수는 질의 처리 과정에서 참여한 행(tuple)이 아니라 최종 결과에 참여한 행에 대해서만 값을 증가시킨다.


-- 실습 테이블 생성
CREATE TABLE clk_board (
     read_count INTEGER,
     id INTEGER
     example VARCHAR(40)

); 
    
-- 실습 레코드 추가
INSERT INTO clk_board (read_count, id, example)
VALUES(1, 1, 'TEST ');



INCR() 함수
문제
SQL문 1
SELECT INCR(read_count), id, example 
FROM clk_board
WHERE id=1;


결과 1
no
read_count
id
example
1
1
1
TEST

설명
결과 값을 보면 read_count 컬럼의 값이 1인 것을 확인 할 수 있다. 2가 아닌 1이 출력된 이유는 Click Counter는 먼저 테이블을 조회한 후에 값을 증가시키기 때문이다. INCR() 함수를 쓰지 않고 다시 SELECT문을 실행시켜보면 변환된 read_count 값을 확인 할 수 있다.

SQL문 2
SELECT read_count, id, example
FROM clk_board
WHERE id=1;


결과 2
NO
read_count
id
example
1
2
1
TEST



 

  

 


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크