2021년 11월 6일 토요일

오라클 테이블 생성, CREATE TABLE, 이론 및 실습

 

오라클 테이블 생성, CREATE TABLE, 이론 및 실습

10.2. 테이블 생성


테이블을 생성하려면 CREATE TABLE 시스템 권한과, 테이블스페이스에 저장할 권한 또는 UNLIMITED TABLESPACE 시스템 권한이 있어야 합니다. 


테이블 생성은 테이블에 대한 구조(컬럼 및 데이터타입, 제약조건)를 정의하고 저장공간을 할당하는 과정입니다. 테이블을 생성하려면 DDLdata definition language 명령인 CREATE TABLE 명령을 사용합니다.


[기본형식]

CREATE [GLOBAL TEMPORARY] TABLE [SCHEMA.]table_name

(

   column1 datatype [ DEFAULT expr ][constraints],

   column2 datatype [ DEFAULT expr ][constraints],

...

);


  • GLOBAL TEMPORARY : 임시 테이블. 구조는 모든 세션에서 볼 수 있지만 데이터는 임시 테이블을 생성한 세션에서만 확인할 수 있습니다.

  • SCHEMA : 오라클사용자 계정

  • table_name : 생성하고자 하는 테이블 이름

  • column1, column2 : 열 이름

  • datatype : 열 데이터 타입

  • DEFAULT expr : 열에 값이 입력되지 않는 경우 컬럼 기본값 지정

  • constraints : 컬럼의 제약조건(NOT NULL, CHECK, PRIMARY KEY 등)


실습


테이블 생성을 위한 기본 문법을 바탕으로 컬럼의 데이터 타입을 정의하면서 실제 테이블을 생성하여 보겠습니다. 


NAME, ADDRESS, AGE 컬럼을 가지는 ADDRBOOK1 테이블을 생성하세요.


  • NAME 컬럼은 VARCHAR2(10),  not null 제약조건을 사용

  • ADDRESS 컬럼은 VARCHAR2(50)

  • AGE 컬럼은 NUMBER(3), 기본값을 0으로


CREATE TABLE ADDRBOOK1 (

   NAME     VARCHAR2(10) NOT NULL,

   ADDRESS VARCHAR2(50),

   AGE        NUMBER DEFAULT 0

);


<실행결과>

Table ADDRBOOK1이(가) 생성되었습니다.

실습


CREATE TABLE 명령에 어느 테이블스페이스에 생성할 것인지 옵션을 주지 않으면 해당 사용자의 기본 테이블스페이스에 테이블을 만듭니다. 물론 사용자 생성 시 기본 테이블스페이스를 지정하지 않았다면 오라클 12C 이상에서는 USERS 테이블스페이스가 기본적으로 할당됩니다. 현재 접속한 사용자인 SCOTT 사용자도 생성 시 기본 테이블스페이스를 지정하지 않았으므로 USER 테이블스페이스에 테이블이 생성됩니다.


USER_TABLES 딕셔너리뷰를 통해  현재 사용자가 소유(작성)한 테이블의 목록을 확인 할 수 있습니다. 


USER_TABLES 딕셔너리 뷰를 통해 ADDRBOOK1 테이블이 어느 테이블스페이스에 생성 되었는지 확인 합시다.


SELECT TABLE_NAME

            ,  TABLESPACE_NAME 

FROM     USER_TABLES

WHERE TABLE_NAME = 'ADDRBOOK1';


<실행결과>

 

TABLE_NAME

TABLESPACE_NAME

1

ADDRBOOK1

USERS


실습


TAB 뷰를 통해서도 테이블 정보 조회가 가능한데, TAB 은 현재 사용자가 소유 한 테이블, 뷰 및 동의어에 대한 정보를 제공합니다. 


ADDRBOOK1 테이블이 어느 테이블스페이스에 생성 되었는지 조회해 봅시다.


SELECT TNAME

            ,  TABTYPE

FROM    TAB 

WHERE TNAME = 'ADDRBOOK1';


<실행결과>

 

TNAME

TABTYPE

1

ADDRBOOK1

TABLE


TAB 뷰를 이용한 테이블 정보 조회시 주의 할 부분이 있는데요, 오라클에서 휴지통(리사이클빈) 기능이 활성화 될 경우  테이블이 삭제되면 휴지통(리사이클빈)에 들어 가는데 이름이 ‘BIN$M+6XUqkuTSqHmaL81Olcgg==$0’ 식으로 변형되어 들어 갑니다. TAB 뷰는 이런것 들도 조회된다는 것 입니다. 이런 것들이 보이면 놀라지 마시고 “삭제된 테이블 이구나” 라고 이해해 주세요. 

실습


USER_CATALOG 딕셔너리 뷰는 상점에서 물건을 진열하듯이 현재 사용자가 소유 한 테이블,  인덱스,뷰, 클러스터, 동의어 및 시퀀스를 나열 합니다.  ALL_CATALOG는 USER_CATALOG와 통일한 컬럼을 가지며 사용자가 접근 가능한 것들을 나열 합니다.


USER_CATALOG에서 ADDRBOOK1 테이블을 조회 합니다.


SELECT   *

FROM      USER_CATALOG 

WHERE   TABLE_NAME = 'ADDRBOOK1';


<실행결과>

 

TABLE_NAME

TABLE_TYPE

1

ADDRBOOK1

TABLE


실습

DESC 명령으로 생성된 테이블 구조를 확인할 수 있습니다..


DESC ADDRBOOK1;


<실행결과>

이름               널?                  유형           

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

NAME          NOT NULL    VARCHAR2(10) 

ADDRESS                         VARCHAR2(50) 

AGE             NUMBER


실습

실무에서 테이블이 어떤 컬럼으로 구성되어 있는지를 확인하는 것은 아주 중요합니다. 개발을 하거나쿼리를 작성할 때 그걸 모르고서는 어렵습니다. 아래 3개의 쿼리 문장은 테이블의 컬럼의 구조를 확인할 수 있는 쿼리문으로 결과는 동일 합니다. 하지만 가장 편하고 간단히 사용하는 것은 위 DESC 구문 입니다.


USER_TAB_COLUMNS, USER_TAB_COLS, COLS  뷰를 통해서도 생성된 테이블 구조를 확인할 수 있습니다.


SELECT TABLE_NAME

        ,  COLUMN_NAME

        ,  DATA_TYPE

        ,  DATA_LENGTH

        ,  NULLABLE

        ,  DATA_DEFAULT

FROM   USER_TAB_COLUMNS

WHERE TABLE_NAME = 'ADDRBOOK1';


SELECT TABLE_NAME

        ,  COLUMN_NAME

        ,  DATA_TYPE

        ,  DATA_LENGTH

        ,  NULLABLE

        ,  DATA_DEFAULT

FROM   USER_TAB_COLS

WHERE TABLE_NAME = 'ADDRBOOK1';


SELECT TABLE_NAME

        ,  COLUMN_NAME

        ,  DATA_TYPE

        ,  DATA_LENGTH

        ,  NULLABLE

        ,  DATA_DEFAULT

FROM   COLS

WHERE TABLE_NAME = 'ADDRBOOK1';



<실행결과>

 

TABLE_NAME

COLUMN_NAME

DATA_TYPE

DATA_LENGTH

NULLABLE

DATA_DEFAULT

1

ADDRBOOK1

NAME

VARCHAR2

10

N


2

ADDRBOOK1

ADDRESS

VARCHAR2

50

Y


3

ADDRBOOK1

AGE

NUMBER

22

Y

0


USER_TAB_COLUMNS, USER_TAB_COLS, COLS 컬럼을 확인하는 뷰는 일반적인 컬럼에서는 같습니다. 반면 Virtual Column, Unued Column을 확인할 때는 조금 차이가 있습니다. 테이블에 사용 안 한다고 정의한 컬럼(Unused Column)이 있으면 해당 컬럼을 USER_TAB_COLS는 보여주지만 USER_TAB_COLUMNS, COLS는 보여주지 않습니다. 


USER_TAB_COLS는 HIDDEN_COLUMN 외에 컬럼 4개를 더 가지고 있어 더 정교한 컬럼 정보를 보여줍니다. 


COLS와 USER_TAB_COLUMNS는 실제 USER_TAB_COLUMNS 테이블과 동의어입니다. 정말로 같은지 쿼리문을 실행해 확인해보겠습니다.


SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME

FROM    ALL_SYNONYMS

WHERE SYNONYM_NAME IN ('COLS', 'USER_TAB_COLS', 'USER_TAB_COLUMNS')

ORDER BY TABLE_NAME;


<실행결과>

 

SYNONYM_NAME

TABLE_OWNER

TABLE_NAME

1

USER_TAB_COLS

SYS

USER_TAB_COLS

2

USER_TAB_COLUMNS

SYS

USER_TAB_COLUMNS

3

COLS

SYS

USER_TAB_COLUMNS


SYNONYMN_NAME 컬럼은 동의어를 나타내는데 ❶, ❷에서 USER_TAB_COLUMNS, COLS 두 동의어의 실제 테이블인 TABLE_NAME 컬럼의 값은 USER_TAB_COLUMNS로 통일 합니다. 즉 COLS, USER_TAB_COLUMNS는 동일한 것 입니다.

 

#테이블생성, #CREATETABLE, #ORACLE, #오라클, #오라클테이블, #오라클강좌​

ORACLE 테이블 이해를 위한 오라클 구조, 오라클 논리적, 물리적 구성 요소, 테이블스페이스, 데이터파일

 

ORACLE 테이블 이해를 위한 오라클 구조, 오라클 논리적, 물리적 구성 요소, 테이블스페이스, 데이터파일

10.1. 테이블 이해를 위한 오라클 구조


오라클 데이터베이스의 구조는 크게 논리적 구성 요소와 물리적  구성 요소로 나누어 볼 수 있습니다.


10.1.1 오라클 논리적 구성 요소


논리적 구성 요소는 데이터 블록data blocks, 확장 영역extents, 세그먼트segments, 테이블스페이스tablespace, 데이터베이스database로 나눌 수 있습니다. 


데이터 블록은 데이터를 저장하는 최소 논리 단위로서, 논리 블록logical block, 페이지page등으로 불립니다. 즉 오라클 데이터베이스에 데이터를 쓰고, 읽는 동작의 최소 단위를 말합니다. 데이터 블록 크기는 운영체제 블록 크기의 배수로 해야 불필요한 I/O를 방지할 수 있습니다. 


확장 영역은 특정 유형 정보를 저장하는 목적으로 할당된 논리적으로 연속적인 데이터 블록 세트(집합)입니다. 확장 영역 집합이 세그먼트가 되는데 테이블은 데이터 세그먼트data segments이고, 인덱스는 인덱스 세그먼트index segments입니다. 



사원emp 테이블의 실제 데이터는 자체 데이터 세그먼트에 저장되는 반면, 인덱스는 인덱스 세그먼트에 저장됩니다. 물리적으로 다른 곳에 저장된다는 것 잊지 마세요.


이러한 세그먼트가 여러 개 모여서 테이블스페이스를 이루고 이들이 모여서 데이터베이스를 논리적으로 구성하게 됩니다. SQL 개발자 관점에서 데이터의 입/출력은 테이블 단위로 이루어 지고 이 테이블은 반드시 하나의 테이블스페이스에 속하게 됩니다.


데이터베이스는 테이블스페이스라고 하는 논리적인 스토리지 단위로 나뉘어 지고 테이블 스페이스는 세그먼트 라고하는 논리적 스토리지 단위로 나뉘며, 확장 영역으로 더 나뉩니다. 확장 영역은 연속 된 블록의 모음입니다.


테이블스페이스는 하나 이상의 물리적인 오라클 데이터 파일로 이루어 집니다.



10.1.2 오라클 물리적 구성 요소


오라클 데이터베이스의 물리적 구성 요소로 프로세스, 메모리, 파일이 있습니다. 오라클의 파일은 실제 데이터가 저장되는 데이터 파일data file, 장애가 발생했을 때 복구용으로 활용하는 리두 로그 파일redo log file, 데이터 파일과 리두 로그 파일의 위치를 가지고 있는 컨트롤 파일control file, 데이터베이스 파라미터를 저장하는 파라미터 파일parameter file 등이 있습니다.


이러한 논리적 구성 요소 및 물리적 구성 요소는 데이터베이스 관리자의 영역이므로 자세히 설명 드리지는 않겠습니다. 하지만 개발자 및 기본 SQL 사용자들도 테이블스페이스와 데이터 파일 정도는 알아두시면 좋습니다.


다음은 논리적 구성 요소와 데이터 파일의 관계입니다.


<그림/>

sNR6U3gO8NnxAHH3QEFjP1pQzUjMuLschgJKZbsr


다음그림은 사원 테이블이 데이터 파일 2개에 나뉘어져 있고, 첫 번째 데이터 파일에는 확장 영역이 1개, 두 번째 데이터 파일에는 2개가 있고, 각 확장 영역에는 데이터 블록 12개가 들어 있으며, 데이터 블록 크기를 8이라고 가정했을 때의 그림입니다.


AsIKZ9VKrg_E5E6bctdC-kH3KtiNgbK6E2ocNG9R


10.1.3 논리적/물리적 구조를 확인하기 위한 실습


실습을 하기전에 자주 출현하는 오라클의 데이터딕셔너리에 대해 간단히 설명 드리겠습니다.


오라클의 데이터딕셔너리data dictionary는 모든 데이터베이스의  정보(사용자, 권한, 스키마 개체, 무결성 제약조건, DB구조, DB 성능정보 등)를 담고 있는 시스템 테이블 및 뷰 입니다. 오라클이 사용하는 영역이므로 SYSTEM 테이블스페이스에 위치해 있으며 사용자들에게 DB의 모든 정보를 제공 합니다. DBA_로 시작하는 뷰는 DBA 권한을 가진 사용자만 볼 수 있는 뷰 인데 오라클의 모든 개체의 정보를 볼 수 있으며,  ALL_로 시작되는 뷰는 특정 사용자가 접근 가능한 객체정보를 , USER_로 시작되는 뷰는 특정 사용자에게 종속되어 있고 그 사용자가 소유한 객체에 대한 정보를 조회 할 수 있습니다.


본서의 실습에서 사용하는 사용자  SCOTT은 이미 DBA 권한을 가지고 있습니다. 0. 환경설정 사용자생성 부분에서 확인하세요.  

실습

USER_DATA_FILES 또는 DBA_DATA_FILES 딕셔너리뷰는 실제 데이터가 들어있는 오라클의 물리적 구성요소인 데이터파일data file에 대해 정보를 제공하는 뷰입니다. 파일이름, 테이블스페이스 이름, 데이터파일의 크기, 가용한지 등의 상태 정보를 제공합니다.


현재 데이터베이스에서 사용중인  테이블스페이스와 이를 구성하는, 데이터 파일을 DBA_DATA_FILES 딕셔너리뷰를 통해 조회 합시다. 


SELECT TABLESPACE_NAME

             , BYTES/1024/1024 MB

             , FILE_NAME

FROM    DBA_DATA_FILES;


<실행결과>

 

TABLESPACE_NAME

MB

FILE_NAME

1

USERS

    5

C:\APP\ORADATA\ORCL\USERS01.DBF

2

UNDOTBS1

  55

C:\APP\ORADATA\ORCL\UNDOTBS01.DBF

3

SYSTEM

910

C:\APP\ORADATA\ORCL\SYSTEM01.DBF

4

SYSAUX

730

C:\APP\ORADATA\ORCL\SYSAUX01.DBF


현재 데이터베이스에는 4개의 테이블스페이스가 있고 각 테이블스페이스를 구성하는 데이터파일의 경로 및 파일명을 보여 줍니다.


실습


본 교재의 실습을 위한 사용자는 SCOTT입니다. 이 사용자는 0. 환경설정에서 사용자를 생성할 때 기본 테이블스페이스dafault tablespace를 별도로 지정하지 않았는데,  오라클 21C에서는 USERS 테이블스페이스로 설정합니다. 그래서 SCOTT 사용자에서 생성한 테이블은 USERS라는 테이블스페이스에 생성이 됩니다. 아래 실습을 통해 접속한 사용자의 기본 테이블스페이스와 관련된 정보를 확인해 보겠습니다.


현재 접속한 사용자의 사용자명, 기본 테이블스페이스, 생성일자, 최종로그인일시를 확인하는 쿼리를 작성합시다.


SELECT USERNAME

             , DEFAULT_TABLESPACE

             , CREATED

             , LAST_LOGIN

FROM    DBA_USERS

WHERE USERNAME =  ❶USER ;


<실행결과>

 

USERNAME

DEFAULT_TABLESPACE

CREATED

LAST_LOGIN

1

SCOTT

USERS

20/11/03

20/12/06 14:25:44.000000000 ASIA/SEOUL


 ❶ USER 함수는 현재 세션의 사용자의 이름을 VARCHAR2 현식으로 돌려줍니다. 쿼리 결과를 보았을 때 SCOTT 사용자로 접속된 상태라는 것을 알 수 있습니다. USER 함수는 CHECK 제약조건에서는 사용할 수 없습니다.

실습


USER_TABLES 딕셔너리뷰를 통해  현재 사용자가 소유(작성)한 테이블의 목록을 확인 할 수 있습니다.


현재 사용자의 테이블 목록을 조회하면서 테이블스페이스명도 같이 조회합시다.


SELECT TABLESPACE_NAME

             , TABLE_NAME

FROM     USER_TABLES;


<실행결과>

 

TABLESPACE_NAME

TABLE_NAME

1

USERS

DEPT

2

USERS

EMP

3

USERS

BONUS

4

USERS

SALGRADE

5

USERS

CUSTOMER

6

USERS

SALES


현재 SCOTT 계정에는 6개의 테이블이 만들어 졌음을 알 수 있습니다.


실습


테이블의 크기가 얼마일까? 궁금할 때가 가끔 있습니다. 아래 실습에서 확인하세요.


사원emp 테이블의 데이터 블록data block 수와 몇 데이터 크기kb를 쿼리하세요. 


SELECT BLOCKS

         , BYTES/1024 AS KB

FROM   USER_SEGMENTS

WHERE  SEGMENT_NAME =❶ 'EMP';


<실행결과>

 

BLOCKS

      KB

1

          8

        64


❶ 테이블명은 오라클 딕셔너리에 대문자로 저장되어 있으므로 WHERE 절에서 문자 리터럴로 비교시 대문자로 작성해야 합니다.

 

#ORACLE, #테이블, #테이블스페이스,#데이터파일,#오라클구조

 

오라클 테이블 소개

 오라클 테이블 소개


오라클에서 데이터 저장소 기본 단위인 테이블은 스키마 오브젝트schema cbjects의 일종으로 관계형 데이터베이스를 구성하는 기본 데이터 구조입니다. 행과 열 구조를 가지며 사용자들은 논리 단위인 테이블을 이용하여 데이터를 입력, 수정, 삭제, 추출 등을 할 수 있습니다.

오라클에서 사용자는 DB에 접속하기 위한 계정이고 스키마는 해당 계정에서 만든 테이블, 인덱스, 뷰와 같은 객체 입니다. 즉 스키마는 해당 계정에 속하는 데이터베이스 개체의 집합입니다.  오라클에서 CREATE USER로 사용자를 생성하면 이는 빈 스키마를 생성하는 것과 동일 합니다. 사용자와 스키마 간의 직접적인 일대일 관계로 인해 두 용어는 종종 같은 의미로 사용됩니다.

스키마 오브젝트는 해당 사용자 계정에서 만든 객체입니다. SQL로 생성되고 조작되는 TABLES, INDEXES, VIEWS, SEQUENCES, SYNONYM, CLUSTERS, DATABASE LINK, PROCEDURES, FUNCTIONS, PACKAGE 등이 있습니다.

테이블에서 테이블 각 열에 규칙을 지정할 수 있습니다. 이러한 규칙을 무결성 제약조건이라고 합니다. 예를 들어 열에 지정하는 NOT NULL은 무결성 제약조건입니다. 이 제약조건은 해당 열의 모든 행은 반드시 값을 가지도록 제약합니다.
종류
테이블 종류로는 행과 열의구조를 가진 일반적인 관계형 테이블, 오브젝트 타입, XMLType 테이블도 있습니다. 이 중에서는 오브젝트 타입, XMLType 테이블은 실무에서 거의 사용하지 않아 이 책에서는 다루지 않습니다.

테이블은 영구히 존재하는 테이블과 세션 또는 트랜잭션 기간 동안에만 존재하는 임시 테이블temporary table로 구분할 수 있습니다. 임시 테이블은 여러 SQL 작업을 실행하여 각 결과를 결합해 최종 결과를 얻을 때 중간 경과를 메모리에 임시로 보관하는 용도에 유용합니다.

사용법 핵심 요약
테이블을 생성한 후 SQL문을 사용하여 데이터 행을 삽입합니다. 그런 다음 SQL을 사용하여 테이블 데이터를 쿼리(SELECT), 삽입(INSERT), 삭제(DELETE) 또는 업데이트(UPDATE) 할 수 있습니다.

테이블을 더 유용하게 사용하려면 COMMENT 명령을 사용하여 각 테이블과 해당 열에 주석을 반드시 표기해야 합니다.

또한 테이블의 열에 무결성 제약조건(개체 무결성, 참조무결성)을 정의하면 데이터베이스의 비즈니스 규칙을 자동으로 적용할 수 있으니 Primary Key, Foreign Key, Not Null, Check, Unique 제약조건을 테이블 생성 시 적절하게 사용하기 바랍니다.

#오라클 #테이블 #테이블이란 #ORACLE #TABLE

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...