[SQL]테이블 생성 및 삭제 / 1:M / M:N

Gabriela·2023년 7월 9일

[SQL] 데이터베이스

목록 보기
2/13
post-thumbnail

‣ 테이블(Table)

테이블(Table)이란?

  1. 데이터베이스에서 데이터를 저장하는 객체이다.
  2. 표 형식을 가진다.
  3. 데이터를 체계화하여 행(row)과 열(column)의 집합 형태로 구성한 것이다.
  4. RDB에서는 테이블을 릴레이션(Relation)이라고도 한다.

테이블 구성

  • 행 : 로우(Row), 레코드(Record), 튜플(Tuple)
  • 열 : 칼럼(Column), 필드(Field), 속성(Attribute)
    • 자바에서는 필드(Field), 웹에서는 속성(Attribute)으로 표현

테이블 용어

  • 도메인 : 한 칼럼(Column)이 가질 수 있는 값의 범위(집합)
  • 차수 : Degree, 한 테이블에 있는 칼럼(Column)의 개수
  • 기수 : Cardinality, 한 테이블에 있는 로우(Row)의 개수

테이블 이름 규칙

  • 영문자, 숫자, 특수문자(_, $, #)을 사용할 수 있다
  • 영문자로 시작하고 30자 이내로 한다.
  • 대소문자를 구별하지 않는다. (오라클에 해당)
  • 서로 다른 테이블에서 동일한 데이터를 저장하는 칼럼의 이름은 가능하면 같은 이름을 사용한다.
  • 완성된 설계도(테이블 정의서)에 의해 테이블을 생성하길 권장한다.

‣ 데이터 타입

1. NUMBER(p,s)

  • 정밀도 p, 스케일 s 로 표현하는 숫자 형식(생략 가능)
  1. 정밀도 p : 전체 유효 숫자의 갯수
  2. 스케일 s : 소수부의 유효 숫자의 갯수

2. CHAR(size) : 고정 문자(character)

  1. 글자 수가 고정된 타입(예시 : 핸드폰번호, 주민번호 등)
  2. size : 최대 2000 byte

3. VARCHAR2(size) : 가변 문자

  1. 글자 수가 고정되지 않은 타입(예시 : 이름, 이메일, 주소 등)
  2. size : 최대 4000 byte

4. CLOB : 큰 텍스트 타입

  • 최대 4기가
  • 4000바이트를 넘어가는 텍스트를 저장

5. DATE : 날짜와 시간을 동시에 표현하는 타입

  • 년, 월, 일, 시 , 분, 초

6. TIMESTAMP : 날짜와 시간을 동시에 표현하는 타입

  • 년, 월, 일, 시, 분, 초, 마이크로초(백만분의 1초) -> DATE보다 정밀한 타입

‣ 무결성 제약조건 5가지

1. NOT NULL    ⇒ 필수, NULL값을 허용하지 않음
2. UNIQUE      ⇒ 중복 불가
3. PRIMARY KEY ⇒ 기본키 (NOT NULL + UNIQUE)
4. FOREIGN KEY ⇒ 외래키 (다른 테이블의 값을 참조)
5. CHECK       ⇒ 값의 제한

‣ 실습

테이블 만들기

--고객 테이블
DROP TABLE CUSTOMER_T;
CREATE TABLE CUSTOMER_T (
     NO    NUMBER            NOT NULL PRIMARY KEY
    ,ID    VARCHAR2(32 BYTE) NOT NULL UNIQUE
    ,NAME  VARCHAR2(32 BYTE) NOT NULL
    ,JOB   VARCHAR2(32 BYTE) NULL
    ,PHONE CHAR(13 BYTE)     NULL UNIQUE
    ,JUBUN CHAR(14 BYTE)     NULL UNIQUE     --주민번호

💡테이블 만드는 스크립트 만들 때 CREATE 보다 DROP이 먼저 오도록!
💡💡테이블 삭제는 생성의 역순으로!



‣ 기본키(Primary Key)

(Primary Key, PK, 주키)
  • 유일성 + 최소성의 특징을 가짐
  • 개체 무결성의 특징을 가짐
    NOT NULL : 널(NULL) 값을 가질 수 없음
    UNIQUE : 중복된 값을 가질 수 없음

‣ 외래키(Foreign Key)

  • 다른 테이블의 기본키(PK) 또는 유일키(Unique)관계(Relationship)를 맺을 수 있음
  • 외래키는 참조 무결성의 특징을 가짐
    • 관계를 맺은 테이블의 키(기본키 또는 유일키)의 도메인(Domain)과 동일한 값을 가져야 함(관계를 맺은 테이블에 없는 데이터는 가질 수 없다)
  • 외래키는 중복 가능하고 NULL도 가능
  • 참조 관계에서 기본키를 가진 테이블을 부모 테이블, 외래키를 가진 테이블을 자식 테이블이라고 함


‣ 1:M 관계 (일대다관계)

  • 한 쪽의 엔티티가 관계를 맺은 다른 엔티티 쪽의 여러 객체를 가질 수 있다.

  • 현실 세계에서 가장 흔한 관계이다
    - 예) 어머님이 자식 3명을 낳으셨다. 어머님(1) : 자식(3)

  • 2개의 테이블을 관계 짓는 가장 대표적인 관계이다.

    1 : M
    PK : FK
    부모 : 자식

  • 반드시 부모 테이블을 먼저 만들고, 자식 테이블은 나중에 만들어야 한다.

‣ M:N 관계 (다대다관계)

  • 현실세계에서 빈번히 나타나지만 주의해야 하는 관계이다.
    - 예) 학생들이 수강신청을 한다. 학생도 여러 명(M) : 과목도 여러 과목(N)
  • M:N 관계를 가진 2개의 테이블은 직접 관계를 맺는것이 불가능하다.
  • 관계를 맺기 위한 별도의 테이블이 추가로 필요하다.
  • M:N 관계는 1:M 관계 2개로 구현할 수 있다.

‣ 삭제 옵션

  • ON DELET CASCADE : 외래키가 참조하는 기본키 값이 삭제되면 외래키도 함께 삭제한다.
  • ON DELET SET NULL : 외래키가 참조하는 기본키 값이 삭제되면 외래키를 NULL로 처리한다.
-- 외래키를 지정할 때 함께 작성
/* 프로젝트진행 테이블 */

CONSTRAINT FK_EMP_PCD FOREIGN KEY(EMP_NO)  REFERENCES EMPLOYEE_TBL(EMP_NO) ON DELETE CASCADE  
--사원이 삭제되면 프로젝트진행 명단에서 함께 삭제된다.

CONSTRAINT FK_PJT_PCD FOREIGN KEY(PJT_NO) REFERENCES PROJECT_TBL(PJT_NO)   ON DELETE SET NULL 
-- 프로젝트가 삭제되면 프로젝트진행 명단에서 참조하던 정보만 삭제된다(NULL 처리)


‣ 실습


1:M

  • 자식 테이블(FK)에서 부모 테이블(PK)참조 시, 반드시 동일한 타입을 사용
-- 자식 먼저 지우기
DROP TABLE STUDENT_T;

-- 부모 나중에 지우기
DROP TABLE SCHOOL_T;



-- 부모 먼저 만들기
CREATE TABLE SCHOOL_T (
    SCH_CODE NUMBER            NOT NULL 
  , SCH_NAME VARCHAR2(10 BYTE) NOT NULL
  , CONSTRAINT PK_SCH PRIMARY KEY(SCH_CODE)  --제약조건의 이름은 PK_SCH, SCH_CODE에 PRIMARY KEY 지정 
);

--자식 나중에 만들기
CREATE TABLE STUDENT_T (
    STU_NO   NUMBER NOT NULL 
  , SCH_CODE NUMBER    
  , STU_NAME VARCHAR2(10 BYTE) NOT NULL
  , CONSTRAINT PK_STU PRIMARY KEY(STU_NO)  --제약조건의 이름은 PK_STU, STU_NO에 PRIMARY KEY 지정
  , CONSTRAINT FK_SCH_STU FOREIGN KEY(SCH_CODE) REFERENCES SCHOOL_T(SCH_CODE) ON DELETE CASCADE  -- 제약조건의 이름은 FK_SCH_STU, SCH_CODE는 SCHOOL_T 테이블의 SCH_CODE를 참조한다.
);

M:N

-- 삭제는 생성의 역순으로 진행
DROP TABLE ENROLL_T;
DROP TABLE SUBJECT_T;
DROP TABLE UNIV_STUDENT_T;



-- 학생 테이블
CREATE TABLE UNIV_STUDENT_T (
    STU_NO   NUMBER            NOT NULL
  , STU_NAME VARCHAR2(10 BYTE) NOT NULL
  , AGE      NUMBER
  , CONSTRAINT PK_UNIV_STU PRIMARY KEY(STU_NO)
);



-- 과목 테이블
CREATE TABLE SUBJECT_T (
    SBJ_CODE  VARCHAR2(5 BYTE)  NOT NULL
  , SBJ_NAME  VARCHAR2(10 BYTE) NOT NULL
  , PROFESSOR VARCHAR2(10 BYTE) NOT NULL
  , CONSTRAINT PK_SBJ PRIMARY KEY(SBJ_CODE)
);



-- 수강신청 테이블
CREATE TABLE ENROLL_T(
    EN_NO    NUMBER NOT NULL  --학번
  , STU_NO   NUMBER           
  , SBJ_CODE VARCHAR2(5 BYTE) 
  
  , CONSTRAINT PK_EN PRIMARY KEY(EN_NO)
  , CONSTRAINT FK_UNIV_STU_EN FOREIGN KEY(STU_NO) REFERENCES UNIV_STUDENT_T(STU_NO)
  , CONSTRAINT FK_SBJ_EN FOREIGN KEY(SBJ_CODE) REFERENCES SUBJECT_T(SBJ_CODE)
);


관계실습 (부서, 사원, 프로젝트, 진행)

-- 삭제는 생성의 역순으로 진행
DROP TABLE PROCEEDING_TBL;
DROP TABLE PROJECT_TBL;
DROP TABLE EMPLOYEE_TBL;
DROP TABLE DEPARTMENT_TBL;



--1번 '부서 테이블' 만들기 실습 (+제약조건 바꿔주기)
CREATE TABLE DEPARTMENT_TBL (
    DEPT_NO       VARCHAR2(15 BYTE) NOT NULL                --부서번호
  , DEPT_NAME     VARCHAR2(30 BYTE) NULL                    --부서명
  , DEPT_LOCATION VARCHAR2(50 BYTE) NULL                    --부서위치
  
  , CONSTRAINT PK_DEP PRIMARY KEY(DEPT_NO)                  --제약조건의 이름은 PK_DEP, DEPT_NO에 PRIMARY KEY 지정
);



--2번 '사원 테이블' 만들기 실습(+제약조건 바꿔주기)
CREATE TABLE EMPLOYEE_TBL (
    EMP_NO    NUMBER            NOT NULL                              --사원번호
  , DEPT_NO   VARCHAR2(15 BYTE) NULL                                  --부서번호
  , POSITION  CHAR(10 BYTE)     NULL                                  --직급  
  , NAME      VARCHAR2(15 BYTE) NULL                                  --이름
  , HIRE_DATE DATE              NULL                                  --입사일자
  , SALARY    NUMBER            NULL                                  --연봉
  
  , CONSTRAINT PK_EMP PRIMARY KEY(EMP_NO)
  , CONSTRAINT FK_DEP_EMP FOREIGN KEY(DEPT_NO) REFERENCES DEPARTMENT_TBL(DEPT_NO) ON DELETE SET NULL  --부서가 삭제되면 사원들의 해당 부서 정보만 NULL처리한다.
);



--3번 '프로젝트 테이블' 만들기 실습(+제약조건 바꿔주기)
CREATE TABLE PROJECT_TBL (
    PJT_NO     NUMBER            NOT NULL              --프로젝트 번호
  , PJT_NAME   VARCHAR2(30 BYTE) NULL                  --프로젝트명
  , BEGIN_DATE DATE              NULL                  --시작일자
  , END_DATE   DATE              NULL                  --종료일자
  
  , CONSTRAINT PK_PJT PRIMARY KEY(PJT_NO)
);


--4번 '프로젝트진행 테이블' 만들기 실습(+제약조건 바꿔주기)
CREATE TABLE PROCEEDING_TBL (
    PCD_NO    NUMBER NOT NULL                          --진행번호
  , EMP_NO    NUMBER NOT NULL                          --사원번호                    --NOT NULL 추가 (ON DELETE 시 SET NULL 불가)
  , PJT_NO    NUMBER NOT NULL                          --프로젝트 번호               --NOT NULL 추가 (ON DELETE 시 SET NULL 불가)
  , PJT_STATE NUMBER NOT NULL                          --프로젝트 진행상태
  
  , CONSTRAINT PK_PCD PRIMARY KEY(PCD_NO)
  , CONSTRAINT FK_EMP_PCD FOREIGN KEY(EMP_NO)  REFERENCES EMPLOYEE_TBL(EMP_NO) ON DELETE CASCADE  --사원이 삭제되면 프로젝트진행 명단에서 함께 삭제된다.
  , CONSTRAINT FK_PJT_PCD FOREIGN KEY(PJT_NO) REFERENCES PROJECT_TBL(PJT_NO)   ON DELETE CASCADE  -- 프로젝트가 삭제되면 프로젝트진행 명단에서 함께 삭제된다
);



‣ 테이블 구조 확인하기(DESCRIBE)

DESCRIBE BANK_TBL;
DESC CUSTOMER_TBL;
-- DESCRIBE는 최대 4글자까지 줄여써도 실행이 가능하다.
-- (DESCRIB, DESCRI, DESCR, DESC)

✍️한줄평
테이블의 관계를 이해하게 되니 보이는게 많아져서 더 재밌다.

profile
개발이 세상에서 제일 재밌어요

0개의 댓글