BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
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          
77915 Visitors up to today!
Today 12 hit, Yesterday 95 hit
'실험노트'에 해당되는 글 2건
[폭주기관차, 2007/05/09 13:30, [DBMS]/Oracle]
SELECT *
  FROM TEST;

<결과>
ID          DATA       
----------- -----------
          3           5
          7           3
          2           9
         10           3

4 rows selected.


TEST란 Table을 생성하였다.
ROWNUM이란 것을 이용하여 결과 값을 2줄만 출력시켜 보겠다.

SELECT *
  FROM TEST
 WHERE ROWNUM < 3;

<결과>
ID          DATA       
----------- -----------
          3           5
          7           3

2 rows selected.


이번엔 2줄 이상부터 출력을 해보겠다.

SELECT *
  FROM TEST
 WHERE ROWNUM > 2;


<결과>
ID          DATA       
----------- -----------

0 rows selected.


출력 결과 값이 0개이다.
이번엔 2번째 줄에 있는 값만 출력 해보겠다.

SELECT *
  FROM TEST
 WHERE ROWNUM = 2;

<결과>
ID          DATA       
----------- -----------

0 rows selected.


음 그럼 WHERE절에서 ROWNUM은 무엇보다 작은 값만 검색이 되는 것인가 =이나, < 는 검색이 안되는것인가?

SELECT *
  FROM TEST
 WHERE ROWNUM = 1;

<결과>
ID          DATA       
----------- -----------
          3           5

1 rows selected.


1번 줄은 나온다.
그렇다면 특별한 행 이상을 출력하는 방법은 없는것인가?

아래와 같은 방법을 이용하면 3번째 줄을 출력할 수 있다.

SELECT *
  FROM (
        SELECT ROWNUM RN
             , TEST.*
          FROM TEST
         WHERE ROWNUM <= 3
       ) A
 WHERE A.RN = 3;

<결과>
RN          ID          DATA       
----------- ----------- -----------
          3           2           9

1 rows selected.


정확히 왜 바로 ROWNUM = 3을 했을 경우 안나오는지 이유에 대해서는
명확하게 알고있지 않다.
좀더 연구를 해봐야할 것 같다.

본 테스트는 Oracle 9i에서 수행되었습니다.
Trackback Address :: http://kongmks.cafe24.com/trackback/201
BlogIcon 딸기 | 2007/05/26 01:32 | PERMALINK | EDIT/DEL | REPLY
rownum은 top n analysis를 하기 때문에..
rownum은 db로부 자료를 읽어오는 순서대로 번호를 매깁니다. 따라서 subquery를 사용하여 orderby를 준다음에
rownum을 의미있는 숫자로 만들지 않는이상 단일검색은 1 밖에 되지 않습니다.
그냥 rownum에 조건을 주면 1부터 검색을 하기때문에 1이외의 조건은 '1'에서 false가 떨어지므로
남아 있는 자료가 아무리 더 있다한들 결과값은 0 이 나온다고 배.웠.습.니.다.^^
BlogIcon 폭주기관차 | 2007/05/28 08:44 | PERMALINK | EDIT/DEL
아. Select가 된 결과값에 번호가 매겨져서

SELECT *
FROM TEST
WHERE ROWNUM > 2;
를 했을 경우

1번 컬럽은 ROWNUM은 1이기 때문에 FALSE가 떨어지고
(Select가 되지 않아서 ROWNUM은 그대로 1)
2번 컬럼도 ROWNUM이 1이 되어서 FALSE가 떨어지고..

결국 Select가 된 결과가 하나도 없어서 계쏙 ROWNUM이 1인상태가
되는 군요...

정말 감사합니다~^^ 이제야 이해했습니다~^^
행복한 하루 보내십시오~^^
Name
Password
Homepage
Secret
[폭주기관차, 2007/02/27 08:28, [DBMS]/Oracle]
A Table
tUid
NAME
1
kkk
2
bbb
3
ccc
1
jjj

B Table
tUid tMax tMin
1 48 31
2 88 27
2 75 23
1 80 29
1 94 19
4 35 11


SELECT * FROM A, B
WHERE
    A.TUID = B.TUID;

TUID        NAME TUID        TMAX        TMIN       
----------- ---- ----------- ----------- -----------
          1 kkk            1          48          31
          1 jjj               1          48          31
          1 kkk            1          80          29
          1 jjj               1          80          29
          1 kkk            1          94          19
          1 jjj               1          94          19
          2 bbb            2          88          27
          2 bbb            2          75          23

8 rows selected.


SELECT * FROM A, B
WHERE
    A.TUID(+) = B.TUID;

TUID        NAM TUID        TMAX        TMIN       
----------- --- ----------- ----------- -----------
          1 kkk            1          48          31
          1 jjj               1          48          31
          1 kkk            1          80          29
          1 jjj               1          80          29
          1 kkk            1          94          19
          1 jjj               1          94          19
          2 bbb            2          88          27
          2 bbb            2          75          23
                               4          35          11

9 rows selected.


SELECT * FROM A,  B
WHERE
    A.TUID = B.TUID(+);

TUID        NAM TUID        TMAX        TMIN       
----------- --- ----------- ----------- -----------
          1 kkk            1          48          31
          1 kkk            1          80          29
          1 kkk            1          94          19
          1 jjj               1          48          31
          1 jjj               1          80          29
          1 jjj               1          94          19
          2 bbb            2          88          27
          2 bbb            2          75          23
          3 ccc                                     

9 rows selected.

-- 단지 일반 Join에서 (+)기호가 붙지 않은 Table에 Join되지 않은 값만 출력 됨


SELECT * FROM A LEFT OUTER JOIN B
ON
    A.TUID = B.TUID;

TUID        NAM TUID        TMAX        TMIN       
----------- --- ----------- ----------- -----------
          1 jjj               1          48          31
          1 kkk            1          48          31
          2 bbb            2          88          27
          2 bbb            2          75          23
          1 jjj               1          80          29
          1 kkk            1          80          29
          1 jjj               1          94          19
          1 kkk            1          94          19
          3 ccc                                     

9 rows selected.

-- Right Table에서 Left Table로 1:1 대입후 Left Table의 Join되지 않는 값은 출력된다.
   잘보면 kkk보다 밑에있는 jjj값부터 출력이 되었다.
    Outer Join을 하면 마지막 테이블서부터 Join을 한다는 것을 알 수 있다.


SELECT * FROM A FULL OUTER JOIN B
ON
    A.TUID = B.TUID;


TUID        NAM TUID        TMAX        TMIN       
----------- --- ----------- ----------- -----------
          1 jjj               1          48          31
          1 kkk            1          48          31
          2 bbb            2          88          27
          2 bbb            2          75          23
          1 jjj               1          80          29
          1 kkk            1          80          29
          1 jjj               1          94          19
          1 kkk            1          94          19
          3 ccc                                     
                               4          35          11

10 rows selected.

-- Right Table에서 Left Table로 1:1 대입후 Full(Left/Right) Table의 Join되지 않는 값은 출력된다.


SELECT * FROM A RIGHT OUTER JOIN B
ON
    A.TUID = B.TUID;

TUID        NAM TUID        TMAX        TMIN       
----------- --- ----------- ----------- -----------
          1 kkk            1          94          19
          1 kkk            1          80          29
          1 kkk            1          48          31
          2 bbb            2          75          23
          2 bbb            2          88          27
          1 jjj               1          94          19
          1 jjj               1          80          29
          1 jjj               1          48          31
                               4          35          11

9 rows selected.


-- Left Table에서 Right Table로 1:1 대입후 (Right) Table의 Join되지 않는 값은 출력된다.

-- (+)기호를 사용한 Outer Join과 ANSI 표준인 Left/Right/Full Outer Join의 결과 값에서는
   차이가 없지만 정렬이 다름을 알 수 있다.
   정렬이 다르다는 것은 Join하는 순서/방식이 다르다는 뜻이다.

본 실험은 Oracle 9i에서 실험 되었습니다.
Trackback Address :: http://kongmks.cafe24.com/trackback/149
Name
Password
Homepage
Secret
*1