본문 바로가기
DataBase/Oracle

자료형) 오라클의 구조, table의 구조(용어), DB의 자료형 (문자형,숫자형, 날짜형)

by 박채니 2022. 4. 12.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


오라클의 구조

DataBase - user(schema) - table... -  data...

 

table의 구조

- 실제 데이터를 관리하는 객체

- 행 단위로 데이터를 관리

 

용어 정리

- table (entity, relation)

- column 열 (filed, attribute)

- row 행 (record, tuple)

- domain : 하나의 속성(열)에서 가질 수 있는 원자 값의 집합 (Y/N, M/F, 1/0 등)

 

테이블 구조 확인

desc employee;

사원들을 관리하는 테이블을 만들었다.

NULL 여부 : NOT NULL (필수) , NULL (선택)을 나타냅니다.

자료형에는 문자형(char, varchar2), 숫자형(number), 날짜형(date)가 있는 것을 확인할 수 있습니다.

 

테이블 생성 및 데이터 추가

create table 테이블명();

-- 테이블 생성구문
create table tb_datatype(
    a char(10),
    b varchar2(10)
);

테이블 생성은 자동으로 commit (커밋) 되기 때문에 다른 작업을 하다가 테이블을 새로 만들면 모두 commit 됩니다. (주의!)

※ commit(커밋)

- 메모리 상의 작업 내용을 실제 DB에 저장

 

데이터 추가

insert into 테이블명 values();

-- 데이터 추가 (행단위)
insert into tb_datatype values('korea', 'korea');

데이터를 추가 후 commit 처리를 해주지 않으면, 메모리 상에만 저장 됩니다.

따라서 최종 데이터를 DB에 저장해주고 싶다면 commit 처리를 해줘야 합니다.

 

만일 메모리 상의 작업 내용을 취소 하고 싶다면 rollback; 처리를 해줍니다.

※ rollback(롤백)

- commit 된 내용은 그대로 남음

- rollback의 역할은 마지막 commit 시점으로 돌아가는 것


DB의 자료형

크게 문자형 / 숫자형 / 날짜형으로 나눠집니다.

 

☞ 문자형

문자형에서도 고정형 / 가변형으로 나눠지게 됩니다.

고정형 char(2000byte)
가변형 varchar2(4000byte)
	
    가변길이 long(2gb)
    가변길이 clob(4gb) - character large object타입

 

char와 varchar2 모두 데이터의 크기를 10byte로 지정했을 때의 상황을 살펴보겠습니다.

-- 테이블 생성구문
create table tb_datatype(
    a char(10),		--고정형
    b varchar2(10)	--가변형
);

-- 데이터 추가 (행단위)
insert into tb_datatype values('korea', 'korea');
insert into tb_datatype values('한국', '한국');
insert into tb_datatype values('한국', '대한민국'); -- 3byte * 4

우선 마지막 insert문은 해당 오류가 뜨면서 추가 되지 않을 것입니다.

"-- ORA-12899: value too large for column "KH"."TB_DATATYPE"."A" (actual: 12, maximum: 10)"

 

그 이유는 한글은 한 글자 당 3byte인데, '대한민국' 총 12byte가 사용되겠죠.

하지만 varchar2의 길이는 10byte이므로 지정한 길이보다 오버되기 때문입니다.

데이터 중 하나라도 길이가 오버된다면 길이가 알맞은 데이터도 추가할 수 없다는 것을 확인할 수 있었습니다.

 

그렇다면 고정형과 가변형의 차이에 대해서 살펴보겠습니다.

select
    a,	-- 어느 column을 볼 지 선택, *는 모든 것을 의미
    lengthb(a),	-- 길이에 관련된 column 생성(lengthb())
    b,
    lengthb(b)
from
    tb_study;

A가 고정형 / B가 가변형

A열에 'korea'와 '한국'은 데이터의 길이가 10byte로 고정되어 있는 것을 확인할 수 있습니다.

10byte를 사용하지 않았어도 10byte로 고정되어있는 것이죠.

 

반면에 B열 'korea'와 '한국'은 실제 입력된 데이터만큼 데이터의 길이가 변동되는 것을 확인할 수 있습니다.

10byte로 지정을 했어도 10byte 이하로 사용하게 된다면 실제 입력된 데이터만큼 길이가 변동 되는 것이죠.

 

 

☞ 숫자형

number([p], [s])

[p]는 표현할 수 있는 전체 자리수

[s]는 소수점 이하 자리수

 

물론 둘 다 생략 가능합니다!

create table tb_study2 (
    a number,
    b number(7, 3),
    c number(7),
    d number(7, 1),
    e number(7, -2)
);

insert into tb_study2 values (1234.567, 1234.567, 1234.567, 1234.567, 1234.567);
insert into tb_study2 values (1234567.89, 1234567.89, 1234567.89, 1234567.89, 1234567.89);
-- ORA-01438: value larger than specified precision allowed for this column

select * from tb_study2;

1234.567의 데이터를 입력했을 때의 결과입니다.

자리수와 소수점 이하 자리수에 따라서 같은 숫자라도 결과값이 다른 것을 확인할 수 있습니다.

 

c의 경우 [0]이 생략 되었기 때문에 반올림된 1235가 입력 되어있습니다.

 

또한 1234567.89 처럼 [p] 전체 자리수를 넘어가는 숫자를 입력하게 되면 마찬가지로 오류가 발생하게됩니다.

(a의 경우 자리수 지정을 안해주었기 때문에 a만 1234567.89 입력 가능!!)

 

 

☞ 날짜형

날짜형에서도 date / timestamp로 나눠지게 됩니다.

date : 년월일 시분초
timestamp : 년월일 시분초 밀리초/타임존

 

날짜형 연산 지원

date + number : date (number일후 날짜정보를 리턴)
date - number : date (number일전 날짜정보를 리턴)
    
date - date : number (날짜차이를 리턴(1 = 하루))

 

현재 시각 정보 가져오기

※ dual

- 1행짜리 가상 테이블

select
    sysdate,    --현재 시각 정보를 date 타입으로 반환 (DB서버가 돌고 있는 OS의 시간 정보)
    current_date,   -- 접속하고 있는 client를 기준으로 정보를 가져옴
    to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') as "sysdata", 
    systimestamp "systimestamp",    -- 현재 시각 정보를 timestamp 타입으로 반환
    current_timestamp
from
    dual;	-- 1행짜리 가상 테이블

sysdate는 년/월/일만 출력되기 때문에 to_char 배열에 담아 년/월/일 시:분:초까지 출력되도록 해보았습니다.

 

날짜 연산 해보기

select 
    to_char(sysdate + 1, 'yy/mm/dd hh24:mi:ss') as "tomorrow",
    to_char(sysdate, 'yy/mm/dd hh24:mi:ss') as "today",
    to_char(sysdate - 1, 'yy/mm/dd hh24:mi:ss') as "yesterday",
    to_char(sysdate + (26 / 24), 'yy/mm/dd hh24:mi:ss') as "26시간뒤",
    (sysdate + 1) - sysdate as "날짜차이" -- 날짜차이 리턴
from
    dual;

 

날짜 테이블 생성

create table tb_study3 (
    a date,
    b timestamp,
    c timestamp with time zone
);

insert into tb_study3 values (sysdate, systimestamp, systimestamp);

select * from tb_study3;