--테이블 생성과 데이터 타입의 이해
--; DB에서 데이터를 저장하는 가장 기본적인 구조는
-- 테이블(Table)이다 .
-- 오라클에는 테이블 이외에 뷰(View), 인덱스(Index),
-- 시퀀스(Sequence)등 여러 개체가 있고 이들 중에
-- 물리적인 공간을 갖는 개체를 세그먼트(Segment)라고
-- 분류하는데, 이들 중 테이블은 사용자가 직접 조회 가능한
-- 데이터를 저장하는 유일한 세그먼트이다.
-- DB를 테이블 관점에서 보면, DB란 테이블에 저장된
-- 데이터의 효율성과 무결성을 보장하기 위한 시스템으로
-- 이해할 수 있다.(관계형 데이터베이스 특징, 정형데이터 BUT 빅데이터는 아님.)
--
-- 1. 테이블 생성과 삭제
-- 테이블은 행(Row)과 컬럼(열, Column)로 이루어진
-- 매우 익숙한 형태의 자료구조이다.
-- 테이블 형태의 자료구조는 문서의 일반적인 형태로
-- DB이전부터 사용되어져 온 것으로 역사가 길다.
-- 정보시스템에서 문서의 형태였던 도표의 구조를 도입해서
-- 테이블이라 명명하고 사용한 것이다.
-- 초창기 파일 시스템을 기반으로 한 DB시스템에서 레코드와
-- 필드로 구성된 파일이 도표를 대신했지만
-- RDB(Relational DataBase)가 본격적으로 사용되면서부터
-- 행(Row)과 컬럼(Column)으로 구성된 테이블이 이를 대신한다.
--
-- CREATE TABLE 테이블명(
-- 컬럼명 데이터타입 [DEFAULT 디폴트값] [컬럼 레벨 제약조건],
-- 컬럼명 데이터타입 [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
-- 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): 숫자 타입 / number(10,2)--> 전체 10자리,소수 둘째자리까지
-- 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) --(소수점 포함 4자리라는 얘기인데 소수점 이하 2자리이므로 정수부분 2자리.)
);
INSERT INTO t1 VALUES (12.12);
INSERT INTO t1 VALUES (1.789);
SELECT * FROM t1;
INSERT INTO t1 VALUES (123.1); --저장이 안됨.
DROP TABLE t1;
DROP TABLE t2;
CREATE TABLE t2(
name VARCHAR2(3) --바이트크기 3
);
INSERT INTO t2 VALUES ('AAA');
INSERT INTO t2 VALUES('장');
INSERT INTO t2 VALUES('장강'); --6바이트라서 안됨
INSERT INTO t2 VALUES('A');
--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; --둘ㄷ ㅏ 4바이트 꽉 채웠으므로 같다고 본다.
--아래 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
내용을 입력하세요.
*예시
--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)
);