<테이블(Table)>
: DB에서 데이터를 저장하는 가장 기본적인 구조
오라클에는 테이블 이외에 뷰(View), 인덱스(Index), 시퀀스(Sequence)등 여러 개체가 존재
이 중 물리적인 공간을 갖는 개체를 세그먼트(Segment)라고 분류
-> 테이블은 사용자가 직접 조회 가능한 데이터를 저장하는 유일한 세그먼트
DB란 테이블에 저장된 데이터의 효율성과 무결성을 보장하기 위한 시스템
1. 테이블 생성과 삭제
테이블: 행(Row). 컬럼(열, Column)로 이루어진 자료구조 형태
정보시스템에서 문서의 형태였던 도표의 구조를 도입해서 테이블이라 명명하고 사용
초창기 파일 시스템을 기반으로 한 DB시스템에서 레코드와 필드로 구성된 파일이 도표를 대신
-> RDB(Relational DataBase)가 본격적으로 사용되면서부터 행(Row)과 컬럼(Column)으로 구성된 테이블이 이를 대신함
CREATE TABLE 테이블명(
컬럼명 데이터타입 [DEFAULT 디폴트값] [컬럼 레벨 제약조건],
컬럼명 데이터타입 [DEFAULT 디폴트값] [컬럼 레벨 제약조건],
);
- 테이블 생성 CREATE TABLE
1) 데이터 타입
컬럼에 입력될 데이터의 종류와 크기를 결정(자료형)
2) DEFAULT
입력이 누락되었을 때 기본 입력값을 정의
디폴트값을 지정하지 않으면 null 값이 저장
3) 컬럼 레벨 제약조건
PK, FK, UK, CHECK, NOT NULL 등을 지정
4) 테이블 레벨 제약조건
PK, FK, UK, CHECK 만 지정
NOT NULL 은 정의불가.
DROP TABLE 테이블명
[CASCADE CONSTRAINT];
-DROP
1) 테이블 삭제
2) CASCADE CONSTRAINT : 테이블이 다른 테이블로부터 참조되는 경우, 해당 제약조건을 먼저 삭제 후 테이블을 삭제
SELECT table_name, column_name,
data_type, data_length
FROM user_tab_columns -- sys 계정의 소유 테이블
WHERE table_name = 테이블명;
-SELECT
1) user_tab_columns 데이터 딕셔너리(Data Dictionary)를 통해서 지정한 테이블의 구조를 자세히 검색
2) data_type : 컬럼의 데이터 타입
3) data_length : 컬럼의 길이
2. 테이블 생성시 이름 규칙
1) 문자로 시작
2) 30자이내
3) 영문, 숫자, _,$, # 만 사용
4) 한글 사용은 가능하지만 코드오류의 우려로 사용지양
5) 테이블은 동일한 유저 (스키마 , 계정) 안에서 유일해야 한다.
6) 예약어(명령어등) 사용불가
7) 대소문자의 구별 X(사용문자와는 관계없이 모든 이름은 대소문자로 저장)
3. 데이터타입 *자주쓰는타입
1) 문자타입
- CHAR, *VARCHAR2, LONG, CLOB
2) 숫자타입
- *NUMBER
3) 날짜타입
- *DATE
4) 이진타입
- RAW, LONG RAW, BLOB, BFILE
5) ROWID 타입 : ROWID
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컬럼만 정의 가능 or can use CLOB
6) CLOB : LONG을 개선한 타입. 4gb저장 가능. 한테이블에 여러컬럼으로 정의 가능
7) BLOB : 4G까지 저장 가능한 가변길이 이진 타입
8) ROW(n) : 가변길이 이진타입(n < 2000)
9) BFILE : 외부 파일저장을 위한 이진 타입. 4G 이내 파일
10) ROWID : ROWID 를 저장하기 위한 데이터 타입. PL-SQL 프로그래밍에서 많이 사용되며 각 문자는 64진수로 Encoding.
-테이블생성 예시
--테이블 생성
--명 board, 컬럼구성: no 게시번호, name 작성자, sub 글제목, content 내용, wdate 작성날짜
CREATE TABLE board(
no NUMBER,
name VARCHAR2(50),
sub VARCHAR2(100),
content VARCHAR2(4000),
wdate 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);--넘버자릿수 (4자리 소수점 2자리 )를 지정해줘서 입력불가 오류뜸
DROP TABLE t1;
CREATE TABLE t2(
name VARCHAR2(3)
);
INSERT INTO t2 VALUES ('AAA');
INSERT INTO t2 VALUES('장');
INSERT INTO t2 VALUES('장강');
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;
아래 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); --1)시분초가 같이 저장됨으로
SELECT * FROM hd;
SELECT *
FROM hd
WHERE hdate='2020/02/27'; --2)이렇게는 검색되지 않음
-->범위검색 해줘야함
SELECT *
FROM hd
WHERE hdate BETWEEN '2020/02/27' AND '2020/02/28';
--비추천방법
--hdate를 문자열로 자동형변환하므로 대용량 테이블에서는 심각한 성능 저하가 일어날 수 있다.
SELECT *
FROM hd
WHERE hdate LIKE '20/02/27%';
1) 우리나라에서 날짜는 DATE 보다 VARCHAR2(8)로 정의. (시분초 사용불가)
2) 외국에서는 TRUNC(sysdate)이용. 시분초를 00:00:00으로 저장
3) sysdate-> 범위검색 요구
<Exercise>
--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 : sql' 카테고리의 다른 글
Oracle/ DeadLock (0) | 2020.02.28 |
---|---|
Oracle/ 트랜잭션의 이해 (0) | 2020.02.28 |
Oracle/ SELECT절 복습 adv (0) | 2020.02.28 |
Oracle/ SELECT절 복습 (0) | 2020.02.28 |
Oracle/ 서브쿼리를 이용한 DML문장 & 다이렉트 로드 (0) | 2020.02.28 |