[테이블 생성과 데이터 타입의 이해]
; DB에서 데이터를 저장하는 가장 기본적인 구조는
테이블(Table)이다 .
오라클에는 테이블 이외에 뷰(View), 인덱스(Index),
시퀀스(Sequence)등 여러 개체가 있고 이들 중에
물리적인 공간을 갖는 개체를 세그먼트(Segment)라고
분류하는데, 이들 중 테이블은 사용자가 직접 조회 가능한
데이터를 저장하는 유일한 세그먼트이다.
DB를 테이블 관점에서 보면, DB란 테이블에 저장된
데이터의 효율성과 무결성을 보장하기 위한 시스템으로
이해할 수 있다.
--정형데이터...
1. 테이블 생성과 삭제
테이블은 행(Row)과 컬럼(열, Column)로 이루어진
매우 익숙한 형태의 자료구조이다.
테이블 형태의 자료구조는 문서의 일반적인 형태로
DB이전부터 사용되어져 온 것으로 역사가 길다.
정보시스템에서 문서의 형태였던 도표의 구조를 도입해서
테이블이라 명명하고 사용한 것이다.
초창기 파일 시스템을 기반으로 한 DB시스템에서 레코드(->ROW)와
필드(->column)로 구성된 파일이 도표를 대신했지만
RDB(Relational DataBase)가 본격적으로 사용되면서부터
행(Row)과 컬럼(Column)으로 구성된 테이블이 이를 대신한다.
CREATE TABLE 테이블명(
컬럼명 데이터타입 [DEFAULT 디폴트값] [컬럼 레벨 제약조건], --따로 값안주면 null..
컬럼명 데이터타입 [DEFAULT 디폴트값] [컬럼 레벨 제약조건],
);
1) 데이터 타입
컬럼에 입력될 데이터의 종류와 크기를 결정한다(자료형)
2) DEFAULT
입력이 누락되었을 때 기본 입력값을 정의한다
디폴트값을 지정하지 않으면 null 값이 저장된다
3) 컬럼 레벨 제약조건
PK, FK, UK, CHECK, NOT NULL 등을 지정한다
4) 테이블 레벨 제약조건
PK, FK, UK, CHECK 만 지정한다
NOT NULL 은 정의할 수 없다.
DROP TABLE 테이블명
[CASCADE CONSTRAINT];
1) 테이블을 삭제한다
2) CASCADE CONSTRAINT : 테이블이 다른 테이블로부터
참조되는 경우 해당 제약조건을 먼저 삭제한 후
테이블을 삭제한다.
SELECT table_name, column_name,
data_type, data_length
FROM user_tab_columns -- sys 계정의 소유 테이블
WHERE table_name = 테이블명;
1) user_tab_columns 데이터 딕셔너리(Data Dictionary)
를 통해서 지정한 테이블의 구조를 자세히 검색한다
2) data_type : 컬럼의 데이터 타입
3) data_length : 컬럼의 길이
2. 테이블 생성 이름 규칙
1) 문자로 시작한다
2) 30자 이내로 한다
3) 영문, 숫자, _, $, # 만을 사용한다
4) 한글은 사용가능하지만 되도록 안쓴다
(코드 오류때문에)
5) 테이블은 동일한 유저(스키마, 계정)안에서 유일해야 한다
6) 예약어(명령어등)는 사용이 불가능하다
7) 대소문자를 구별하지 않는다
(생성할 때 사용한 문자와는 관계없이 모든 이름은
대문자로 저장된다)
3. 데이터 타입
1) 가장 많이 사용되는 데이터 타입
2) 문자타입
CHAR, VARCHAR2, LONG, CLOB --char :고정문자열
3) 숫자타입
NUMBER
4) 날짜타입
DATE
5) 이진타입
RAW, LONG RAW, BLOB, BFILE
6) ROWID 타입
ROWID
VARCHAR2, NUMBER, DATE 이 3가지 자료형이
99%이상 사용된다.
4. 데이터 타입 상세
1) VARCHAR2(n) : 가변길이 문자타입
(1 < n < 4000 byte)
2) CHAR(n): 고정길이 문자타입
(1 < n < 4000 byte)
3) NUMBER(n, p): 숫자 타입
n은 전체 자리수
p는 소수점 이하 자리수
전체 자리수를 초과할 경우는 입력거부되지만,
소수점 이하자리수가 초과되면 반올림입력
소수점 이하의 값이 없는 경우는 길이를
지정하지 않는 것이 좋다
4) DATE : 날짜 타입
출력이나 입력 형식과 무관하게
YYYY/MM/DD:HH24:MI:SS 형태로 저장된다
(기원전 4712년 1월 1일 ~ 서기 9999년 12월 31일)
5) LONG : 2GB까지 저장 가능한 가변길이 문자 타입
단 조건 검색할 수 없다.
테이블에는 하나의 LONG 컬럼만 정의할 수 있다.
대신 CLOB 를 사용한다
6) CLOB : LONG 를 개선한 타입
최대 4G까지 저장 가능하고 한 테이블의 여러 컬럼에
정의할 수 있다.
7) BLOB : 4G까지 저장 가능한 가변길이 이진 타입
8) ROW(n) : 가변길이 이진타입(n < 2000)
9) BFILE : 외부 파일저장을 위한 이진 타입.
4G 이내 파일을 저장한다
10) ROWID : ROWID 를 저장하기 위한 데이터 타입.
주로 PL-SQL 프로그래밍에서 많이 사용되며
각 문자는 64진수로 Encoding 되어있다.
--
--테이블을 생성하자
--테이블명 : board
--컬럼 구성 : no(게시물 번호)
-- name(작성자)
-- sub(제목)
-- content(내용)
-- hdate(입력일시)
--
CREATE TABLE board(
no NUMBER,
name VARCHAR2(50),
sub VARCHAR2(100),
content VARCHAR2(4000),
hdate DATE DEFAULT sysdate
);
DESC board;
--테이블 이름을 반드시 대문자로 입력한다
SELECT table_name, column_name,
data_type, data_length
FROM user_tab_columns
WHERE table_name = 'BOARD';
INSERT INTO board (no)
VALUES (1);
COMMIT;
SELECT *
FROM board;
--테이블을 생성하고 데이터를 입력 확인한다
CREATE TABLE t1(
no NUMBER(4,2)
);
INSERT INTO t1 VALUES (12.12);
INSERT INTO t1 VALUES (1.789);
SELECT * FROM t1;
INSERT INTO t1 VALUES (123.1); --소수점 기준으로 왼2 오2 (4, 2),, 로 맞췄기 때문에 값이 커서 안됨
DROP TABLE t1;
DROP TABLE t2;
CREATE TABLE t2(
name VARCHAR2(3)
);
INSERT INTO t2 VALUES ('AAA');
INSERT INTO t2 VALUES('장');
INSERT INTO t2 VALUES('장강'); --값 초과. 글자 하나당 3byte기 때문
INSERT INTO t2 VALUES ('A');
SELECT * FROM t2;
--CHAR 와 VARCHAR2 의 차이점을 알아보자
CREATE TABLE comp(
co1 CHAR(4),
co2 VARCHAR2(4)
);
INSERT INTO comp VALUES('AA', 'AA');
INSERT INTO comp VALUES('AAAA', 'AAAA');
SELECT * FROM comp;
SELECT * FROM comp WHERE co1='AA';
SELECT * FROM comp WHERE co2='AA';
SELECT * FROM comp WHERE co1=co2; --'AAAA' 만 나옴. 왜냐면 char는 총 4바이트인채로 남아있고 varchar2는 빈공간 삭제됨.
--아래 2개는 서로 다른 데이터로 판단한다
--co1 CHAR(4) 'AA' AA__
--co2 VARCHAR2(4) 'AA' AA
--CHAR 를 쓰지 않고 VARCHAR2 를 사용하면 된다
--DATE 타입을 이해해보자
CREATE TABLE hd(
no NUMBER,
hdate DATE
);
INSERT INTO hd VALUES (1, sysdate);
SELECT * FROM hd;
--연월일은 같지만 시분초가 다르므로 검색되지 않는다
SELECT *
FROM hd
WHERE hdate='2020/12/3'; --안됨
--범위 검색을 해야 한다
SELECT *
FROM hd
WHERE hdate BETWEEN '2020/12/03' AND '2020/12/04';
--아래 방법은 비추천
--왜냐하면 hdate를 문자열로 자동 형 변환하므로
--대용량 테이블에서는 심각한 성능 저하가 일어날 수 있다.
SELECT *
FROM hd
WHERE hdate LIKE '20/02/27%';
1) 우리나라에서는 날짜는 DATE 보다 VARCHAR2(8)
이렇게 정의하는 경우가 많다.
대신 시분초를 사용할 수 없게 된다.
2) 외국에서는
TRUNC(sysdate) 시분초를 항상 00:00:00이 되게
저장한다
3) sysdate 를 사용하면 범위검색을 사용해야 한다
-- system 계정으로 처리하는 부분 start
DROP USER bitjava CASCADE;
CREATE USER bitjava IDENTIFIED BY bitjava DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp PROFILE DEFAULT;
GRANT CONNECT, RESOURCE TO bitjava;
GRANT CREATE VIEW, CREATE SYNONYM TO bitjava;
ALTER USER bitjava ACCOUNT UNLOCK;
conn bitjava/bitjava;
--client 테이블을 삭제하라
DROP TABLE client;
--client 테이블을 생성하라
CREATE TABLE client(
cnum NUMBER,
cname VARCHAR2(50),
addr VARCHAR2(200),
tel VARCHAR2(20)
);
--server 테이블을 삭제하라
DROP TABLE server;
--server 테이블을 생성하라
CREATE TABLE server(
cnum NUMBER,
cname VARCHAR2(50),
addr VARCHAR2(200),
tel VARCHAR2(20)
);
'DB > Oracle SQL Developer' 카테고리의 다른 글
[erwin/sql] 12/9 모델링 / 시퀀스 (0) | 2020.12.09 |
---|---|
<40~46> 트랜잭션 (0) | 2020.12.04 |
<39, 40> DML (0) | 2020.12.03 |
<37, 38> DML (0) | 2020.12.02 |
<35, 36> 다중 행, 열 (0) | 2020.12.02 |
댓글