본문 바로가기

프로그래밍/oracle

oracle - 오라클 초보 사용자를 위한 팁

반응형

 오라클 초보 사용자를 위한 팁

 

◈ TABLE 구조 보기


SQL>DESC TABLE_NAME

 


◈ 테이블 존재 여부 알아보기


SQL>SELECT TABLE_NAME 

        FROM USER_TABLES

        WHERE TABLE_NAME = '찾을 테이블 이름'

        -->찾을 테이블 이름은 대문자여야 됩니다. 

 


◈ 모든 유저 보기


SQL>SELECT username FROM ALL_USERS

 


◈ 테이블 제약조건의 확인


SQL>SELECT table_name, constraint_name, constraint_type

        FROM   USER_CONSTRAINTS

        WHERE TABLE_NAME ='STORM_CONTENT';

 


◈ 선택한 Row만큼만 보여주기


SQL>SELECT name 

        FROM storm_board

        WHERE rownum <= 10

---> 이렇게 하면 데이터가 1000건이 있더라도, 1~10건만 보여주게 된다.

 

 

◈ 'LIKE' 연산자를 사용하여 case insensitive search를 할 수 있는 방법

 

필드에 'UPPER' 함수를 사용하시면 됩니다

SQL>SELECT name 

        FROM storm_board 

        WHERE UPPER(name) like '%K%'

 


◈ 잠시 host상태로 나가고 싶을 때.


SQL>host

다시 sqlplus로 들어오려면 exit명령어로 들어오시면 됩니다.

 


◈ 테이블에 새로운 컬럼의 추가


SQL>ALTER TABLE table_name ADD ( column_name DATATYPE ); 

 

ex)SQL>ALTER TABLE storm_board ADD(ip_addr VARCAHR2(15) not null)



◈ 테이블 컬럼의 삭제


SQL>ALTER TABLE table_name DROP COLUMN column_name 


ex)SQL>ALTER TABLE storm_board DROP COLUMN ip_addr

-->컬럼의 삭제는 오라클 8i버전부터 되는것으로 알고 있습니다.  

 

 

◈ SQLPLUS에서 SQL문의 실행 속도 알아보기

 

SQL>SET TIMING ON


을 한 후 SELECT문을 수행하면 경과 시간이 나옵니다. 

 

SQL> SELECT COUNT(name) FROM storm_board;

 

COUNT(NAME)

-----------

        286

 

경   과: 00:00:00.10



◈ SQLPLUS에서 SELECT문 사용시 데이타만 출력되고 HEADER는 안나오게 하는 방법

 

SQL>SET HEADING OFF

한후 SELECT문을 수행하면 아래와 같은 결과가 나옵니다.

 

SQL> SELECT empno, ename, mgr 

         FROM emp 

         WHERE rownum < 6;


7369  SMITH            7902

7499  ALLEN            7698

7521  WARD             7698

7566  JONES            7839

7654  MARTIN           7698

 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 오라클 초보 사용자를 위한 팁  

               오라클 자바 기초를 튼튼히!! 오라클 초보 사용자를 위한 팁      

▲ 이전글 - 질문과 답변에 올라온 오라클 TIP들  전체 포스트 보기   

 


 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


질문과 답변에 올라온 오라클 TIP들 | Oracle_팁 2005/12/05 09:13  

 

http://blog.naver.com/swinter8/130000078942 

 

1. 10%를 랜덤하게 가져옵니다.(오라클 8.1.7 이상부터 지원이 됩니다.) [하얀그림자님 답변글]


SQL> SELECT *

        FROM table_name

        SAMPLE (10);


 


2. 오라클에서 CASE문 사용 예제 [하얀그림자님 답변글]


SQL>SELECT col,

           CASE

             WHEN col >= 0  AND col < 6  THEN 'A'

             WHEN col >= 6  AND col < 14 THEN 'B'

             WHEN col >= 14 AND col < 22 THEN 'C'

             WHEN col >= 22 THEN 'D'

           END

      FROM table_name;





3. 해당년도의 선택된 주의 첫번째 날자를 구하고 싶습니다.[석철희님 답변글]


[질문]

해당년도의 선택된 주의 첫번째 날자를 구하고 싶습니다.

 

예로 2002년 36번째 주의 첫번째 날자는 2002/09/02입니다.

2002년 36번째주를 가지고 '2002/09/02'이란 해당주의 첫번째 날자를 구하고 싶습니다.

 


[답변][석철희님 답변글]


SQL> SELECT NEXT_DAY(TO_DATE(해당년도||'0101','RRRRMMDD') + (선택한주 - 2) * 7, 2) 

         FROM DUAL;

 


SQL> SELECT NEXT_DAY(TO_DATE(2003||'0101','RRRRMMDD') + (2 - 2) * 7, 2) 

         FROM DUAL;

NEXT_DAY

--------

03/01/06

 

 

==> FROM 앞에 2 는 월요일을 그 주에 첫번째로 선택한 거니깐 일요일을 

    그 주의 첫번째 날로 바꾸시려면 1로 바꾸시면 됩니다.

 



4. DB 테이블 내용 복사 대해서[하얀그림자님 답변글] 


1). Table A와 Table B 가 있는데. A의 내용을 B로 복사하는 방법


SQL>INSERT INTO b SELECT * FROM a;

 

 

2). Table A가 있고 Table B를 생성하면서 복사하는 방법


SQL>CREATE TABLE b AS SELECT * FROM a;



3). Table A가 있고 Table A와 구조가 같고 내용은 복사하지 않는 Table B 생성 방법

 

SQL>CREATE TABLE b AS SELECT * FROM a WHERE 1 = 2;




5.점수별로 몇명씩 있는지 알고 싶습니다 .[배경열님 답변글]

 

[질문] 

이름 점수

===============

홍길동 90

김길동 98

이길동 75

성춘향 60

이동국 30

최성국 100

김남일 85

 

일때 .....

점수별로 몇명씩 있는지 알고 싶습니다 .. 

 

원하는 결과값

=============

점수대 명수

===============

90-100 3

80-89 1

0-79 3



[답변 ]

Sign Function을 쓰세요.

SELECT

        DECODE(SIGN(점수-89),1,'90-100', 

        DECODE(SIGN(점수-79),1,'80-89','0-79')),

        COUNT(*) 

FROM

        성적

GROUP BY

        DECODE(SIGN(점수-89),1,'90-100',

        DECODE(SIGN(점수-79),1,'80-89','0-79'))

ORDER BY 1 DESC





6. 컬럼에 해당하는 테이블명 알아내기..

 

SQL>SELECT TABLE_NAME 

        FROM  USER_TAB_COLS

        WHERE COLUMN_NAME ='BOARD_ID'

 

이렇게 하시면 됩니다.. 

컬럼관련 정보는 USER_TAB_COLS 데이터사전을 통해 확인할 수 있습니다.

COLS라는 시노님을 이용해도 됩니다. 



SQL>SELECT COUNT(COLUMN_NAME) "Column Count"

    FROM COLS

    WHERE TABLE_NAME ='STORM_BOARD'  

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 질문과 답변에 올라온 오라클 TIP들   

               오라클 자바 기초를 튼튼히!! 질문과 답변에 올라온 오라클 TIP들       

▲ 이전글 - scott user 생성 스크립트  전체 포스트 보기   

▼ 다음글 - 오라클 초보 사용자를 위한 팁  



 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


scott user 생성 스크립트 | Oracle_팁 2005/12/05 09:14  

 

http://blog.naver.com/swinter8/130000078952 

 

1. system/manager로 sqlplus에 접속하여 scott유저를 생성 합니다. 

 

SQL>CREATE USER scott IDENTIFIED BY tiger

        DEFAULT TABLESPACE users

        TEMPORARY TABLESPACE temp;

 

 

2. 권한을 부여 합니다. 


SQL>GRANT connect, resource TO scott;

 


3. 유저로 접속해서 스크립트를 실행 합니다. 


SQL>CONNECT scott/tiger

 

@$ORACLE_HOME/sqlplus/demo/demobld.sql

  

위와 같이 하면 됩니다.

 

scott user는 sqlplus를 테스트하기 위해 생기는 유저입니다.

오라클을 설치하면 기본으로 생성이 됩니다.  

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! scott user 생성 스크립트    

               오라클 자바 기초를 튼튼히!! scott user 생성 스크립트        

▲ 이전글 - DB에 등록된 유저의 정보와, 유저별 Object 정보 조회  전체 포스트 보기   

▼ 다음글 - 질문과 답변에 올라온 오라클 TIP들  



 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


DB에 등록된 유저의 정보와, 유저별 Object 정보 조회 | Oracle_팁 2005/12/05 09:15  

 

http://blog.naver.com/swinter8/130000078958 

 

◈ DB에 등록된 유저의 정보 조회

 

 - dba_users 데이터 사전을 이용하시면 됩니다. 

 


SQL>col username format a15

SQL>col default_tablespace format a15

SQL>col temperary_tablespace format a15

SQL>SELECT username, default_tablespace, temporary_tablespace, created

       FROM dba_users

    

USERNAME        DEFAULT_TABLESP TEMPORARY_TABLESPACE           CREATED

---------------   ---------------        ------------------------------ --------

SYS                     SYSTEM                 TEMP                                   01/03/25

SYSTEM               TOOLS                   TEMP                                   01/03/25

OUTLN                  SYSTEM                 SYSTEM                               01/03/25

DBSNMP               SYSTEM                  SYSTEM                              01/03/25

SCOTT                 SYSTEM                  SYSTEM                              01/03/25

ADAMS                 SYSTEM                  SYSTEM                               01/03/25

OEM                     OEM_REPOSITORY   TEMP                                  01/10/11

JONES                  SYSTEM                   SYSTEM                              01/03/25

CLARK                  SYSTEM                   SYSTEM                              01/03/25

BLAKE                  SYSTEM                   SYSTEM                              01/03/25

....

 

18개의 행이 선택되었습니다.

 

 

DEFAULT_TABLESPACE와 TEMPORARY_TABLESPACE는 유저를 생성할때 지정한 것이며, 

이때 테이블스페이스를 지정하지 않으면 오라클은 자동적으로 

DEFAULT_TABLESPACE와 TEMPORARY_TABLESPACE를 system으로 이용합니다. 



 ◈ 유저의 Object 정보 조회

 

- user_objects 데이터 사전을 이용하시면 됩니다. 

 


SQL>col object_name format a25;

SQL>SELECT object_name, object_type

        FROM user_objects

        WHERE object_type = 'INDEX';

 

OBJECT_NAME               OBJECT_TYPE

------------------------- ------------------

BIANRY_PK                         INDEX

BINARY_FK                         INDEX

BOARD_CTNT_LST_FK1        INDEX

BOARD_CTNT_LST_FK2        INDEX

BOARD_CTNT_LST_PK          INDEX

BOARD_FK1                        INDEX

BOARD_PK                         INDEX

COMMUNITY_TYPE_IDX        INDEX

COMMUNITY_TYPE_PK         INDEX

COMM_CTNT_LST_FK1         INDEX

COMM_CTNT_LST_FK2         INDEX

...

27개의 행이 선택되었습니다.     

 

object_type를 보고 싶으면

 

SQL>SELECT object_type

       FROM user_objects

       GROUP BY object_type;

 

OBJECT_TYPE

------------------

INDEX

SEQUENCE

TABLE

 

 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!!  DB에 등록된 유저의 정보와, 유저별 Object 정보 조회   

               오라클 자바 기초를 튼튼히!!  DB에 등록된 유저의 정보와, 유저별 Object 정보 조회       

▲ 이전글 - 제약 조건의 확인  전체 포스트 보기   

▼ 다음글 - scott user 생성 스크립트  




 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


제약 조건의 확인 | Oracle_팁 2005/12/05 09:16  

 

http://blog.naver.com/swinter8/130000078966 

 

1. 테이블에 걸려있는 제약 조건의 확인


- USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있습니다. 


- USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건을 불 수 있습니다.  


이 두개의 데이터사전을 참조 하면 됩니다. 

 


 SQL> SELECT  SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,        -- 컬럼명

               DECODE(B.CONSTRAINT_TYPE, 

                                         'P','PRIMARY KEY',

                        'U','UNIQUE KEY',

                      'C','CHECK OR NOT NULL',

                                        'R','FOREIGN KEY') CONSTRAINT_TYPE,      -- 제약조건 TYPE

              A.CONSTRAINT_NAME   CONSTRAINT_NAME             -- 제약 조건 명

        FROM  USER_CONS_COLUMNS  A,  USER_CONSTRAINTS  B   

        WHERE  A.TABLE_NAME = UPPER('&table_name')   

            AND  A.TABLE_NAME = B.TABLE_NAME   

            AND  A.CONSTRAINT_NAME = B.CONSTRAINT_NAME   

        ORDER BY 1;   


-- 테이블 명을 입력 하면 됩니다. 

table_name의 값을 입력하십시오: emp2


 

COLUMN_NAME             CONSTRAINT_TYPE   CONSTRAINT_NAME

------------------------------ ----------------- -------------------------

DEPTNO                   CHECK OR NOT NULL      SYS_C001362   

                               FOREIGN KEY                EMP2_FK_DEPTNO

EMPNO                     PRIMARY KEY               EMP2_PK_EMPNO

ENAME                     CHECK OR NOT NULL     EMP2_NN_ENAME

MGR                        UNIQUE KEY                  EMP2_UP_MGR


  emp2 테이블의 모든 제약조건을 보여주고 있습니다. 


  SYS로 시작하는 CONSTRAINT명은 USER가 CONSTRAINT NAME을 지정하지 않아 

  SYSTEM에서 DEFAULT로 생성한 경우를 보여 줍니다. 





2. 테이블의 특정 컬럼에 걸려있는 제약 조건의 확인


USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있습니다. 


SQL>SET LINESIZE 300


SQL>SELECT SUBSTR(TABLE_NAME,1,15)    TABLE_NAMES,   

              SUBSTR(COLUMN_NAME,1,15)   COLUMN_NAME,   

            SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME   

    FROM USER_CONS_COLUMNS   

    WHERE TABLE_NAME = UPPER('&table_name')   

        AND COLUMN_NAME = UPPER('&column_name');   

    

 

table_name의 값을 입력하십시오: emp2

column_name의 값을 입력하십시오: empno

 

TABLE_NAMES        COLUMN_NAME    CONSTRAINT_NAME

-----------------     -------------         -----------------

EMP2                     EMPNO                EMP2_PK_EMPNO


emp2테이블의 empno 컬럼의 제약조건을 보여 줍니다. 


 

 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 제약 조건의 확인  

               오라클 자바 기초를 튼튼히!! 제약 조건의 확인      

▲ 이전글 - 중복된 RECORD 삭제 방법  전체 포스트 보기   

▼ 다음글 - DB에 등록된 유저의 정보와, 유저별 Object 정보 조회  




 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


중복된 RECORD 삭제 방법 | Oracle_팁 2005/12/05 09:16  

 

http://blog.naver.com/swinter8/130000078973 

 

Oracle Technical Bulletins No. 10185 참고..

 

중복된 RECORD 삭제 방법

================================

 

중복된 RECORD를 삭제하는 방법은 2가지가 있습니다.

 

 

방법1)

 

SQL> CREATE TABLE emp2 AS SELECT distinct * FROM emp;


SQL> DROP TABLE emp;


SQL> RENAME emp2 TO emp;

 




방법2) 중복된 데이터중에서 ROWID가 큰 값을 제거

 

 

SQL> DELETE FROM emp a

        WHERE rowid > (SELECT MIN(ROWID) 

                                FROM emp b

                               WHERE b.empno = a.empno);

 

 

 

en-core에서 본 白面書生(www.okjsp.pe.kr)님의 글도 참고해서 넣었습니다. 


방법2) 나중에 들어온 데이터를 살릴경우



SQL> DELETE FROM emp a

        WHERE ROWID < (SELECT MAX(ROWID) 

                                 FROM emp b

                                WHERE a.empno = b.empno);  

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 중복된 RECORD 삭제 방법  

               오라클 자바 기초를 튼튼히!! 중복된 RECORD 삭제 방법      

▲ 이전글 - 한글을 2byte로 계산하여 리턴 받으려면(LENGTH와 LENGTHB함수)  전체 포스트 보기   

▼ 다음글 - 제약 조건의 확인  




 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


한글을 2byte로 계산하여 리턴 받으려면(LENGTH와 LENGTHB함수) | Oracle_팁 2005/12/05 09:17  

 

http://blog.naver.com/swinter8/130000078980 

 

◈ LENGTH 함수와 LENGTHB 함수

 

 

오라클에서 LENGTH 함수를 사용하면 한글을 1byte로 계산하여 리턴 합니다. 

 

한글을 2byte로 계산하여 리턴 받으려면 LENGTHB 함수를 사용해야 합니다. 


LENTGTHB 함수는 byte 단위로 계산을 합니다.

 

 

 -- LENGTH 함수

SQL>SELECT name, LENGTH(name) LEN  FROM lentest;

 

NAME                        LEN

-------------------- ----------

오라클                        3

oracle                        6

 


 -- LENGTHB 함수 

SQL>SELECT name, LENGTHB(name) LEN  FROM  lentest;

 

NAME                        LEN

------------------- ----------

오라클                        6

oracle                        6

 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 한글을 2byte로 계산하여 리턴 받으려면(LENGTH와 LENGTHB함수)  

               오라클 자바 기초를 튼튼히!! 한글을 2byte로 계산하여 리턴 받으려면(LENGTH와 LENGTHB함수)      

▲ 이전글 - 테이블과 컬럼에 주석(Comment) 생성 방법  전체 포스트 보기   

▼ 다음글 - 중복된 RECORD 삭제 방법  



 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


테이블과 컬럼에 주석(Comment) 생성 방법 | Oracle_팁 2005/12/05 09:18  

 

http://blog.naver.com/swinter8/130000078993 

 

Table, View, Snapshot 또는 Column의 주석은 COMMENT문을 이용해서 생성 할 수 있습니다.


 


① 테이블 주석 생성

 

SQL>COMMENT ON TABLE emp IS '사원'

       주석이 생성되었습니다.



 ② 컬럼 주석 생성


SQL>COMMENT ON COLUMN emp.empno 

        IS '사원번호'



 ③ 테이블 주석의 조회


  -- 주석 관련 데이터 사전

    DBA_TAB_COMMENTS, ALL_TAB_COMMENTS, USER_TAB_COMMENTS  -- 테이블 관련


SQL>SELECT  table_name, table_type, comments 

        FROM USER_TAB_COMMENTS

        WHERE comments is not null;

 

TABLE_NAME                         TABLE_TYPE    COMMENTS

------------------------------ -----------   --------------------------------

EMP                                       TABLE               사원




 ④ 컬럼 주석의 조회


  -- 주석 관련 데이터 사전

    DBA_COL_COMMENTS, ALL_COL_COMMENTS, USER_COL_COMMENTS  -- 컬럼 관련


SQL> SELECT table_name, column_name, comments

        FROM USER_COL_COMMENTS

        WHERE comments is not null


TABLE_NAME                        COLUMN_NAME     COMMENTS

------------------------------ -------------       -------------------------------

EMP                                      EMPNO                사원번호     



 ⑤ 주석의 삭제


SQL>COMMENT ON COLUMN emp.empno IS ' '; 


주석에 대해서 간단히 정리 했습니다... 


 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 테이블과 컬럼에 주석(Comment) 생성 방법  

               오라클 자바 기초를 튼튼히!! 테이블과 컬럼에 주석(Comment) 생성 방법      

▲ 이전글 - 프로시저에서 테이블 생성 방법(DBMS_SQL 패키지)  전체 포스트 보기   

▼ 다음글 - 한글을 2byte로 계산하여 리턴 받으려면(LENGTH와 LENGTHB함수)  



 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


프로시저에서 테이블 생성 방법(DBMS_SQL 패키지) | Oracle_팁 2005/12/05 09:18  

 

http://blog.naver.com/swinter8/130000079002 

 

▣ DBMS_SQL package의 구성 



Function open_cursor

  : SQL문의 실행에 필요한 새로운 cursor를 열고 cursor ID number를 return한다.

 

Function is_open

  : 주어진 cursor가 현재 open되어 있으면 TRUE를, 아니면 FALSE를 return한다.

 

Procedure parse

  : statement를 check하고 cursor와 결합시킨다.

 

Procedure bind_variable

  : program 내에서 data를 저장한 placeholder의 값을 제공하는 역할을 한다.

 

Procedure define_column

  : cursor로부터 select된 column의 값을 받는 변수를 지정한다.

 

Function execute

  : SQL문을 실행하고 처리된 Row의 수를 return한다.

    (insert, update, delete인 경우에만 해당)

 

Function fetch_rows

  : cursor로부터 row를 fetch하고 실제로 fetch된 row의 수를 return 한다. 

 이 row들은 buffer에 들어가며, column_value를 호출하여 읽어들여야 한다. 

 

Function execute_and_fetch

  : execute와 fetch row를 동시에 수행하고 실제로 fetch된 row의 수를 return 한다.

 

Procedure variable_value

  : 주어진 변수의 값을 return한다.

 

Procedure column_value

  : fetch_rows에 의해 fetch된 data의 값을 return한다.

 

Procedure close_cursor

  : cursor를 닫는다.

  




▣ 프로시저에서 테이블 생성 예제 



sys user로 접속해서 대상 유저한테 권한을 부여 합니다. 

> @?/rdbms/admin/dbmssql.sql  

> grant create any table to [user_name];

> grant execute on dbms_sql to [user_name];

 

 

SQL> conn sys/change_on_install

연결되었습니다.


-- 권한의 부여 

SQL> grant create any table to scott;

권한이 부여되었습니다.

 

SQL> grant execute on dbms_sql to scott;

권한이 부여되었습니다.

 

SQL> conn scott/tiger;

연결되었습니다.

 

 

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)


-- 프로시저의 생성 

SQL> CREATE OR REPLACE PROCEDURE credb

         IS

  

                cursor1 INTEGER;

                dbdate VARCHAR2(10);

                credbsql VARCHAR2(100);

    

        BEGIN

  

                -- sysdate를 얻어옴

                SELECT to_char(sysdate,'RRRRMMDD')

                INTO dbdate

                FROM dual;

  

                -- CREATE TABLE명령어 생성

                credbsql := 'CREATE TABLE LOG' || dbdate || ' (a number, b varchar2(10))';

                

                --CREATE TABLE명령어 화면에 출력  

                DBMS_OUTPUT.PUT_LINE(credbsql);

  

                -- 테이블 생성

                cursor1 := DBMS_SQL.OPEN_CURSOR;  

                DBMS_SQL.PARSE(cursor1, credbsql, dbms_sql.v7);

                DBMS_SQL.CLOSE_CURSOR(cursor1);

                

        END;

        /

 프로시저가 생성 되었습니다. 

 

 SQL>exec credb;

 CREATE TABLE LOG20010920 (a number, b varchar2(10))

 

PL/SQL 처리가 정상적으로 완료되었습니다.

 

테이블을 확인해 봅니다. 

SQL>DESC LOG20010920;

  이름                                      널?      유형

 -------------------------------- -------- ---------------

 A                                                  NUMBER

 B                                                  VARCHAR2(10)

 

 LOG20010920 테이블이 생성된 것을 확인 할 수 있습니다. 

 



▣ DBMS_SQL package를 이용한 프로 시져 생성의 예 



SQL>CREATE OR REPLACE PROCEDURE test(txt varchar2)  AS


                c integer;

                rows integer;

 

        BEGIN

  

                c := DBMS_SQL.OPEN_CURSOR;

                DBMS_SQL.PARSE(c,'create or replace '|| txt ,DBMS_SQL.NATIVE);

                rows := DBMS_SQL.EXECUTE(c);

                DBMS_SQL.CLOSE_CURSOR(c);

        END;

 


SQL>exec test('procedure ttum(aa  number) AS  kk number; BEGIN kk:= 0 ; kk := kk + aa ; END ; ');

 

SQL> exec test ('procedure ttt1(aa number) as kk varchar2(10); begin select 1 into kk from dual; end;');

  

 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! 프로시저에서 테이블 생성 방법(DBMS_SQL 패키지)  

               오라클 자바 기초를 튼튼히!! 프로시저에서 테이블 생성 방법(DBMS_SQL 패키지)      

▲ 이전글 - 0. 소개  전체 포스트 보기   

▼ 다음글 - 테이블과 컬럼에 주석(Comment) 생성 방법  



 

       

 목록보기 | SQL 과 PLSQL TIP (37)  스크랩 엮인글 목록열기 ▼ 목록닫기 ▲  

 

 

 

 

 


ORACLE 간단한 SQL 명령어 | SQL 과 PLSQL TIP 2006/01/02 21:40  

 

http://blog.naver.com/swinter8/130000646902 

 

제 1 장 데이터의 검색



SQL 명령어는 다음과 같이 기술한다. 

■ SQL 명령어는 한 줄 혹은 여러 줄에 기술한다. 

■ 일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다. 

■ TAB 을 사용할 수 있다. 

■ SQL 명령어 단어는 생략하거나 분리할 수 없다. 

■ SQL 명령어는 대소문자를 구분하지 않는다. 

■ SQL 명령어는 ; 으로 종료한다. 

■ SQL 명령어는 SQL BUFFER 에 저장된다. 

■ SQL BUFFER 에 저장된 SQL 명령어는 / 혹은 RUN 으로 실행할 수 있다. 

SQL*PLUS 명령어는 다음과 같이 기술한다. 

■ SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다. 

■ SQL*PLUS 명령어는 대소문자를 구별하지 않는다. 

■ SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다. 

■ SQL*PLUS 명령어는 다음과 같다. 

? DESCRIBE table명 : TABLE 의 구조를 보여준다. 

? SAVE file명 : SQL BUFFER 를 file 로 저장한다. 

? START file명 : file 을 수행한다. 

? @ file명 : file 을 수행한다. 

? EDIT file명 : EDITOR 를 사용하여 file 을 편집한다. 

? SPOOL file명 : QUERY 결과를 file 에 저장한다. 

? SPOOL OFF : SPOOL FILE 을 닫는다. 

? HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다. 

? HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다. 

? EXIT : SQL*PLUS 를 종료한다. 


전체 데이타의 검색

가장 간단한 SELECT 문장의 형식은 다음과 같다.

. SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다.

. FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.

TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.

SELECT *

FROM table명 ;

[ 예제 ]

S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.

SELECT *

FROM S_DEPT ;


특정 column의 검색

SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.

COLUMN 순서는 검색하고 싶은 순서대로 나열한다.

COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.

SELECT column명, column명, column명,..

FROM table명 ;

[ 예제 ]

S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.


SELECT ID, LAST_NAME, START_DATE

FROM S_EMP ;


산술식을 사용한 검색

산술 연산자를 사용하여 검색되는 데이타 값을 변경할 수 있다.

산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성된다.

SELECT 산술연산식

FROM table명 ;

[ 예제 ]

S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오.

연봉은 SALARY * 12 로 계산한다. (+,-,*,/,())

SELECT ID, LAST_NAME, SALARY * 12

FROM S_EMP ;


Column alias

기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.

그러나 많은 경우 COLUMN 명이 이해하기 어렵거나 무의미하기 때문에 COLUMN ALIAS 를 사용하여 

COLUMN HEADING 을 변경할 수 있다. 

ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.

ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.

COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

SELECT column명 alias, column명 "alias", column명 as alias

FROM table명 ;

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, (SALARY + 100) * 12, DEPT_ID 를 검색하시오.

단, COLUMN ALIAS 는 Employee, ANNUAL_SALARY, DEPARTMENT NO 로 정의하시오.

SELECT LAST_NAME "Employee", (SALARY + 100) * 12 AS ANNUAL_SALARY,

DEPT_ID "DEPARTMENT NO"

FROM S_EMP ; 


Column의 결합

COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.

SELECT column명|| column명

FROM table명;

[ 예제 ]

S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.

SELECT FIRST_NAME || LAST_NAME EMPLOYEE

FROM S_EMP ;


Null값 처리

특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값을 NULL 이라 부른다.

NULL 값은 0 이나 공백과 같지 않다. 

NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다. 

그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.

NULL 값을 다른 값으로 대체한다.

NVL (number_column, 9)

NVL (date_column, '01-JAN-95')

NVL (character_column, 'ABCDE')

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.

COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.

SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSION

FROM S_EMP ;


중복 row의 제거

SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다. 

중복된 ROW 를 제거한다.

SELECT DISTINCT column명, column명

FROM table명;

[ 예제 ]

S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.

SELECT DISTINCT NAME

FROM S_DEPT ;


데이타의 정렬

SELECT 되는 ROW 의 순서는 알 수 없다.

그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.

DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.

? 숫자 : 1 에서 999 순으로 SORT 한다.

? 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.

? 문자 : A 에서 Z 순서로 SORT 한다.

? NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.

역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.

COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.

SELECT expr

FROM table명

ORDER BY {column명, expr} [ASC|DESC] ;

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.

SELECT LAST_NAME, DEPT_ID, START_DATE

FROM S_EMP

ORDER BY LAST_NAME ;


특정 row의 검색 

WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.

조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.

문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다.

날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97' 

숫자값은 값만 적어준다.

특정 ROW 만 검색한다. 

SELECT expr

FROM table명

WHERE expr operator value

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME,

TITLE 을 검색하시오. (=,>,<,>=,<=,<>)

SELECT FIRST_NAME, LAST_NAME, TITLE

FROM S_EMP

WHERE LAST_NAME = 'Magee' ;


Between...and

BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다.

범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다. 

두 범위의 한계 값을 포함한다. 

BETWEEN...AND...

NOT BETWEEN...AND...

[ 예제 ]

S_EMP TABLE 에서 START_DATE 가 09-MAY-91 에서 17-JUN-91 사이에 입사한 

사원의 FIRST_NAME, LAST_NAME, START_DATE 를 검색하시오.

SELECT FIRST_NAME, LAST_NAME, START_DATE

FROM S_EMP

WHERE START_DATE BETWEEN '09-MAY-91' AND '17-JUN-91' ; 


In[list]

IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.

IN(LIST), NOT IN(LIST)

[ 예제 ]

S_EMP TABLE에서 DEPT_ID 가 10 , 31, 41 혹은 50 인 사원의 FIRST_NAME,

LAST_NAME, DEPT_ID 를 검색하시오.

SELECT FIRST_NAME, LAST_NAME, DEPT_ID

FROM S_EMP

WHERE DEPT_ID IN (10, 31, 41, 50) ;


like

찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.

WILDCARD 를 사용하여 문자의 형태를 지정한다.

% : 여러 문자, _ : 한문자 

LIKE '형태', NOT LIKE '형태'

[ 예제 ]

S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.

SELECT LAST_NAME

FROM S_EMP

WHERE LAST_NAME LIKE 'M%' ;

SELECT LAST_NAME

FROM S_EMP

WHERE LAST_NAME LIKE '__M____' ;


is null

IS NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.

NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여 

어떤 값과 비교할 수 없기 때문에 사용한다.

IS NULL, IS NOT NULL

[ 예제 ]

S_EMP TABLE에서 COMMISSION_PCT 가 NULL 인 사원의 LAST_NAME, SALARY,

COMMISSION_PCT 를 검색하시오.

SELECT last_name, salary,commission_pct,last_name, salary

FROM s_emp

WHERE commission_pct is null;


조건식의 결합

조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.

AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.

그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.

WHERE 조건식 AND | OR 조건식

[ 예제 ]

S_EMP TABLE에서 DEPT_ID 가 41 이고 TITLE 이 Stock Clerk 인 사원의 

LAST_NAME, SALARY, DEPT_ID, TITLE 을 검색하시오.

SELECT LAST_NAME, SALARY, DEPT_ID, TITLE

FROM S_EMP

WHERE DEPT_ID = 41

AND TITLE = 'Stock Clerk' ;


제 2 장 Single Row Functions

소문자로 변환

모든 문자를 소문자로 변환시킨다.

LOWER(COLUMN명)

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 FIRST_NAME, LAST_NAME 을 소문자로 출력시키시오.

SELECT LOWER(FIRST_NAME), LOWER(LAST_NAME)

FROM S_EMP

WHERE LOWER(LAST_NAME) = 'smith' ;


대문자로 변환

모든 문자를 대문자로 변환시킨다.

UPPER(COLUMN명)

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.

SELECT UPPER(TITLE)

FROM S_EMP

WHERE UPPER(LAST_NAME) = 'SMITH';


첫글자만 대문자로 변환

단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.

INITCAP(COLUMN명)

[ 예제 ]

S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.

SELECT INITCAP(TITLE)

FROM S_EMP ;


문자의 부분을 자름

문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다.

자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.

SUBSTR(COLUMN명, M, N)

[ 예제 ]

S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 

NAME 을 출력하시오. 

SELECT NAME

FROM S_PRODUCT

WHERE SUBSTR(NAME, 1, 3) = 'Ace' ;


문자의 길이를 계산

문자의 길이를 RETURN 한다.

LENGTH(COLUMN명)

[ 예제 ]

S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.

SELECT NAME, LENGTH(NAME)

FROM S_PRODUCT;


숫자의 반올림

지정된 자리수(M) 밑에서 반올림한다.

COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)는 다음과 같다.

     M : -3-2-1 0 1 2 3

ROUND(COLUMN명, M)

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고

소수 3째 자리에서 반올림하시오.

SELECT LAST_NAME, ROUND(SALARY/22, 2)

FROM S_EMP ;


숫자의 절사

지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.

COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.

     M : -3-2-1 0 1 2 3

절사 값은 RETURN 한다.

TRUNC(COLUMN명, M)

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고 

일의 자리는 버림

SELECT LAST_NAME, TRUNC(SALARY/22, -1)

FROM S_EMP ;


나누기의 나머지

M 을 N 으로 나누고 남은 나머지를 RETURN 한다.

MOD(M, N)

[ 예제 ]

10 을 3 으로 나눈 나머지를 구하시오.

SELECT MOD(10, 3)

FROM SYS.DUAL ;


날짜의 연산

DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.

■ CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS

그러므로 산술 연산을 할 수 있다.

● DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.

● DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.

● DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.

날짜 계산을 한다.

DATE + NUMBER

DATE - NUMBER

DATE1 - DATE2

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는 지 검색하시오.

SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE 

FROM S_EMP;

( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )


날짜 사이의 개월 수

두 날짜 사이의 개월 수를 RETURN 한다.

MONTHS_BETWEEN(DATE1, DATE2)

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.

SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)

FROM S_EMP ;

(일이 포함되어 있어서 소수로 출력된다.)


날짜에 달을 더함

날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.

ADD_MONTHS(DATE, N)

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.

SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3)

FROM S_EMP ;


지정한 요일 날짜

날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.

NEXT_DAY(DATE, 'CHAR')

[ 예제 ]

오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.

SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY')

FROM SYS.DUAL ;


그 달의 마지막 날

날짜가 포함된 달의 마지막 날을 RETURN 한다.

LAST_DAY(DATE)

[ 예제 ]

이번 달의 마지막 날은 언제인지 출력하시오.

SELECT SYSDATE, LAST_DAY(SYSDATE)

FROM SYS.DUAL ;


날짜의 반올림

형태에 따른 반올림 기준은 다음과 같다.

? YEAR : 6월 이후

? MONTH : 15일 이후

? DAY : 12시 이후

날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.

ROUND(COLUMN명, '형태')

[ 예제 ]

S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오.

단, 15일 이후는 다음달로 올리시오.

SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH')

FROM S_EMP ;


날짜의 절사

날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.

TRUNC(COLUMN명, '형태')

[ 예제 ]

S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오.

단, 일자는 잘라버리시오.

SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH')

FROM S_EMP ;


문자를 날짜로 변환

CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.

TO_DATE(character_column명, '형태')

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

단, START_DATE 의 값이 92/02/07 인 사원을 검색하시오.

SELECT LAST_NAME, START_DATE

FROM S_EMP

WHERE START_DATE = TO_DATE('92/02/07', 'YY/MM/DD') ;


날짜를 문자로 변환

DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.

이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.

■ 형태를 지정할 때 사용된 대소문자로 출력된다.

■ DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.

■ TO_CHAR 의 결과는 80 자리로 출력된다. 

DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

TO_CHAR(date_column, '형태')

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

단, START_DATE 의 형태는 1991/06/17 14:20:00 와 같이 출력하시오.

SELECT LAST_NAME, TO_CHAR(START_DATE, 'YYYY/MM/DD HH24:MI:SS'), START_DATE

FROM S_EMP ;


숫자를 문자로 변환

NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

TO_CHAR(number_column명, '형태')

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.

단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.

SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999')

FROM S_EMP ;



제 3 장. 여러Table로부터 Data검색

Equijoin

SIMPLE JOIN (EQUI-JOIN)

여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고 

WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.

각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다.

(중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)

N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.

복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.

2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.

SELECT table명.column명, table명.column명...

FROM table1명, table2명 

WHERE table1명.column1명 = table2명.column명 ;

[ 예제 ]

S_EMP TABLE 과 S_DEPT TABLE 을 사용하여 사원들의 LAST_NAME, DEPT_ID,

NAME 을 검색하시오.

SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

FROM S_EMP, S_DEPT

WHERE S_EMP.DEPT_ID = S_DEPT.ID ;


특정 row의 join

JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.

SELECT table명.column명, table명.column명...

FROM table1명, table2명

WHERE table1명.column1명 = table2명.column2명 AND condition ;

[ 예제 ]

S_EMP TABLE과 S_DEPT TABLE 을 사용하여 LAST_NAME 이 Menchu 인 사원의

LAST_NAME, DEPT_ID, NAME 을 검색하시오.

SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

FROM S_EMP, S_DEPT

WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_EMP.LAST_NAME = 'Smith' ;


Table alias

JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.

그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.

(SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서

ALIAS 로 사용하여야 한다.)

TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.

SELECT alias명.column명, alias명.column명

FROM table1명 alias1명, table2명 alias2명

WHERE alias1명.column1명 = alias2명.column2명 ; 

[ 예제 ]

S_CUSTOMER TABLE과 S_REGION TABLE 을 사용하여 고객 명,지역번호,지역 명을 검색하시오.

단, COLUMN ALIAS 와 TABLE ALIAS 를 사용하시오.

SELECT C.NAME "Customer Name", C.REGION_ID "Region Id",

R.NAME "Region Name"

FROM S_CUSTOMER C, S_REGION R

WHERE C.REGION_ID = R.ID ;


Non-Equijoin

NON-EQUIJOIN

JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고 

다른 OPERATOR 가 사용되는 것을 말한다.

SELECT table명.column명, table명.column명...

FROM table1명, table2명

WHERE 조인조건식 ;

[ 예제 ]

EMP TABLE 과 SALGRADE TABLE 을 사용하여 사원의 ENAME, JOB, SAL,GRADE를 검색하시오.

SELECT E.ENAME, E.JOB, E.SAL, S.GRADE 

FROM EMP E, SALGRADE S

WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;

(BETWEEN OPERATOR 대신에 <= 와 >= 를 사용해도 되지만 BETWEEN 이 간편하다.)


Outer Join

두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다. 

그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.

(+) OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.

JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다. 

조건식을 만족시키지 못하는 데이타도 검색한다.

SELECT table명.column명, table명.column명

FROM table1명, table2명

WHERE table1명.column1명 = table2명.column2명(+)

[ 예제 ]

S_EMP TABLE 과 S_CUSTOMER TABLE 을 사용하여 영업사원의 LAST_NAME,

SALES_REP_ID, NAME 을 검색하시오.

단, 영업사원이 정해져 있지 않은 고객의 이름도 검색하시오.


SELECT E.LAST_NAME, C.SALES_REP_ID,

C.NAME

FROM S_EMP E, S_CUSTOMER C

WHERE E.ID(+) = C.SALES_REP_ID ;


Self Join

TABLE 의 ALIAS 를 사용하여, 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다. 

SELECT alias명.column명, alias명.column명...

FROM table명 alias1명, table명 alias2명

WHERE alias1명.column1명 = alias2명.column2명 ;

[ 예제 ]

S_EMP TABLE 에서 사원들의 LAST_NAME 과 그들의 상사 LAST_NAME 을 검색하시오.

SELECT W.LAST_NAME "Woker", 

M.LAST_NAME "Manager"

FROM S_EMP W, S_EMP M

WHERE W.MANAGER_ID = M.ID ;


제 4 장. Group Functions

Group Function

각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.

■ DISTINCT : 중복된 값은 제외한다.

■ ALL : DEFAULT 로써 모든 값을 포함한다.

■ COLUMN명 : NULL 값은 제외한다.

■ * : NULL 값도 포함한다.

TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.

SELECT group_function(column명), group_function(column명)...

FROM table명 ;

[ 예제 ]

S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.

SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY)

FROM S_EMP ;

( COUNT(SALARY) 는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)


소group으로 분리

기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION 이 같이 기술될 수 없다.

SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.

SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며 

GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.

(하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.)

GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다. 

결과는 COLUMN 값으로 SORT 되어서 출력된다. 

1 개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.

SELECT column1명[, column2명], group_function(column명)

FROM table명

GROUP BY column1명[, column2명] ;

[ 예제 ]

S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.

SELECT DEPT_ID, TITLE, 

MAX(SALARY), MIN(SALARY), 

COUNT(SALARY)

FROM S_EMP

GROUP BY DEPT_ID, TITLE;


특정 group의 선택

HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.

① ROW 들이 GROUPing 된다.

② GROUP 에 대해 GROUP FUNCTION 이 적용된다.

③ HAVING 절을 만족하는 GROUP 을 선택한다.

그러므로 GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY

절 다음에 HAVING 절을 기술하는 것이 좋다.

HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다. 

SELECT column1명[, column2명], group_function(column명)

FROM table명

GROUP BY column1명[, column2명] 

HAVING 그룹조건식 ;

[ 예제 ]

S_EMP TABLE 에서 TITLE 별로 급여합계를 검색하시오.

단, 급여합계가 5000 이상인 GROUP 만 출력하시오.

SELECT TITLE, SUM(SALARY) PAYROLL

FROM S_EMP

GROUP BY TITLE

HAVING SUM(SALARY) >= 5000 ;


Group의 정렬

기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.

이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다. 

DATA 의 SORT 순서를 정한다.

SELECT column1명[, column2명], group_function(column명)

FROM table명

GROUP BY column1명[, column2명] 

ORDER BY column명| group_function(column명) ;

[ 예제 ]

S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오.

단, 인원수가 많은 부서부터 출력하시오.

SELECT DEPT_ID, COUNT(*)

FROM S_EMP

GROUP BY DEPT_ID

ORDER BY COUNT(*) DESC ;


제 5 장. Subquery



Single Row Subquery

SUBQUERY 의 결과가 1 개의 ROW 로 나오는 것을 SINGLE ROW SUBQUERY 라 하며 

다음과 같은 OPERATOR 를 사용할 수 있다.

=, >, >=, <, <=

VALUE 값을 구하기 위해 SELECT 문장을 사용한다.

SELECT column명, column명...

FROM table명

WHERE column명 operator (SELECT column명 

FROM table명

WHERE 조건식 );

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원과 같은 업무(TITLE)를 하고 있는 

사원의 LAST_NAME, TITLE 을 검색하시오.

SELECT LAST_NAME, TITLE

FROM S_EMP

WHERE TITLE = 

( SELECT TITLE

FROM S_EMP

WHERE LAST_NAME = 'Smith') ;


From절의 Subquery

FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.

SELECT alias명.column명, alias명,column명...

FROM table1명 alias1명, (SELECT column2명 

FROM table2명

WHERE 조건식) alias2명

WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;

[ 예제 ]

S_EMP TABLE 에서 SALARY 가 회사평균급여 보다 적은 사원의 LAST_NAME,

SALARY, 회사평균급여를 검색하시오.

SELECT E.LAST_NAME, E.SALARY, S.AVGSAL

FROM S_EMP E, 

(SELECT AVG(SALARY) AVGSAL

FROM S_EMP) S

WHERE E.SALARY < S.AVGSAL ;


Multi Row Subquery

SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.

SELECT column명, column명...

FROM table명

WHERE column명 IN ( SELECT column명 

FROM table명

WHERE 조건식);

[ 예제 ]

S_EMP TABLE 과 S_DEPT TABLE 에서 Operations 부서에서 근무하는 사원의

LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

SELECT LAST_NAME, TITLE, DEPT_ID

FROM S_EMP

WHERE DEPT_ID IN (SELECT ID

FROM S_DEPT

WHERE NAME = 'Operations') ;


Multi Column Subquery

SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICAL

OPERATOR 를 사용하여 여러개의 조건식을 기술하여야 한다.

그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.

SELECT column명, column명,,,

FROM table명

WHERE (column명, column명...) IN (SELECT column명, column명...

FROM table명

WHERE 조건식);

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME Patel 인 사원과 같은 부서, 같은 업무를

맡고 있는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

SELECT LAST_NAME, TITLE, DEPT_ID

FROM S_EMP

WHERE (DEPT_ID, TITLE) IN

(SELECT DEPT_ID, TITLE

FROM S_EMP

WHERE LAST_NAME = 'Patel') ;

SELECT LAST_NAME, TITLE, DEPT_ID

FROM S_EMP

WHERE (DEPT_ID) IN

(SELECT DEPT_ID

FROM S_EMP

WHERE LAST_NAME = 'Patel') 

OR (TITLE) IN

(SELECT TITLE

FROM S_EMP

WHERE LAST_NAME = 'Patel') ;


제 6 장. Table 생성



이름 붙이는 법

이름은 다음의 규칙을 따라서 지정한다. 

■ TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다. 

■ A ~ Z, a ~ z, 0 ~ 9, _ , $ , # 을 사용할 수 있다. 

■ 한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다. 

■ ORACLE7 SERVER 예약어를 사용할 수 없다. 

■ 대소문자를 구별하지 않는다. 


Oracle 7 datatype

COLUMN 의 DATATYPE 은 다음과 같다. 

■ CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다. 

■ VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다. 

■ LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다. 

■ NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다. 

■ DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다. 

■ RAW(size) : size 내에서의 가변길이 BINARY DATA 

■ LONGRAW : 가변길이 BINARY DATA 


다른 table로부터 table생성

기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.

CREATE TABLE table명 [(column명, column명...)]

AS subquery ;

[ 예제 ]

S_EMP TABLE 에서 DEPT_ID 가 41 인 사원들의 ID, LAST_NAME, USERID,

START_DATE 만을 복사하여 EMP_41 TABLE 을 생성하시오.

CREATE TABLE EMP_41

AS SELECT ID, LAST_NAME, USERID, START_DATE

FROM S_EMP

WHERE DEPT_ID = 41;

(S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며, 데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)


Constraint

CONSTRAINT 의 종류는 다음과 같다. 

■ NOT NULL

COLUMN 에 NULL 값이 입력되는 것을 허용하지 않는다.

COLUMN-CONSTRAINT 로만 기술해야 한다.

■ UNIQUE

한 개의 COLUMN 혹은 복합 COLUMN 을 UNIQUE KEY 로 지정한다.

UNIQUE KEY 에는 중복된 값을 허용하지 않는다.

한개의 COLUMN 으로 구성된 UNIQUE KEY 는 NULL 값을 허용한다.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

복합 COLUMN 으로 구성된 UNIQUE KEY 는 TABLE-CONSTRAINT 로만 기술해야 한다.

UNIQUE KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.

■ PRIMARY KEY

ROW 를 UNIQUE 하게 대표할 수 있는 한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.

PRIMARY KEY 에는 중복된 값과 NULL 값을 허용하지 않는다.

TABLE 당 한 개의 PRIMARY KEY 만 지정할 수 있다.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

복합 COLUMN 으로 구성된 PRIMARY KEY 는 TABLE-CONSTRAINT 로만 기술해야 한다.

PRIMARY KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.

■ FOREIGN KEY 

한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.

같은 TABLE 혹은 다른 TABLE의 PRIMARY KEY 나 UNIQUE KEY 값을 참조한다.

FOREIGN KEY 값은 모 TABLE 에 존재하는 데이타와 같던가 NULL 값을 허용한다.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

※ CHECK : 각각의 ROW 가 만족해야할 조건을 지정한다.

조건식은 QUERY 조건식과 동일하게 지정한다. 

단, 다음과 같은 것은 사용할 수 없다.

CURRVAL, NEXTVAL, LEVEL, ROWNUM, SYSDATE, USER COLUMN 이나

TABLE-CONSTRAINT 로 기술할 수 있다.

CONSTRAINT 명은 다음과 같이 지정한다. 

? CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다. 

? 일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다. 

? 사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다. 

? 동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다. 

CONSTRAINT 는 다음과 같이 기술할 수 있다. 

COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류

TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류

(column명, column명..) 


Table 생성

CREATE TABLE table명

(column명 type(size) [DEFAULT VALUE] [column constraint],

column명 type(size) [DEFAULT VALUE] [column constraint],

.... ,

[table constraint] ,

[table constraint] ,

.... ) ;

[ 예제 ]

S_EMP TABLE CHART를 보고 TABLE 을 생성하시오.

단, TABLE CONSTRAINT 로 기술할 수 있는 것은 TABLE CONSTRAINT 로 정의하시오.

CREATE TABLE S_EMP

(ID NUMBER(7),

LAST_NAME VARCHAR2(25) CONSTRAINT S_EMP_LAST_NAME_NN NOT NULL,

FIRST_NAME VARCHAR2(25),

USERID VARCHAR2(8) CONSTRAINT S_EMP_USERID_NN NOT NULL,

START_DATE DATE DEFAULT SYSDATE,

COMMENTS VARCHAR2(25),

MANAGER_ID NUMBER(7),

TITLE VARCHAR2(25),

DEPT_ID NUMBER(7),

SALARY NUMBER(11,2),

COMMISSION_PCT NUMBER(4,2),

CONSTRAINT S_EMP_ID_PK PRIMARY KEY(ID),

CONSTRAINT S_EMP_USERID_UK UNIQUE,

CONSTRAINT S_EMP_DEPT_ID_FK FOREIGN KEY(DEPT_ID)

REFERENCES S_DEPT(ID),

CONSTRAINT S_EMP_COMMISSION_PCT CHECK

(COMMISSION_PCT IN (10, 12.5, 15, 17.5, 20))) ;


제 7 장. Data DICTIONARY



DICTIONARY

? DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다. 

? DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다. 

? 사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다. 

? DICTIONARY TABLE 은 SYS USER 의 소유다. 

? DICTIONARY TABLE 의 값은 대문자로 들어있다. 

? DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.

SELECT   *

FROM    DICTIONARY ; 

DICTIONARY TABLE 의 종류는 다음과 같다. 

? USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다. 

? ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다. 

? DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다. 


활용예

DICTIONARY TABLE 의 검색예는 다음과 같다. 

■ 자신이 갖고 있는 TABLE 의 이름을 검색한다.

SELECT   OBJECT_NAME

FROM    USER_OBJECTS

WHERE   OBJECT_TYPE = 'TABLE';

■ 자신이 갖고 있는 OBJECT 의 종류를 검색한다.

SELECT   DISTINCT OBJECT_TYPE

FROM   USER_OBJECTS;

■ GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.

SELECT   TABLE_NAME

FROM   DICTIONARY

WHERE   UPPER(COMMENTS) LIKE '%GRANT%';

■ S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.

SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION,

R_CONSTRAINT_NAME

FROM   USER_CONSTRAINTS

WHERE   TABLE_NAME = 'S_EMP';

■ S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.

SELECT   CONSTRAINT_NAME, COLUMN_NAME

FROM   USER_CONS_COLUMNS

WHERE   TABLE_NAME = 'S_EMP';


제 8 장. Data 조작



데이타 입력

TABLE 전체 COLUMN 에 값을 입력한다.

INSERT INTO table명

VALUES (value, value...);

[ 예제 ]

S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 26, LAST_NAME : Jung Mi, FIRST_NAME : Hong, USERID : Hjungmi,

START_DATE : 05-APR-97, COMMENTS : Teacher, MANAGER_ID : 10,

TITLE : Stock Clerk, DEPT_ID : 45, SALARY : 1200 COMMISSION_PCT : 10

INSERT INTO S_EMP

VALUES (26, 'Jung Mi', 'Hong', 'Hjungmi', '05-APR-97',

'Teacher', 10, 'Stock Clerk', 45, 1200, 10) ;

(값을 지정하는 순서는 TABLE 의 COLUMN 순서에 맞춰서 지정한다.

이 방법보다는 COLUMN명을 기술하여 입력하는 방법이 더 좋다.)


특정 column에 데이타입력

데이타를 입력하고자 하는 COLUMN을 선택하여 입력한다.

INSERT INTO table명(column명, column명....)

VALUES (value, value....);

[ 예제 ]

S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 27, LAST_NAME : Smith, FIRST_NAME : Donna, START_DATE : 05-APR-97

INSERT INTO S_EMP(ID, LAST_NAME, FIRST_NAME, START_DATE)

VALUES (27, 'Smith', 'Donna', '05-APR-97') ;


Null, 특수 value 입력

COLUMN 값에 NULL 값을 지정하는 방법은 3 가지가 있다.

? INSERT 문장의 COLUMN LIST 에서 생략한다.

? INSERT 문장의 VALUE 절에서 NULL 로 지정한다.

? INSERT 문장의 VALUE 절에서 '' 로 지정한다.

COLUMN 값에 특수한 값을 입력할 수 있다.

SYSDATE : 현재날짜와 시간

USER : 현재 USERID

[ 예제 ]

S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 29, LAST_NAME : Donna, USERID : USER, SALARY : NULL, START_DATE : SYSDATE

INSERT INTO S_EMP(ID, LAST_NAME, USERID, SALARY, START_DATE)

VALUES (29, 'Donna', USER, NULL, SYSDATE);


특수형태의 날짜/시간입력

DATE 값을 입력할 때는 지정된 DATE 형태로 입력하여야 한다.

일반적으로 DD-MON-YY 형태를 사용하며, 이 형태로 데이타를 입력하면 세기는 현재의 세기로, 시간은 자정으로 입력된다.

다른 세기의 날짜나 시간을 입력하고 싶으면 TO_DATE FUNCTION 을 사용한다.

지정된 형태가 아닌 다른 형태의 날짜 값을 입력한다.

TO_DATE('날짜값','날짜형태')

[ 예제 ]

S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 30, LAST_NAME : Donna, USERID : SQL01, START_DATE : 199704051400

INSERT INTO S_EMP(ID, LAST_NAME, USERID, START_DATE)

VALUES (30, 'Donna', 'SQL01', TO_DATE('199704051400','YYYYMMDDHH24MI'));


다른table로부터 데이타입력

INSERT 문장을 사용하여 기존하는 TABLE 의 데이타를 다른 TABLE 로 COPY 할 수 있다.

INSERT INTO table명[(column명, column명...)]

SUBQUERY;

[ 예제 ]

S_EMP TABLE 의 ROW들을 HISTORY TABLE 로 COPY 하시오.

단, 01-JAN-94 이전에 입사한 사원의 ID,LAST_NAME,SALARY,START_DATE 를 COPY 하시오

INSERT INTO HISTORY(ID, LAST_NAME, SALARY, START_DATE)

SELECT ID, LAST_NAME, SALARY, START_DATE

FROM S_EMP

WHERE START_DATE < '01-JAN-94' ;

(INSERT 절의 COLUMN 수와 SELECT 절의 COLUMN 수는 같아야 한다.)


데이타 수정

UPDATE 문장을 사용하여 이미 존재하는 COLUMN 값을 수정한다.

UPDATE table명

SET column명 = value, [column명 = value]

[WHERE 조건식] ;

[ 예제 ]

S_EMP TABLE 에서 ID 가 1 인 사원의 데이타를 다음과 같이 수정하시오.

DEPT_ID : 32, SALARY : 2550 

UPDATE S_EMP

SET DEPT_ID = 32, SALARY = 2550

WHERE ID = 2 ;


데이타 삭제

DELETE 문장을 사용하여 데이타를 삭제한다.

DELETE FROM table명

[WHERE 조건식] ;

[ 예제 ]

S_EMP TABLE에서 ID 가 20 보다 큰 사원을 삭제하시오. 

DELETE FROM S_EMP

WHERE ID > 20 ;


저장

COMMIT 문장(COMMIT;)에 의해 변경된 모든 내용이 DATABASE 에 저장된다.

변경된 모든 데이타는 DATABASE 에 저장된다. 

그 전의 데이타는 완전히 없어진다.

모든 사용자가 변경한 내용을 볼 수 있다.

변경된 ROW 에 걸려있던 LOCK 이 해제된다.

그러므로 다른 사용자가 수정할 수 있다.

모든 SAVEPOINT 가 없어진다. 

TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 저장한다.


취소

ROLLBACK 문장(ROLLBACK)을 사용하여 모든 변경된 내용을 취소한다.

모든 변경이 취소되며 수정하기 전의 데이타가 복구된다.

변경된 ROW 에 걸려있던 LOCK 이 해제된다.

다른 사용자들이 그 ROW 에 대해서 변경을 할 수 있다. 

TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 취소한다.


Savepoint지정~취소

TRANSACTION 안에서 ROLLBACK 할 수 있는 POINT 를 지정한다.

지정된 POINT 까지만 ROLLBACK 한다.

SAVEPOINT savepoint명 ;

ROLLBACK TO savepoint명 ;

[ 예제 ]

S_EMP TABLE 에서 TITLE 이 Stock Clerk 인 사원의 SALARY 를 10% 인상하시오.

SAVEPOINT 를 지정하시오.

S_REGION TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 8, NAME : Central

SAVEPOINT 까지 ROLLBACK 하시오.

UPDATE 결과를 저장하시오.

UPDATE S_EMP

SET SALARY = SALARY * 1.1

WHERE TITLE = 'Stock Clerk' ;

SAVEPOINT S1;

INSERT INTO S_REGION(ID, NAME)

VALUES (8, 'Central') ;

ROLLBACK TO S1;

COMMIT;



제 9 장. Table변경/삭제



Column 추가

TABLE 에 새로운 COLUMN 을 추가한다.

ALTER TABLE table명

ADD (column명 type(size) [DEFAULT value] [column_constraint],

...........) ;

[ 예제 ]

S_REGION TABLE 에 다음과 같은 COLUMN 을 추가하시오.

COMMENTS VARCHAR2(25)

ALTER TABLE S_REGION

ADD (COMMENTS VARCHAR2(25)) 

(추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)


Column 변경

ALTER TABLE 문장의 MODIFY 절을 사용하여 다음과 같은 변경을 할 수 있다.

COLUMN 의 크기를 확장할 수 있다.

데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다.

데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.

COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다.

DEFAULT VALUE 를 변경할 수 있다. 

이미 생성되어 있는 COLUMN 을 변경한다.

ALTER TABLE table명

MODIFY (column명 type(size) [DEFAULT value] [NOT NULL],

.............) ;


Constraint 추가

이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.

ALTER TABLE table명

ADD (table_constraint) ;

[ 예제 ]

S_EMP TABLE 에 다음과 같은 CONSTRAINT 를 추가하시오.

MANAGER_ID COLUMN 이 S_EMP TABLE 의 ID COLUMN 을 REFERENCE 하는

FOREIGN KEY CONSTRAINT 를 추가하시오.

ALTER TABLE S_EMP

ADD (CONSTRAINT S_EMP_MANAGER_ID_FK FOREIGN KEY(MANAGER_ID)

REFERENCES S_EMP(ID)) ;


Constraint 삭제

이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.

ALTER TABLE table명

DROP PRIMARY KEY |

UNIQUE(column명) |

CONSTRAINT constraint명 [CASCADE] ;

[ 예제 ]

S_EMP TABLE 의 다음과 같은 CONSTRAINT 를 삭제하시오.

MANAGER_ID COLUMN 의 FOREIGN KEY CONSTRAINT 

ALTER TABLE S_EMP

DROP CONSTRAINT S_EMP_MANAGER_ID_FK ;


전체 데이타의 삭제

TRUNCATE 문장은 DDL 이다.

ROLLBACK SEGMENT 를 만들지 않고 모든 데이타를 삭제한다.

데이타가 삭제된 FREE 영역은 환원된다. 

TABLE 로부터 모든 데이타를 삭제한다.

TRUNCATE TABLE table명 ;

[ 예제 ]

S_ITEM TABLE 의 모든 데이타를 삭제하시오.

TRUNCATE TABLE S_ITEM ;


Constraint disable/enable

TABLE 에 있는 모든 데이타가 CONSTRAINT 를 만족시켜야 ENABLE 할 수 있다.

PRIMARY KEY, UNIQUE CONSTRAINT 를 ENABLE 하면 그에 따른 INDEX FILE 이 자동적으로 생성된다.

CASCADE OPTION 은 FOREIGN KEY CONSTRAINT 를 DISABLE 할 때 사용한다. 

CONSTRAINT 를 삭제하고 새로 만들지 않고 DISABLE, ENABLE 한다.

ALTER TABLE table명

DISABLE | ENABLE PRIMARY KEY |

UNIQUE(column명) |

CONSTRAINT constraint명 [CASCADE] ;

[ 예제 ]

S_DEPT TABLE 의 PRIMARY KEY CONSTRAINT 를 DISABLE 시키시오.

ALTER TABLE S_DEPT

DISABLE CONSTRAINT S_DEPT_ID_PK CASCADE;

S_EMP TABLE 의 S_EMP_DEPT_ID_FK CONSTRAINT 도 자동적으로 DISABLE 된다.


Table 삭제

TABLE 을 삭제하면 그 TABLE 에 딸린 INDEX FILE 도 삭제된다.

VIEW, SYNONYM, STORED PROCEDURE, FUNCTION, TRIGGER 등은 삭제되지 않는다.

CASCADE CONSTRAINTS 는 모 TABLE 을 삭제하고 자 TABLE 의 FOREIGN KEY CONSTRAINT 도 삭제한다. 

DROP TABLE table명 [CASCADE CONSTRAINTS] ;

[ 예제 ]

S_DEPT TABLE 을 삭제하시오.

DROP TABLE S_DEPT CASCADE CONSTRAINTS ;


이름의 변경

TABLE, VIEW, SEQUENCE, SYNONYM 의 이름을 변경한다. 

RENAME old명 TO new명 ;

[ 예제 ]

S_ORD TABLE 의 이름을 S_ORDER 로 변경하시오.

RENAME S_ORD TO S_ORDER ;


제 10 장. Sequence



Sequence 생성

SEQUENCE 는 여러 사용자에게 UNIQUE 한 값을 생성해 주는 OBJECT 이다.

SEQUENCE 를 사용하여 PRIMARY KEY 값을 자동적으로 생성한다.

CREATE SEQUENCE sequence명

INCREMENT BY n

START WITH n

MAXVALUE n | NOMAXVALUE

MINVALUE n | NOMINVALUE

CYCLE | NOCYCLE

CACHE n | NOCACHE ;

[ 예제 ]

S_DEPT TABLE 의 ID COLUMN 값에 사용할 SEQUENCE 를 다음과 같이 생성하시오.

START : 51, INCREMENT : 1, MAXVALUE : 9999999, NOCYCLE, NOCACHE

CREATE SEQUENCE S_DEPT_ID

INCREMENY BY 1

START WITH 51

MAXVALUE 9999999

NOCACHE

NOCYCLE ;


Sequence 변경

SEQUENCE 에 정의된 값을 변경한다.

ALTER SEQUENCE sequence명

INCREMENT BY n

MAXVALUE n | NOMAXVALUE

MINVALUE n | NOMINVALUE

CYCLE | NOCYCLE

CACHE n | NOCACHE ;

[ 예제 ]

S_DEPT_ID SEQUENCE 를 다음과 같이 수정하시오.

CACHE : 10

ALTER SEQUENCE S_DEPT_ID

CACHE 10 ;


Sequence 삭제

SEQUENCE 를 삭제한다.

DROP SEQUENCE sequence명 ;

[ 예제 ]

S_DEPT_ID SEQUENCE 를 삭제하시오.

DROP SEQUENCE S_DEPT_ID ;


제 11 장. VIEW


Simple view

SUBQUERY 문장이 간단한 경우 VIEW 를 통해 SELECT,INSERT,UPDATE,DELETE 를 할 수 있다.

■ SELECT : SUBQUERY 의 조건식을 만족하는 데이타만 검색된다.

■ INSERT : NOT NULL COLUMN 을 다 포함하고 있는 경우 INSERT 를 할 수 있다.

SUBQUERY 의 조건식을 만족하지 않는 데이타도 입력이 가능하다.

■ UPDATE : VIEW 를 통해 SELECT 할 수 있는 데이타만 수정할 수 있다.

SUBQUERY 의 조건식을 만족하지 않는 데이타도 수정이 가능하다.

■ DELETE : VIEW 를 통해 SELECT 할 수 있는 데이타만 삭제할 수 있다. 

CREATE VIEW view명 [(alias명, alias명....)]

AS SUBQUERY ;

[ 예제 ]

S_EMP TABLE 에서 DEPT_ID 가 45 인 사원의 ID, LAST_NAME, DEPT_ID, TITLE 을 

선택해서 VIEW 를 생성하시오. 

CREATE VIEW EMP41

AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

FROM S_EMP

WHERE DEPT_ID = 45 ;


With check option

VIEW 를 정의할때 지정한 조건식을 만족하는 데이타만 INSERT, 또는 조건식을 만족하는 데이터로만 UPDATE 가 가능하다. 

데이타가 VIEW 의 조건식을 만족하는지 CHECK 한다.

CREATE VIEW view명 [ (alias명, alias명...)]

AS SUBQUERY

WITH CHECK OPTION ;

[ 예제 ]

S_EMP TABLE 에서 DEPT_ID 가 45 인 사원의 ID, LAST_NAME, DEPT_ID, TITLE

을 선택해서 VIEW 를 생성하시오.

단, DEPT_ID 가 45 가 아닌 사원은 입력되지 못하게 만드시오.

CREATE VIEW EMP45

AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

FROM S_EMP

WHERE DEPT_ID = 45

WITH CHECK OPTION ; 


With read only

SELECT만 가능한 VIEW 를 생성한다.

CREATE VIEW view명 [(alias명, alias명...)]

AS SUBQUERY

WITH READ ONLY ;

[ 예제 ]

S_EMP TABLE 에서 ID, LAST_NAME, DEPT_ID, SALARY 가 SELECT 만 되도록 VIEW 를 생성

CREATE VIEW R_EMP

AS SELECT ID, LAST_NAME, SALARY

FROM S_EMP

WITH READ ONLY ;


Force

기준 TABLE 이 존재하지 않아도 VIEW 를 생성한다.

CREATE FORCE VIEW view명 [(alias명, alias명...)]

AS SUBQUERY ;

[ 예제 ]

S_EMP TABLE 이 없어도 S_EMP TABLE 에서 ID, LAST_NAME, SALARY 를 선택해서

VIEW 를 생성하시오.

CREATE FORCE VIEW T_EMP

AS SELECT ID, LAST_NAME, SALARY

FROM S_EMP ;


complex view

SUBQUERY 문장에 JOIN, FUNCTION, DISTINCT 또는 연산이 포함된 경우를 말하며 이 경우 VIEW 를 통한 DML 은 수행할 수 없다. 

COMPLEX VIEW 를 생성한다.

CREATE VIEW view명 (alias명, alias명...)

AS SUBQUERY ;

[ 예제 ]

S_EMP TABLE 과 S_DEPT TABLE 에서 ID, LAST_NAME, DEPT_ID, NAME 을

선택해서 VIEW 를 생성하시오.

CREATE VIEW EMPDEPT

AS SELECT E.ID, E.LAST_NAME, E.DEPT_ID, D.NAME

FROM S_EMP E, S_DEPT D

WHERE E.DEPT_ID = D.ID ;


View 삭제

VIEW 를 삭제하면 DATABASE 로부터 VIEW 의 정의가 삭제된다. 

VIEW 가 기초로 한 TABLE 은 삭제되지 않는다.

DROP VIEW view명 ;

[ 예제 ]

EMPDEPT VIEW 를 삭제하시오.

DROP VIEW EMPDEPT ;


제 12 장. Index


Index 생성

TABLE 생성시 PRIMARY KEY 나 UNIQUE CONSTRAINT 를 지정하면 UNIQUE INDEX 가 자동적으로 만들어 진다.

이 외의 COLUMN 으로 QUERY 를 할 때 속도를 향상시키기 위해서 INDEX 를 생성한다.

INDEX 를 생성하면 QUERY 속도는 빨라질 수 있으나 DML 속도는 늦어질 수 있다.

일반적으로 다음과 같은 경우에 INDEX 를 생성한다.

■ COLUMN 이 WHERE 절이나 JOIN 조건식에 빈번하게 사용될 때

■ COLUMN 값이 넓게 분포되어 있을 때

■ COLUMN 값에 NULL 값이 많이 포함되어 있을 때

■ TABLE 이 크고 QUERY 하는 데이터 양이 10 % 이하일 때 

CREATE [UNIQUE] INDEX index명

ON table명(column명[, column명...]) ; 

[ 예제 ]

S_EMP TABLE 에서 LAST_NAME 의 QUERY 속도를 향상하기 위하여 INDEX 를 생성하시오.

CREATE INDEX S_EMP_LAST_NAME_IDX

ON S_EMP(LAST_NAME) ;


Index 삭제

INDEX 는 수정할 수 없다. 수정하고 싶은 경우 삭제하고 다시 생성한다.

DROP INDEX index명 ;

[ 예제 ]

S_EMP_LAST_NAME_IDX INDEX 를 삭제하시오.

DROP INDEX S_EMP_LAST_NAME_IDX ;

 

덧글쓰기 | 엮인글 쓰기 이 포스트를..  

 

 

               오라클 자바 기초를 튼튼히!! ORACLE 간단한 SQL 명령어   

               오라클 자바 기초를 튼튼히!! ORACLE 간단한 SQL 명령어       

 전체 포스트 보기   

▼ 다음글 - PL/SQL syntax 정리  


반응형