
테이블(Table)이란?
- 데이터베이스에서 데이터를 저장하는 객체이다.
- 표 형식을 가진다.
- 데이터를 체계화하여 행(row)과 열(column)의 집합 형태로 구성한 것이다.
- RDB에서는 테이블을 릴레이션(Relation)이라고도 한다.
테이블 구성
- 행 : 로우(Row), 레코드(Record), 튜플(Tuple)
- 열 : 칼럼(Column), 필드(Field), 속성(Attribute)
- 자바에서는 필드(Field), 웹에서는 속성(Attribute)으로 표현
테이블 용어
- 도메인 : 한 칼럼(Column)이 가질 수 있는 값의 범위(집합)
- 차수 : Degree, 한 테이블에 있는 칼럼(Column)의 개수
- 기수 : Cardinality, 한 테이블에 있는 로우(Row)의 개수
테이블 이름 규칙
- 영문자, 숫자, 특수문자(_, $, #)을 사용할 수 있다
- 영문자로 시작하고 30자 이내로 한다.
- 대소문자를 구별하지 않는다. (오라클에 해당)
- 서로 다른 테이블에서 동일한 데이터를 저장하는 칼럼의 이름은 가능하면 같은 이름을 사용한다.
- 완성된 설계도(테이블 정의서)에 의해 테이블을 생성하길 권장한다.
NUMBER(p,s)정밀도 p, 스케일 s 로 표현하는 숫자 형식(생략 가능)p : 전체 유효 숫자의 갯수s : 소수부의 유효 숫자의 갯수 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이 먼저 오도록!
💡💡테이블 삭제는 생성의 역순으로!
NOT NULL : 널(NULL) 값을 가질 수 없음UNIQUE : 중복된 값을 가질 수 없음기본키(PK) 또는 유일키(Unique)와 관계(Relationship)를 맺을 수 있음기본키를 가진 테이블을 부모 테이블, 외래키를 가진 테이블을 자식 테이블이라고 함
한 쪽의 엔티티가 관계를 맺은 다른 엔티티 쪽의 여러 객체를 가질 수 있다.
현실 세계에서 가장 흔한 관계이다
- 예) 어머님이 자식 3명을 낳으셨다. 어머님(1) : 자식(3)2개의 테이블을 관계 짓는 가장 대표적인 관계이다.
1 : M
PK : FK
부모 : 자식
부모 테이블을 먼저 만들고, 자식 테이블은 나중에 만들어야 한다.
- 현실세계에서 빈번히 나타나지만 주의해야 하는 관계이다.
- 예) 학생들이 수강신청을 한다.학생도 여러 명(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 처리)
자식 테이블(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를 참조한다.
);
-- 삭제는 생성의 역순으로 진행
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 BANK_TBL;
DESC CUSTOMER_TBL;
-- DESCRIBE는 최대 4글자까지 줄여써도 실행이 가능하다.
-- (DESCRIB, DESCRI, DESCR, DESC)
✍️한줄평
테이블의 관계를 이해하게 되니 보이는게 많아져서 더 재밌다.