Day37 :) DDL, 무결성제약조건
DDL
- Data Definition Language
- 테이블의 기본 골격을 정해줌
- 데이터객체의 생성,변경,수정에 이용되는 명령어
- 주요 객체: 테이블, 뷰, 시퀀스, 인덱스
- 테이블: 데이터의 기본 저장단위
- 시퀀스: 일련번호 생성기. 오라클에만 존재함
- 뷰: 하나 이상의 테이블을 이용해서 만든 가상의 테이블
- 인덱스: 데이터에 대한 색인을 갖고 있음. 값 정렬 가능
테이블
테이블 생성
create table 테이블명(
컬럼명1 데이터타입(길이) [default 기본값],
컬럼명2 데이터타입(길이) [default 기본값],
컬럼명2 데이터타입(길이) [default 기본값]
);
- 테이블명은 반드시 문자로 시작해야 하며, 최대 30byte까지 작성 가능(한글 10글자)
- 기본값을 정하지 않으면 null로 자동 설정됨
테이블 변경
- 이미 만들어져 있는 오브젝트를 변경하는 명령어
- 부하가 많이 걸리므로 사용에 주의
- 기본값을 정하지 않으면 null로 자동 설정됨
주요 명령어
- 컬럼추가
alter table 테이블명 add (컬럼명 데이터타입(크기) [default 기본값]);
- 컬럼수정
- 컬럼의 데이터 크기 변경가능
- 최소 크기는 들어있는 데이터의 값만큼
alter table 테이블명 modify (컬럼명 데이터타입(크기) [default 기본값]);
- 컬럼삭제
alter table 테이블명 drop (컬럼명 데이터타입(크기) [default 기본값]);
- 테이블이름 변경
rename 테이블명 to 새이름;
- 데이터 삭제(truncate)
- 테이블 내 데이터와 인덱스를 전부 삭제하고 사용공간도 반납함
- 테이블은 남아있음
- rollback 불가
truncate table 테이블명;
- 테이블 삭제(drop)
- 테이블 자체를 삭제함
drop table 테이블명;
- 테이블: 데이터의 기본 저장단위
- 시퀀스: 일련번호 생성기. 오라클에만 존재함
- 뷰: 하나 이상의 테이블을 이용해서 만든 가상의 테이블
- 인덱스: 데이터에 대한 색인을 갖고 있음. 값 정렬 가능
create table 테이블명(
컬럼명1 데이터타입(길이) [default 기본값],
컬럼명2 데이터타입(길이) [default 기본값],
컬럼명2 데이터타입(길이) [default 기본값]
);
alter table 테이블명 add (컬럼명 데이터타입(크기) [default 기본값]);
- 컬럼의 데이터 크기 변경가능
- 최소 크기는 들어있는 데이터의 값만큼
alter table 테이블명 modify (컬럼명 데이터타입(크기) [default 기본값]);
alter table 테이블명 drop (컬럼명 데이터타입(크기) [default 기본값]);
rename 테이블명 to 새이름;
- 테이블 내 데이터와 인덱스를 전부 삭제하고 사용공간도 반납함
- 테이블은 남아있음
- rollback 불가
truncate table 테이블명;
- 테이블 자체를 삭제함
drop table 테이블명;
시퀀스
- 오라클에서 제공하는 일종의 일련번호 생성기
- 연속적인 번호 필요시 유용
시퀀스 생성
CREATE SEQUENCE 시퀀스이름
[INCREMENT BY a]
-- 시퀀스가 a만큼 증가함. 기본값 1
-- a에 -2를 대입하면 값을 감소시킴
[START WITH n]
-- 시퀀스가 b부터 시작함. 기본값1
[MAXVALUE n | NOMAXVALUE]
-- 시퀀스 최대값 지정. 기본값 NOMAXVALUE
[MINVALUE n | NOMINVALUE]
-- 시퀀스 최소값 지정. 기본값 NOMINVALUE
[CYCLE | NOCYCLE]
-- 시퀀스 번호를 순환 사용 할 것인지 지정. 기본값 NOCYCLE
-- 반복 될 첫번째 값은 MINVALUE를 따름
[CACHE n | NOCACHE]
-- 메모리에 캐싱할 일련번호 갯수 지정. 기본값 20
시퀀스 수정
ALTER SEQUENCE 시퀀스명
[INCREMENT BY a]
...
- START WITH을 제외한 나머지 설정 변경 가능
시퀀스 삭제
DROP SEQUENCE 시퀀스명
시퀀스 사용
시퀀스값 증가
시퀀스명.NEXTVAL
- TEST라는 테이블에 시퀀스를 생성했다고 가정
SELECT TEST.NEXTVAL FROM DUAL;
-- SELECT(조회)이지만 SEQUENCE값은 증가함
INSERT INTO TEST
VALUES(TEST.NEXTVAL, '홍길동', 100)
시퀀스값 조회
시퀀스명.CURRVAL
- 가장 최근 발행한 SEQUENCE를 가져옴
- NEXTVAL이 실행되지 않으면 사용불가
- 다른 테이블과 JOIN시 일련번호를 맞출 때 사용 가능
SELECT TEST.CURRVAL
FROM DUAL;
-- SEQUENCE 현재값 조회
뷰
- 테이블 혹은 다른 뷰를 기반으로 하는 가상의 테이블
- 따로 저장공간은 없고 데이터를 갖고 오는 쿼리만 저장되어있음
- 반복 작업 수행시 매우 유용
- 뷰 생성
create [or replace] view 뷰이름
as 서브쿼리
with read only;
- 뷰 삭제
DROP VIEW 뷰이름;
단순뷰
CREATE OR REPLACE VIEW view_sample1
AS
SELECT no, name, hiredate
FROM employees
;
- view를 생성할 서브쿼리에 조인조건 없이 1개의 테이블로 만들어짐
복합뷰
CREATE OR REPLACE VIEW view_sample2
AS
SELECT a.a1, b.b2
FROM a_table a, b_table b
WHERE a.a1 = b.b1;
- 서브쿼리부분에 여러 개의 테이블이 조인되어 생성되는 뷰
인라인뷰
select a.컬럼1, a.컬럼2
from (select 컬럼
from 테이블
where 조건식)a
- 쿼리 실행중에만 가상테이블이 생성된 후 사라짐
-- 예제
-- 소속 부서의 평균급여보다 많은 급여를 받는 직원의 아이디와 직원이름, 급여를 조회하기
select e.employee_id, e.first_name, e.salary, e.department_id, a.avg
from employees e, (select department_id, ROUND(AVG(salary),0) avg
from employees
group by department_id) a
where e.department_id = a.department_id
and e.salary > a.avg
order by department_id;
인덱스
- 데이터의 검색속도를 향상시키기 위해 색인화 하는것
- 컬럼별로 인덱스를 생성 가능
- 기본키, unique 제약조건이 있으면 자동으로 인덱스가 생성됨
- 인덱스 생성하기
CREATE INDEX 인덱스명
ON 테이블명 (컬럼명, ....)
- 인덱스 조회하기
SELECT 컬럼1, 컬럼2, ...
FROM 테이블
WHERE 컬럼명 = '조회할 데이터'
- 인덱스 삭제하기
DROP INDEX 인덱스명
- 예제
-- 인덱스 생성
create index index_sample
on table(name);
-- 인덱스 조회
select *
from table
where name ='홍길동';
무결성제약조건
- 올바른 데이터만 입력받고 잘못된 데이터는 들어오지 않도록 컬럼마다 정하는 규칙
- 데이터의 정확성과 무결성, 신뢰성을 높일 수 있음
- 컬럼을 대상으로 제약조건을 걸 수 있으며 두개 이상의 컬럼에도 적용 가능
제약 방식
컬럼레벨 제약조건
CREATE TABLE 테이블명 (
컬럼명 데이터타입 제약조건,
컬럼명 데이터타입 제약조건,
...
);
- 컬럼 옆에 바로 제약조건을 적음
- NOT NULL은 컬럼레벨로만 작성해야함
CREATE TABLE TEST(
NO NUMBER(4) PRIMARY KEY,
JUMIN VARCHAR2(13) NOT NULL UNIQUE
-- 두가지 제약조건을 갖게됨
)
테이블레벨 제약조건
CREATE TABLE 테이블명 (
컬럼명 데이터타입,
컬럼명 데이터타입,
...,
제약조건 (컬럼명),
제약조건 (컬럼명, 컬럼명, ...)
);
- 테이블 추가 후 제약조건 작성이 필요 할 때 사용 가능
- NOT NULL을 제외한 모든 제약조건 정의 가능
- 2개 이상의 컬럼에 하나의 기본키를 구성 할 때 사용
- FOREIGN KEY의 경우,
FOREIGN KEY(컬럼) REFERENCE 참조테이블(참조컬럼)
로 정의
CREATE TABLE EMP02(
-- 컬럼 생성
EMPNO NUMBER(4),
ENAME VARCHAR2(10) NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
--제약조건
PRIMARY KEY(EMPNO,ENAME),
UNIQUE(JOB),
FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);
별칭
-- 컬럼레벨
컬럼명 데이터타입 [CONSTRAINT 제약조건별칭] 제약조건
-- 테이블레벨
[CONSTRAINT 제약조건별칭] 제약조건 (컬럼명)
- 보편적으로
테이블_컬럼명_제약조건
순으로 정의
- 별칭을 지정하지 않으면 SYS_C00~처럼 자동으로 이름이 붙게됨
-- 컬럼레벨
CREATE TABLE users (
user_tel varchar2(20) CONSTRAINT user_tel_nn NOT NULL,
-- 컬럼명: user_tel / 데이터타입: varchar2(20)
-- 별칭: user_tel_nn / 제약조건: NOT NULL
);
-- 테이블레벨
CREATE TABLE TEST(
NAME VARCHAR2(10),
ADDRESS VARCHAR2(30),
PHONE VARCHAR2(16),
CONSTRAINT MEMBER01_COMBO_PK PRIMARY KEY(NAME, HPHONE)
-- 별칭: MEMBER01_COMBO_PK / 제약조건: PRIMARY KEY / 적용컬럼: (NAME, HPHONE)
);
제약조건의 종류
- NOT NULL(NN): NULL값을 입력하지 못하게 함
- UNIQUE(UK): 중복 값이 입력되지 않도록 함
- PRIMARY KEY(PK): NOT NULL+UNIQUE. 중복, NULL 불가.테이블 당 한개만 설정가능.
- FOREIGN KEY(FK): 다른 테이블의 PRIMARY KEY컬럼을 참조
- 부모 테이블에 있는 데이터를 변경/삭제하려면 자식테이블이 없어야함
- CHECK(CK): 제시된 조건을 만족하는 값만 가질 수 있음
CREATE TABLE CUSTOMER(
NO NUMBER(7) PRIMARY KEY
-- NULL불가, 중복불가
NAME VARCHAR2(50) NOT NULL,
-- NULL불가
EMAIL VARCHAR2(25) UNIQUE,
-- 중복불가
GENDER CHAR(1) CHECK(GENDER IN('M','F')),
-- 주어진 조건(M,F)에 만족해야함
GRADE VARCHAR2(2) REFERENCE GRADES(GRADE_ID)
-- 부모테이블인 GRADES의 GRADE_ID에 있는 값이어야함
);
Author And Source
이 문제에 관하여(Day37 :) DDL, 무결성제약조건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@yoonee1126/Day37-무결성제약조건
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
CREATE TABLE 테이블명 (
컬럼명 데이터타입 제약조건,
컬럼명 데이터타입 제약조건,
...
);
CREATE TABLE TEST(
NO NUMBER(4) PRIMARY KEY,
JUMIN VARCHAR2(13) NOT NULL UNIQUE
-- 두가지 제약조건을 갖게됨
)
CREATE TABLE 테이블명 (
컬럼명 데이터타입,
컬럼명 데이터타입,
...,
제약조건 (컬럼명),
제약조건 (컬럼명, 컬럼명, ...)
);
FOREIGN KEY(컬럼) REFERENCE 참조테이블(참조컬럼)
로 정의CREATE TABLE EMP02(
-- 컬럼 생성
EMPNO NUMBER(4),
ENAME VARCHAR2(10) NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
--제약조건
PRIMARY KEY(EMPNO,ENAME),
UNIQUE(JOB),
FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);
-- 컬럼레벨
컬럼명 데이터타입 [CONSTRAINT 제약조건별칭] 제약조건
-- 테이블레벨
[CONSTRAINT 제약조건별칭] 제약조건 (컬럼명)
테이블_컬럼명_제약조건
순으로 정의-- 컬럼레벨
CREATE TABLE users (
user_tel varchar2(20) CONSTRAINT user_tel_nn NOT NULL,
-- 컬럼명: user_tel / 데이터타입: varchar2(20)
-- 별칭: user_tel_nn / 제약조건: NOT NULL
);
-- 테이블레벨
CREATE TABLE TEST(
NAME VARCHAR2(10),
ADDRESS VARCHAR2(30),
PHONE VARCHAR2(16),
CONSTRAINT MEMBER01_COMBO_PK PRIMARY KEY(NAME, HPHONE)
-- 별칭: MEMBER01_COMBO_PK / 제약조건: PRIMARY KEY / 적용컬럼: (NAME, HPHONE)
);
- 부모 테이블에 있는 데이터를 변경/삭제하려면 자식테이블이 없어야함
CREATE TABLE CUSTOMER(
NO NUMBER(7) PRIMARY KEY
-- NULL불가, 중복불가
NAME VARCHAR2(50) NOT NULL,
-- NULL불가
EMAIL VARCHAR2(25) UNIQUE,
-- 중복불가
GENDER CHAR(1) CHECK(GENDER IN('M','F')),
-- 주어진 조건(M,F)에 만족해야함
GRADE VARCHAR2(2) REFERENCE GRADES(GRADE_ID)
-- 부모테이블인 GRADES의 GRADE_ID에 있는 값이어야함
);
Author And Source
이 문제에 관하여(Day37 :) DDL, 무결성제약조건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoonee1126/Day37-무결성제약조건저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)