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 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에 있는 값이어야함
);

좋은 웹페이지 즐겨찾기