SQL(Oracle)/SQL 수업

#22. DDL(CREATE)

열하나요 2023. 8. 1. 15:51

DDL(DATA DEFINITION LANGUAGE) : 데이터 정의 언어

오라클에서 제공하는 객체(OBJECT)를 새롭게 만들고(CREATE), 구조를 변경하고(ALTER), 구조 자체를 삭제하는(DROP)하는 명령문이다.

DDL은 구조자체를 정의하는 언어로 주로 DB관리자, 설계자가 사용한다.

 

22_1. CREATE TABLE

# 자료형

- CHAR(바이트수) : 최대 2000BYTE까지 지정 가능, 고정길이

- VARCHAR2(바이트수) : 최대 4000BYTE까지 지정 가능, 가변길이

    (숫자, 영문자, 특수문자 => 1글자당 1BYTE / 한글 => 1글자당 3BYTE)

- 숫자 (NUMBER) : 정수 / 실수 상관없이 NUMBER!

- 날짜 (DATE) 

 

1. 테이블 생성

CREATE TABLE 테이블명 (컬럼명 자료형);

CREATE TABLE MEMBER(
    MEMBER_ID VARCHAR2(20),
    MEMBER_DATE DATE
);

2. 컬럼에 주석 달기

COMMENT ON COLUMN 테이블명.컬럼명 IS '주석내용';

COMMENT ON COLUMN MEMBER.MEMBER_ID IS '회원아이디';

 

만든 테이블이 계정에 잘 생성되었는지 조회해보자.

 

현재 이 계정이 가지고 있는 전반적인 구조를 확인할 수 있는 데이터 딕셔너리

(*데이터 딕셔너리 : 다양한 객체들의 정보를 저장하고 있는 시스템 테이블)

SELECT * FROM USER_TABLES;

현재 이 계정이 가지고 있는 테이블들의 모든 컬럼의 정보를 조회할 수 있는 데이터 딕셔너리

SELECT * FROM USER_TAB_COLUMNS;

 

INSERT INTO 테이블명 VALUES('컬럼값', '컬럼값'...'컬럼값');

 

INSERT를 할 때,

원하는 데이터 값만 유지하기 위해서(보관하기 위해서) 특정 컬럼마다 제약을 설정해 준다.

 

22_2. 제약조건

1. NOT NULL 제약조건 : NULL값을 허용하지 않는 제약조건

컬럼레벨 방식만 가능! => 각 컬럼에 바로 기술

CREATE TABLE MEM_NOTNULL(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) NOT NULL,
);

2. UNIQUE 제약조건 : 컬럼에 중복값을 제한하는 제약조건

1) 컬럼라벨 방식

CREATE TABLE MEM_UNIQUE(
    MEM_ID VARCHAR(20) NOT NULL UNIQUE
);

2) 테이블라벨 방식

CREATE TABLE MEM_UNIQUE(
    MEM_ID VARCHAR2(20) NOT NULL,
    UNIQUE (MEM_ID)
);

제약조건 위반시 오류 -

ORA-0001 : unique constraint (DDL.SYS0010059) violated

 

#제약조건 부여시 제약조건명도 지정하는 방법 : 제약조건 앞에 'CONSTRAINT 제약조건명'을 붙이면 된다.

CREATE TABLE MEM_CON_NM(
    MEM_ID VARCHAR(20) NOT NULL,
    CONSTRAINT MEM_ID_UQ UNIQUE (MEM_ID)
);

제약조건명을 지정한 후의 오류 내용(어떤 컬럼에 문제가 있는지 해당 컬럼의 제약조건명으로 알려줌)

ORA-00001 : unique constraint(DDL.MEM_ID_UQ) violated

 

3. CHECK 제약조건 : 컬럼에 기록될 수 있는 값에 대한 조건을 설정해 두는 제약조건

1) 컬럼라벨 방식

CREATE TABLE MEM_CHECK(
    GENDER CHAR(3) CHECK(GENDER IN ('남', '여'))
);

2) 테이블라벨 방식

CREATE TABLE MEM_CHECK(
    GENDER CHAR(3) 
    CHECK(GENDER IN ('남', '여'))
);

CHECK 제약조건을 건다고 해서 NULL값이 못 들어가는 건 아니다.

 

새롭게 컬럼이 만들어지고 지정이 안된 컬럼에는 기본적으로 NULL값이 들어가지만

만일 DEFAULT값이 부여되어있다면 NULL값 대신 DEFAULT로 지정해놓은 값이 들어가게 된다!

CREATE TABLE MEM_CHECK(
    MEM_DATE DATE DEFAULT SYSDATE NOT NULL
);

 

4. PRIMARY KEY(기본키) 제약조건 : 테이블에서 각 행들의 정보를 유일하게 식별할 수 있는 컬럼에 부여하는 제약조건

중복되지 않고 값이 존재해야만 하는 컬럼에 PRIMERY KEY부여(NOT NULL + UNIQUE)

단, 한 테이블 당 한 번만 설정 가능

1) 컬럼라벨 방식

CREATE TABLE MEM_PRIMARYKEY1(
    MEM_NO NUMBER CONSTRAINT MEM_PK PRIMARY KEY,
    GENDER CHAR(3) CHECK(GENDER IN ('남', '여'))
);

2) 테이블라벨 방식

CREATE TABLE MEM_PRIMARYKEY1(
    MEM_NO NUMBER
    GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
    CONSTRAINT MEM_PK PRIMARY KEY(MEM_NO) -- 테이블레벨 방식
);

 

컬럼을 묶어서 PRIMARY KEY 하나로 설정할 수 있다.  => 복합키

CREATE TABLE MEM_PRIMARYKEY2(
    MEM_NO NUMBER,
    MEM_ID VARCHAR2(20),
    PRIMARY KEY (MEM_NO, MEM_ID)
);

 

5. FOREIGN KEY(외래키) 제약조건 : 해당 컬럼에 다른 테이블에 존재하는 값만 들어와야하는 컬럼에 부여하는 제약조건!

(부모테이블 - 자식테이블)

1) 컬럼라벨 방식

CREATE TABLE MEM(
    GRADE_ID CHAR(2) REFERENCES MEM_GRADE(GRADE_CODE) -- 컬럼레벨방식
);

2) 테이블라벨 방식

CREATE TABLE MEM(
    GRADE_ID CHAR(2)
    FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE)
);

참조할 컬럼명은 생략할 경우 기본적으로 참조할 테이블의 PRIMARY KEY 컬럼으로 참조할 컬럼명으로 잡힌다.

오류 시 : ORA-02291 : integrity constraint violated - parent key not found

 

참조할 때, 부모테이블에 RPIMARY KEY나 UNIQUE가 없으면 참조되지 않는다.

자식테이블에서 부모테이블에 존재하는 값을 사용하고 있을 경우 삭제가 안되는 "삭제 제한 옵션"이 걸려있음

 

 

23_3. 부모테이블 / 자식테이블

기본값 : ON DELETE RESTRICTED(삭제 제한)  --> 옵션을 바꿀 수 있음

1. ON DELETE SET NULL : 부모데이터를 삭제 시 해당 데이터를 사용하고 있는 자식컬럼을 NULL값으로 변경시키는 옵션

 

2) 테이블라벨 방식

CREATE TABLE MEM(
    GRADE_ID CHAR(2), 
    FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE SET NULL
);

 

2. ON DELETE CASCADE : 부모데이터 삭제 시 해당 데이터를 사용하고 있는 자식데이터도 같이 삭제해버리는 옵션

2) 테이블라벨 방식

CREATE TABLE MEM(
    GRADE_ID CHAR(2),
    FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE CASCADE
);

 

23_4. CREATE TABLE ... AS 서브쿼리

컬럼들, 조회결과의 데이터값들 복사. 제약조건은 NOT NULL만 복사 됨

조건에 맞게 복사해 올 수 있다. 여기서 컬럼의 구조만 복사하고 싶다면 WHERE(조건절)을 FALSE로 만들어주면 된다.

CREATE TABLE EMPLOYEE_COPY2 AS
SELECT *
  FROM EMPLOYEE
 WHERE 1 = 0;

서브쿼리의 SELECT절 산술연산 또는 함수식이 기술된 경우 반드시 별칭을 부여해야한다.

CREATE TABLE EMPLOYEE_COPY4 AS
SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12 "연봉"
  FROM EMPLOYEE;

여기서 복사한 테이블에 다시 제약조건을 걸고 싶다면?

 

23_5. ALTER TABLE ... ADD 

테이블이 생성된 후 제약조건 추가

ALTER TABLE EMPLOYEE_COPY ADD PRIMARY KEY(EMP_ID);

다른 테이블을 참조하여 걸 수도 있다.

-- EMPLOYEE_COPY 테이블에 DEPT_CODE컬럼에 외래키 제약조건 추가(DEPARTMENT의 DEPT_ID를 참조)
ALTER TABLE EMPLOYEE_COPY ADD FOREIGN KEY(DEPT_CODE) REFERENCES DEPARTMENT(DEPT_ID);

-- EMPLOYEE_COPY 테이블에 JOB_CODE컬럼에 외래키 제약조건 추가(JOB의 JOB_CODE를 참조)
ALTER TABLE EMPLOYEE_COPY ADD FOREIGN KEY(JOB_CODE) REFERENCES JOB(JOB_CODE);

-- DEPARTMENT 테이블에 LOCATION_ID에 외래키 제약조건 추가(LOCATION의 LOCAL_CODE 참조)
ALTER TABLE DEPARTMENT ADD FOREIGN KEY(LOCATION_ID) REFERENCES LOCATION(LOCAL_CODE);

 

 

-----------------------------------------------------------------------------------------------------------------

나홀로 실습)

DDL 계정에 'STUDENT'테이블을 만들어, 이름, 학번, 학년, 성별, 입학날짜 컬럼을 만들고

각 컬럼에 제약조건을 거시오.

하나는 컬럼라벨방식, 하나는 테이블라벨방식

STUDENT는 'LEVEL'(LEVEL_CODE, LEVEL_NAME)라는 테이블을 참조하여 학년 컬럼에 제약조건을 건다.

컬럼에 값을 넣고 조회 후, DELETE까지 진행.

여기서 학년이 3학년인 학생들만 조회하여 테이블을 복사하고

복사한 테이블에 제약조건을 다시 추가해주자.

 

-----------------------------------------------------------------------------------------------------------------------

 



'SQL(Oracle) > SQL 수업' 카테고리의 다른 글

#24. TEST... 과제(SELECT)  (0) 2023.08.03
#23. DML, DDL, DCL, TCL, OBJECT(VIEW)  (0) 2023.08.02
#21. SELECT (JOIN)  (0) 2023.07.31
#20. SQL(SELECT)  (0) 2023.07.28
#19. 세번째 시험... +과제  (0) 2023.07.27