[Oracle] DDL
SQL의 종류
| DML | DDL | DCL | TCL |
|---|---|---|---|
| 데이터 조작 | 테이블 선언 | 데이터 제어 | 트랜잭션 제어 |
| SELECT : 데이터 검색 INSERT : 데이터 추가 UPDATE : 데이터 수정 DELETE : 데이터 삭제 | CREATE : 테이블 제작 DROP : table삭제 ALTER : 수정, 삭제, 추가 TRUNCATE : data삭제 RENAME : 테이블명 변경 | GRANT : 권한부여 REVOKE : 권한제어 | COMMIT ROLLBACK |
CREATE
- TABLE, VIEW , SEQUENCE , INDEX , PL/SQL
- PL/SQL => PROCEDURE , FUNCTION , TRIGGER
- COMMIT을 날릴 필요없음 (Auto Commit)
1. CAST : 복사
- 기존에 존재하는 테이블을 복사
CREATE TABLE table_name
AS SELECT ~
2. 새로운 테이블 제작 (테이블 저장하는 공간)
- 컬럼명 뒤 제약조건을 ‘컬럼레벨'이라고 함
- 테이블과 동시에 생성됨
NOT NULL,DEFAULT는 무조건 컬럼레벨에 붙여야함
- 나중에 첨부된 제약조건은 ‘테이블레벨'이라고 함
- 테이블 생성 후 나중에 생성됨
- 수정이 용이해서 테이블레벨을 권장함
CREATE TABLE table_name(
컬럼명 데이터형 [제약조건 (여러개 사용이 가능)],
컬럼명 데이터형 [제약조건 (여러개 사용이 가능)],
컬럼명 데이터형 [제약조건 (여러개 사용이 가능)]
[제약조건...],
[제약조건...],
[제약조건...]
);
DROP : 삭제, table 자체를 삭제
- 복구 불가하기 때문에 항상 백업해두어야함
DROP TABLE 삭제할 테이블명;
ALTER : 수정, 삭제, 추가 (컬럼 관련된 것들만)
- 컬럼 추가
ALTER TABLE table_name ADD 컬럼명 데이터형;
- 컬럼 삭제
ALTER TABLE DROP COLUMN 컬럼명;
- 컬럼 이름 변경
- 컬럼명에 작은따옴표
' '불필요
- 컬럼명에 작은따옴표
ALTER TABLE table_name RENAME COLUMN 이전컬럼명 TO 변경컬럼명;
- 컬럼 데이터 변경
ALTER TABLE MODIFY COLUMN 컬럼명 데이터형;
TRUNCATE : 데이터만 삭제 , 복구불가
TRUNCATE TABLE table_name;
RENAME : 테이블 이름 변경
RENAME 이전 테이블명 TO 변경할 테이블명;
read only : 읽기 전용으로 변경
- SELECT만 이용 가능
ALTER TABLE table_name read only
서브쿼리
SELECT ename,sal FROM emp WHERE sal<(SELECT AVG(sal) FROM emp);
테이블 제작 방식
1. 테이블 복사
- 복사
CREATE TABLE myDept
AS SELECT * FROM dept;
- 특정 조건 성립할때만 복사
CREATE TABLE myEmpDept
AS SELECT empno,ename,job,hiredate,sal,emp.deptno,dname,loc
FROM emp, dept
WHERE emp.deptno=dept.deptno;
- 컬럼명만 복사해오려면? => 값을 가져오는 조건이 false가 되면 됨
- WHERE 뒤에 false가 나오는 어떤 조건을 줘도 상관 없음
- ORDER BY처럼 첫 번째 칼럼과 두 번째 칼럼이 같을때라고 쓴 조건이 아님
- WHERE 뒤에 false가 나오는 어떤 조건을 줘도 상관 없음
CREATE TABLE new_emp2(no,name,hiredate)
AS SELECT no,name,hiredate
FROM new_emp
WHERE 1=2;
- WHERE절 뒤에 false가 나오도록하면 내용은 복사하지 않고
2. 사용자 정의
- 오라클에서 제공하는 데이터형
- 문자 : CHAR , VARCHAR2 , CLOB
- 숫자 : NUMBER
- 날짜 : DATE , TIMESTAMP
- 기타 : BLOB , BFILE (동영상 , 사진)
- 테이블 형식 :
컬럼명 데이터형name VARCHAR(34)- VO잡을때와 비슷하지만 데이터형이 뒤에 붙는다는 것이 차이점임
- VARCHAR2는 가변형이기 때문에 글자수보다 더 작게 범위를 잡지 않도록 주의!
- 이름이 16바이트인데 VARCHAR2(10) 처럼 사용하면 테이블 생성 안됨
- 글자수가 고정된 경우는 CHAR사용
- (EX) emp테이블의 생성
CREATE TABLE emp(
사번 정수 => empno NUMBER(4) -- 1~9999
이름 문자 => ename VARCHAR2(34) -- 한글 : 17자까지...* 2byte
직위 문자 => job VARCHAR2(10)
입사일 날짜형 => hiredate DATE
급여 실수 => sal NUMBER(7,2) -- 실수 , 정수 모두 가능
부서번호 정수 => deptno NUMBER(2)
)
2. 테이블, 컬럼명 제작
- 테이블명은 반드시 문자로 시작
- 숫자는 사용이 가능하지만, 시작문자가 숫자면 안된다.
- 한글도 사용이 가능하지만, 한글이 깨질 수 있어서 비권장함(알파벳 권장)
- 대소문자 구분을 하지 않는다.
- BUT 테이블명이 오라클에 저장될 때는 대문자로 저장된다.
// 소문자로 써서 못찾아옴
SELECT column_name,data_type
FROM user_tab_columns
WHERE table_name='emp';
// 대문자로 써야찾을 수 있음
SELECT column_name,data_type
FROM user_tab_columns
WHERE table_name='EMP';
- 테이블,컬럼명은 저장길이가 30byte이다. 한글은 15글자까지 설정 가능
- 테이블은 중복해서 만들 수 없다
- 저장되는 폴더가 다르면 같은 이름을 쓸 수도 있다.
- 키워드는 사용할 수 없다.
- 테이블명과 컬럼명이 동일할 수도 있다.
-- 게시판 테이블 만들기
CREATE TABLE board(
no NUMBER,
name VARCHAR2(34),
email VARCHAR2(100)
subject VARCHAR2(4000),
content CLOB,
pwd VARCHAR2(10),
regdate DATE,
hit NUMBER
);
// 바뀔 수 있는 부분들은 정수로 받기
CREATE TABLE movie(
mno NUMBER,
title_ko VARCHAR2(100),
title_en VARCHAR2(100),
score NUMBER(3,2),
genre VARCHAR2(30),
regdate VARCHAR2(50),
time NUMBER,
grade VARCHAR2(50),
director VARCHAR2(50),
actor VARCHAR2(100),
reserve NUMBER(4),
showUser NUMBER,
story CLOB,
poster VARCHAR2(4000),
address VARCHAR2(200)
);
-- 네이버 영화 테이블 만들기
CREATE TABLE naver_Movie(
mno NUMBER,
title_ko VARCHAR2(100),
title_en VARCHAR2(100),
score_general NUMBER(3,2),
score_expert NUMBER(3,2),
score_net NUMBER(3,2),
genre VARCHAR2(50),
nation VARCHAR2(50),
runtime NUMBER,
regdate DATE,
director VARCHAR2(50),
actor VARCHAR2(20),
grade VARCHAR2(100),
rank VARCHAR2(100),
total NUMBER
);
CREATE TABLE test(
// 여기 공백 들어가면 오류
no NUMBER,
name VARCHAR2(10)
// 여기 공백 들어가면 오류
);
ALTER 수정
필요없는 컬럼 삭제
ALTER TABLE movie DROP COLUMN address;
필요한 컬럼 추가
ALTER TABLE movie ADD cno NUMBER;
컬럼 데이터 크기 수정
ALTER TABLE movie MODIFY genre VARCHAR2(100);
컬럼이름 변경
ALTER TABLE movie RENAME COLUMN showUser TO su;
(*) 테이블 이름 변경하기
RENAME movie TO daum_movie;
ALTER TABLE 테이블명 CHANGE 기존컬럼명 변경할컬럼명 컬럼타입;
삭제
DELETE
- 복구 가능, 데이터 내용만 삭제(칼럼유지)
CREATE TABLE emp_test AS SELECT * FROM emp; -- SELECT * FROM emp_test; DELETE FROM emp_test; -- SELECT * FROM emp_test; ROLLBACK; -- SELECT * FROM emp_test;
TRUNCATE
- 복구 불가, 데이터 내용만 삭제(칼럼유지)
TRUNCATE TABLE emp_test;
SQL> SELECT * FROM emp_test;
no rows selected
SQL> DESC emp_test
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
DROP
- 완전 삭제, 복구(ROLLBACK) 불가
DROP TABLE movie;
DROP TABLE board;
CREATE TABLE member(
no NUMBER,
id VARCHAR(20),
name VARCHAR2(34),
addr VARCHAR2(100),
tel VARCHAR2(20)
);
INSERT INTO member VALUES(1,'hong','홍길동','서울','010-0000-0000');
COMMIT;
SELECT * FROM member;
ALTER TABLE member read only;
// read only이기때문에 SELECT만 가능!
INSERT INTO member VALUES(1,'hong','홍길동','서울','010-0000-0000');
COMMIT;
SELECT * FROM member;
-
tab: 사용할 수 있는 테이블 확인SELECT * FROM tab; -
업데이트 & 줄수와 블럭수 세기
ANALYZE TABLE emp COMPUTE STATISTICS;
SELECT num_rows, blocks FROM user_tables WHERE table_name='EMP';