2003년 11월 25일 화요일

Oracle

SQL PLUS :
$ sqlplus /nolog

접속 :
SQL> connect [계정]/[암호] [AS SYSDBA]

종료 :
SQL> exit
SQL> quit

기동 :
SQL> STARTUP

종료 :
SQL> SHUTDOWN

데이터베이스 STARTUP 단계
SHUTDOWN -> NOMOUNT -> MOUNT -> OPEN

SQL> select * from [TABLE명];

사용자 프로세스 <-> 서버 프로세스 <-> Oracle 서버

% echo $ORACLE_HOME
% echo $ORACLE_BASE
% echo $ORACLE_SID
% echo $ORA_NLS33
% echo $PATH
% echo $LD_LIBRARY_PATH

proc - precompiler
OCI - oracle call interface
ODBC -
JDBC - Java
OTL - oracle template library, C++용
http://otl.sourceforge.net/home.htm

table 만들기
CREATE TABLE 테이블명 (
    srl             NUMBER(10) NOT NULL,
    url_pattern     VARCHAR2(4000) NOT NULL,
    replacement_pattern VARCHAR2(4000) NOT NULL,
    regdate         VARCHAR2(20),
    description     VARCHAR2(4000)
);
CREATE sequence dhtml_to_html_filter_seq INCREMENT BY 1 START WITH 1 ORDER;

sequence : atomic하게 하나씩 증가함

db에 multi-line string을 넣을 때 : base64, url encoding 등으로 쉽게 해결할 수 있다.

select * from 테이블명 where rownum <= 10;
처음 10개만 출력함, rownum은 field명이 아니고 oracle에서 지원하는 것임.
rownum은 작다, 작거나 같나만 지원하고 >는 쓸 수 없음.
따라서 편법을 써야 함.
값1번째 부터 값2번째까지를 출력하려면
select * from (select 필요한 field, rownum as rn from 테이블명 where rownum <= 값1) a where a.rn > 값2);
주로 게시판에서 n 페이지의 값을 볼 때 사용함.
(이름을 속여서 oracle을 속이는 듯함, mysql에서는 복잡한 query라서 사용할 수 없을 듯.)

1. 값 집어 넣기 (INSERT .. VALUES문)
INSERT INFO Keyword_Count_3Hour
(keyword, datetime, count)
VALUES ('k1','2','3000000000');

2. 시작날짜~종료날자 사이에 있는 keyword를 각각 합계 내기
SELECT keyword, '저장날짜', sum(count) from Keyword_Count_3Hour where (datetime >= '시작날짜' and datetime <= '종료날짜') GROUP BY keyword ;

3. 2의 결과를 다른 table에 넣기 (INSERT .. SELECT 문)
INSERT INTO Keyword_Count_6Hour (keyword, datetime, count)
SELECT keyword, '저장날짜', sum(count) from Keyword_Count_3Hour where (datetime >= '시작날짜' and datetime <= '종료날짜') GROUP BY keyword ;

4. 2의 결과 중 sum(count) 상위 10000개만 뽑기
SELECT * from (SELECT * from (SELECT keyword, '저장날짜', sum(count) as sum_count from Keyword_Count_3Hour where (datetime >= '시작날짜' and datetime <= '종료날짜') GROUP BY keyword) ORDER BY sum_count DESC) where rownum <= 10000 ;

4의 잘못 된 예
SELECT * from (SELECT keyword, '2009', sum(count) as sum_count from Keyword_Count_3Hour where (datetime >= '2' and datetime <= '3') GROUP BY keyword) where rownum <= 100000 ORDER BY sum_count DESC;
=> where문이 먼저 evaluation되어서 list의 앞쪽 1개만 개를 sort하는 결과가 된다.
   (우리가 원하는 것을 sort를 먼저하고 상위 1만개를 뽑는 것이다.
DESC : decreasing order(상위)

5. 4의 결과 집어 넣기
INSERT INTO Keyword_Count_6Hour (keyword, datetime, count)
SELECT * from (SELECT * from (SELECT keyword, '저장날짜', sum(count) as sum_count from Keyword_Count_3Hour where (datetime >= '시작날짜' and datetime <= '종료날짜') GROUP BY keyword) ORDER BY sum_count DESC) where rownum <= 10000 ;
-----------------------
4,5번에 rank도 집어 넣기
INSERT INTO Keyword_Count_6Hour (keyword, datetime, count, rank)
SELECT kwd, ‘저장날짜’, sum_cnt, rownum as rm from (SELECT * from (SELECT kwd, sum(cnt) as sum_cnt from Keyword_Count_3Hour where (datetime >= '시작날짜' and datetime <= '종료날짜') GROUP BY kwd) ORDER BY sum_cnt DESC) where rownum <= 10000 ;

INSERT INTO Keyword_Raise_3Hour (kwd, cnt, datetime, rank)
SELECT equ_kwd, weight, '현재날짜', rownum as rm FROM (
SELECT equ_kwd, weight FROM (
SELECT 현재테이블.kwd as equ_kwd, (현재테이블.cnt / Keyword_Count_1Day.cnt * 정수화상수) as weight
FROM 현재테이블, 과거테이블 WHERE 현재테이블.datetime = '현재날짜' and 과거테이블.datetime = '과거날짜' and 현재테이블.kwd = 과거테이블.kwd) order by weight desc);
----------------------
. 등록된 모든 테이블명 보기
select * from tab;

. 각 테이블의 schema보기
desc 테이블명;

. 방금 전 친 명령어 보기(vim 편집창이 됨. 최근 1개의 명령어만 보관됨, 수정가능)
ed

. 방금 전 친 명령어 다시 입력하기
/엔터

. 데이터가 안 지워질 때
DBKOALA:SQL>select count(*) from Keyword_Count_3Hour where datetime <= '2005040300';
  COUNT(*)
----------
      9999
DBKOALA:SQL>delete from Keyword_Count_3Hour where datetime <= '2005040300';
delete from Keyword_Count_3Hour where datetime <= '2005040300'
            *
ERROR at line 1:
ORA-01562: failed to extend rollback segment number 28
ORA-01562: failed to extend rollback segment number 28

하드가 부족하거나, 너무 많은 양을 한 번에 지우려고 할 때 나는 에러이다.
조금씩 지우고, commit; 명령을 주어야 완전히 지워진다.

. 데이터를 잘못 지웠을 때.
바로 rollback;  명령을 준다

참고 E-book)
Teach_Yourself_SQL_In_21_Days

댓글 없음:

댓글 쓰기