일반적인 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 개의 레코드를 출력하라.
SQL문 8
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
| |
|
| |
|