◈ 데이터베이스의 객체(테이블,뷰,시퀀스,인덱스,동의어,사용자 등)을 관리하기 위한 명령
◈ 테이블(TABLE) : 데이터베이스에서 데이터(행)을 저장하기 위한 가장 기본적인 객체
◈ 테이블 생성 : 테이블 속성(ATTRIBUTE)의 집합
형식)CREATE TABLE 테이블명(컬럼명 자료형[(크기)][DEFAULT 기본값] [컬럼제약조건],
컬럼명 자료형[(크기)][DEFAULT 기본값] [컬럼제약조건],...[,테이블제약조건])
◈ 식별자 작성 규칙 : 테이블명, 컬럼명, 별칭, 라벨명 등
1. 영문자로 시작되며 1~30 범위의 문자들로 구성
2. A~Z, 0~9, _, $, # 문자들을 조합하여 작성 - 대소문자 미구분 : 스네이크 표기법을 사용하는 것을 권장
3. 영문자외 다른 문자 사용 가능 - 비권장
4. 키워드로 식별자를 선언할 경우 에러 발생 - " "안에 표현하면 가능하지만 비권장
◈ 자료형(DATATYPE) : 컬럼에 저장 가능한 값을 표현하기 위한 키워드
1. 숫자형 : ⭐NUMBER[(전체자릿수,소숫점자리수)]
2. 문자형 :
① CHAR(크기) - 크기 : 1~2000(BYTE) >> 고정형 길이
② ⭐VARCHAR2(크기) - 크기 : 1~4000(BYTE) >> 가변 길이
③ LONG : 최대 2GBYTE 저장 >> 가변 길이 - 테이블에 하나의 컬럼에만 설정 가능하며 정렬 불가능
④ CLOB : 최대 4GBYTE 저장 >> 가변 길이 - 인코딩 처리된 문자값이 저장된 텍스트
파일을 저장하기 위한 자료형
⑤ BLOB : 최대 4GBYTE 저장 >> 가변 길이 - 원시값이 저장된 일반(이진) 파일을
저장하기 위한 자료형
3. 날짜형 :
① ⭐DATE - 날짜와 시간
② TIMESTAMP - 초(MS)단위 시간
▦ SALESMAN 테이블 생성 - 사원번호(숫자형),사원이름(문자형),입사일(날짜형)
CREATE TABLE SALESMAN(NO NUMBER(4),NAME VARCHAR2(20),STARTDATE DATE);
4일차 보충해야함
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
◈ MANAGER 테이블 생성 - 사원번호(숫자형),사원이름(문자형),입사일(날짜형-기본값:현재),급여(숫자형-기본값:1000)
◈ 기본값을 설정하여 테이블 생성CREATE TABLE MANAGER(NO NUMBER(4),NAME VARCHAR2(20), STARTDATE DATE DEFAULT SYSDATE,PAY NUMBER DEFAULT 1000);
◈ 테이블 목록 및 구조 확인
SELECT TABLE_NAME FROM USER_TABLES;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC MANAGER;
◈ USER_TAB_COLUMNS : 테이블의 컬럼 정보를 제공하는 딕셔너리
SELECT COLUMN_NAME,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME='MANAGER';
◈ MANAGER 테이블에 행 삽입 - 컬럴생략 : 생략된 컬럼에는 기본값이 전달되어 삽입 처리
INSERT INTO MANAGER(NO,NAME) VALUES(1000,'홍길동');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM MANAGER;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ DEFAULT 키워드를 사용하여 기본값을 전달받아 삽입 처리
INSERT INTO MANAGER VALUES(2000,'임꺽정',DEFAULT,DEFAULT);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM MANAGER;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ 컬럼 수준의 제약조건 : 테이블의 속성 선언시 컬럼에 제약조건을 설정
◈ 테이블 수준의 제약조건 : 테이블 선언시 테이블의 특정 컬럼에 제약조건을 설정
: 컬럼값에 대한 조건을 제공하여 조건에 맞는 값만 저장되도록 설정하는 제약조건
◈ 컬럼 수준의 제약조건 또는 테이블 수준 제약조건으로 설정 가능
▦ SAWON1 테이블 생성 - 사원번호(숫자형),사원이름(문자형),급여(숫자형)
CREATE TABLE SAWON1(NO NUMNER(4),NAME VARCHAR2(20),PAY NUMBER);
※ 숫자형에는 크기를 꼭 안줘도 가능
───────────────────────────────────────
◈ SAWON1 테이블에 행 삽입 - 모든 숫자값이 급여(PAY)에 전달되어 삽입 처리 가능INSERT INTO SAWON1 VALUES(1000,'홍길동',8000000);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO SAWON1 VALUES(2000,'임꺽정',800000);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM SAWON1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ SAWON2 테이블 생성 - 사원번호(숫자형),사원이름(문자형),급여(숫자형 - 최소급여:5000000)
◈ 컬럼수준의 제약조건 : CHECK 제약조건을 설정하는 컬럼만으로 CHECK 제약조건의 조건식 작성
CREATE TANLE SAWON2(NO NUMBER(4),NAME VARCHAR2(20),PAY NUMBER CHECK(PAY>=5000000));
※ 컬럼수준의 제약조건
───────────────────────────────────────
◈ SAWON2 테이블에 행 삽입INSERT INTO SAWON1 VALUES(1000,'홍길동',8000000);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO SAWON1 VALUES(2000,'임꺽정',800000);
※ 에러 발생 : CHECK 제약조건을 위반하여 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM SAWON2;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ USER_CONSTRAINTS : 테이블에 설정된 제약조건을 제공하는 딕셔너리
◈ CONSTRAINT_NAME : 제약조건을 구분하기 위한 이름(식별자)
→ 제약조건의 이름을 설정하지 않으면 SYS_XXXXXXX 형식으로 자동 설정
◈ CONSTRAINT_TYPE : 제약조건의 종류 - C(CHECK), U(UNIQUE), P(PRIMARY KEY), R(REFERENCE)
◈ SEARCH_CONDITION : CHECK 제약조건으로 설정된 조건식SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='SAWON2';
◈ 제약조건을 설정할 경우 제약조건 관리를 효울적으로 하기 위해 제약조건의 이름을 명시하는 것을 권장
형식) 컬럼명 자료형[(크기)] CONSTRAINT 제약조건명 제약조건▦ SAWON3 테이블 생성 - 사원번호(숫자형),사원이름(문자형),급여(숫자형 - 최소급여:5000000)
CREATE TABLE SAWON3(NO NUMBER(4),NAME VARCHAR2(20), PAY NUMBER CONSTRAINT SAWON3_PAY_CHECK CHECK(PAY>=5000000));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
◈제약조건 확인SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='SAWON3';
▦SAWON4 테이블 생성 - 사원번호(숫자형),사원이름(문자형),급여(숫자형 - 최소급여:5000000)
◈ 테이블 수준의 제약조건으로 설정 - 테이블 수준의 제약조건은 모든 컬럼을 사용하여 CHECK 제약조건의 조건식 작성 가능
CREATE TABLE SAWON4(NO NUMBER(4),NAME VARCHAR2(20), PAY NUMBER,CONSTRAINT SAWON4_PAY_CHECK CHECK(PAY>=5000000));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
◈ 제약조건 확인SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='SAWON4';
: NULL를 허용하지 않는 제약조건 - 컬럼에 반드시 값이 저장되도록 설정하는 제약조건
◈ 컬럼 수준의 제약조건만 가능
▦ DEPT1 테이블 생성 : 부서번호(숫자형),부서이름(문자형),부서위치(문자형)
CREATE TABLE DEPT1(DEPTNO NUMBER(2),DNAME VARCHAR2(12),LOC VARCHAR2(11));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC DEPT1;
───────────────────────────────────────
◈ DEPT1 테이블에 행 삽입INSERT INTO DEPT1 VALUES(10,'총무부','서울시');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT1 VALUES(20,NULL,NULL);
※ 명시적 NULL 사용
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT1(DEPTNO) VALUES(30);
※ 묵시적 NULL 사용
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT1;
▦ DEPT2 테이블 생성 : 부서번호(숫자형 - NOT NULL),부서이름(문자형 - NOT NULL),부서위치(문자형 - NOT NULL)
CREATE TABLE DEPT2(DEPTNO NUMBER(2) CONSTRAINT DEPT2_DEPTNO_NN NOT NULL, DNAME VARCHAR2(12) CONSTRAINT DEPT2_DNAME_NN NOT NULL, LOC VARCHAR2(1) CONSTRAINT DEPT2_LOC_NN NOT NULL);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESE DEPT2;
───────────────────────────────────────
◈ 제약조건 확인 : NOT NULL 제약조건의 종류는 [C]로 표현SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='DEPT2'
───────────────────────────────────────
◈ DEPT2 테이블에 행 삽입INSERT INTO DEPT2 VALUES(10,'총무부','서울시');
※ 에러 발생 : NOT NULL 제약조건이 설정된 컬럼에 NULL을 전달할 경우 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT1 VALUES(10,NULL,NULL);
※ 에러 발생 : NOT NULL 제약조건이 설정된 컬럼에 NULL을 전달할 경우 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT2(DEPTNO) VALUES(30);
※ 에러 발생 : 생략된 컬럼의 기본값이 NULL인 경우 컬럼에 NOT NULL 제약조건이
설정되어 있으면 에러 발생
: 중복된 컬럼값 저장을 방지하기 위한 제약조건
◈ 컬럼 수준의 제약조건 또는 테이블 수준의 제약조건으로 설정가능
◈ 테이블의 여러 컬럼에 UNIQUE 제약조건이 설정이 가능하며 NULL 허용
▦ USER1 테이블 생성 - 아이디(문자형),이름(문자형),전화번호(문자형)
CREATE TABLE USER1(ID VARCHAR2(20),NAME VARCHAR2(30),PHONE VARCHAR(15));
※ 제약 조건 없음
───────────────────────────────────────
◈ USER1 테이블에 행 삽입INSERT INTO USER1 VALUES('ABC','홍길동','010-1234-5678');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER1 VALUES('ABC','홍길동','010-1234-5678');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ USER2 테이블 생성 - 아이디(문자형-UNIQUE),이름(문자형),전화번호(문자형-UNIQUE)
CREATE TABLE USER2(ID VARCHAR2(20) CONSTRAINT USER2_ID_UK UNIQUE, NAME VARCHAR2(30), PHONE VARCHAR2(15) CONSTRAINT USER2_PHONE_UK UNIQUE);
※ 컬럼 수준의 제약조건
───────────────────────────────────────
◈ 제약조건 확인SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER2';
───────────────────────────────────────
◈ USER2 테이블에 행 삽입INSERT INTO USER2 VALUES('ABC','홍길동','010-1234-5678');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER2 VALUES('ABC','임꺽정','010-5678-1234');
※ 에러 발생 : ID 컬럼값 중복에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER2 VALUES('XYZ','임꺽정','010-1234-5678');
※ 에러 발생 : PHONE 컬럼값 중복에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER2 VALUES('ABC','홍길동','010-1234-5678');
※ 에러 발생 : ID 컬럼값과 PHONE 컬럼값 중복에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER2 VALUES('XYZ','임꺽정','010-5678-1234');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER2;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ UNIQUE 제약조건이 설정된 컬럼에 NULL을 전달하여 삽이 처리 가능
INSERT INTO USER2 VALUES('ASD','전우치',NULL);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
◈ NULL은 값이 아니므로 UNIQUE 제약조건의 영향을 받지 중복유무와 상관없이 삽입 처리 가능INSERT INTO USER2 VALUES('QWE','일지매',NULL);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER2;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ USER3 테이블 생성 - 아이디(문자형-UNIQUE),이름(문자형),전화번호(문자형-UNIQUE)
CREATE TANLE USER3(ID VARCHAR2(20),NAME VARCHAR2(30),PHONE VARCHAR2(15), CONSTRAINT USER3_ID_UK UNIQUE(ID),CONSTRAINT USER3_PHONE_UK UNIQUE(PHONE));
※ 테이블 수준의 제약조건
───────────────────────────────────────
◈ 제약조건 확인 - USER3 테이블에는 ID 컬럼 또는 PHONE 컬럼에 중복된 값 저장 방지SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER3';
───────────────────────────────────────
◈ USER3 테이블에 행 삽입INSERT INTO USER3 VALUES('ABC','홍길동','010-1234-5678');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER3 VALUES('ABC','임꺽정','010-5678-1234');
※ 에러 발생 : ID 컬럼값 중복에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER3 VALUES('XYZ','임꺽정','010-1234-5678');
※ 에러 발생 : PHONE 컬럼값 중복에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER3 VALUES('ABC','홍길동','010-1234-5678');
※ 에러 발생 : ID 컬럼값과 PHONE 컬럼값 중복에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER2 VALUES('XYZ','임꺽정','010-5678-1234');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER3;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ UNIQUE 제약조건은 테이블 수준의 제약조건을 사용하여 컬럼을 그룹하여
중복 저장되는 것을 방지▦ USER3 테이블 생성 - 아이디(문자형),이름(문자형),전화번호(문자형) : 아이디와 전화번호를 그룹화하여 UNIQUE 제약조건 설정
CREATE TANLE USER4(ID VARCHAR2(20),NAME VARCHAR2(30),PHONE VARCHAR2(15), CONSTRAINT USER4_ID_PHONE_UK UNIQUE(ID,PHONE));
───────────────────────────────────────
◈ 제약조건 확인SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER4';
───────────────────────────────────────
◈ USER4 테이블에 행 삽입INSERT INTO USER4 VALUES('ABC','홍길동','010-1234-5678');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER4 VALUES('ABC','임꺽정','010-5678-1234');
※ ID 컬럼값이 중복돼도 저장 가능
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER4 VALUES('XYZ','임꺽정','010-1234-5678');
※ PHONE 컬럼값이 중복돼도 저장 가능
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO USER4 VALUES('ABC','홍길동','010-1234-5678');
※ 에러 발생 : ID 컬럼값과 PHONE 컬럼값이 중복될 경우 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER4;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
: 중복된 컬럼값 저장을 방지하기 위한 제약조건
◈ 컬럼 수준의 제약조건 또는 테이블 수준의 제약조건 설정 가능
◈ PRIMARY KEY 제약조건은 테이블에서 하나의 컬럼에만 설정 가능하며 NULL 미허용
◈ PRIMARY KEY 제약조건은 테이블에 하나만 설정하므로 제약조건의 이름 설정 생략 가능
◈ 테이블에서 행을 구분할 수 있는 고유값이 저장된 컬럼에 PRIMARY KEY 제약조건 설정
◈ PRIMARY KEY 제약조건은 테이블의 관계를 구체화하기 위해 반드시 설정해야 되는 제약조건
▦ MGR1 테이블 생성 - 사원번호(숫자형 - PRIMARY KEY),사원이름(문자형),입사일(날짜형)
CREATE TABLE MGR1(NO NUMBER(4) CONSTRAINT MGR1_NO_PK PRIMARY KEY, NAME VARCHAR2(20),STARTDATE DATE);
※ 컬럼 수준의 제약조건
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC MGR1;
※ PRIMARY KEY 제약조건에 의해 NO 컬럼은 자동으로 NOT NULL 설정
───────────────────────────────────────
◈ 제약조건 확인SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='MGR1';
───────────────────────────────────────
◈ MGR1 테이블에 행 삽입INSERT INTO MGR1 VALUES(1000,'홍길동',SYSDATE);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO MGR1 VALUES(1000,'임꺽정',SYSDATE);
※ 에러 발생 : NO 컬럼에 중복값을 전달한 경우 PRIMARY KEY 제약조건에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO MGR1 VALUES(NULL,'임꺽정',SYSDATE);
※ 에러 발생 : PRIMARY KEY 제약조건이 설정된 컬럼에 NULL을 전달할 경우 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO MGR1 VALUES(2000,'임꺽정',SYSDATE);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM MGR1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ MGR2 테이블 생성 - 사원번호(숫자형 - PRIMARY KEY),사원이름(문자형),입사일(날짜형)
CREATE TABLE MGR2(NO NUMBER(4),NAME VARCHAR2(20), STARTDATE DATE, CONSTRAINT MGR2_NO_PK PRIMARY KEY(NO));
※ 테이블 수준의 제약조건
───────────────────────────────────────
◈ 제약조건 확인SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='MGR2';
: 부모 테이블에 저장된 행의 컬럼값을 참조하여 자식 테이블의 컬럼에 비정상적인
값이 저장되는 것을 방지하는 제약조건
◈ 테이블 수준의 제약조건만 설정 가능
◈ 부모 테이블의 PRIMARY KEY 제약조건이 설정된 컬럼을 참조하여 자식 테이블의
컬럼에 FOREIGN KEY 제약조건 설정
▦ SUBJECT1 테이블 생성 : 과목코드(숫자형 - PRIMARY KEY),과목명(문자형) : 부모 테이블
CREATE TABLE SUBJECT1(SNO NUMBER(2) CONSTRAINT SUBJECT1_SNO_PK PRIMARY KEY, SNAME VARCHAR2(20));
───────────────────────────────────────
◈ SUBJECT1 테이블에 행 삽입INSERT INTO SUBJECT1 VALUES(10,'JAVA'); INSERT INTO SUBJECT1 VALUES(20,'JSP'); INSERT INTO SUBJECT1 VALUES(30,'SPRING');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM SUBJECT1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ TRAINEE1 테이블 생성 : 수강생번호(숫자형 - PRIMARY KEY),수강생이름(문자형),수강과목코드(숫자형)
CREATE TABLE TRAINEE1(TNO NUMBER(4) CONSTRAINT TRAINEE1_TNO_PK PRIMARY KEY, TNAME VARCHAR2(20),SCODE NUMNER(2));
───────────────────────────────────────
◈ TRAINEE1 테이블 행 상입INSERT INTO TRAINEE1 VALUES(1000,'홍길동',10); INSERT INTO TRAINEE1 VALUES(2000,'임꺽정',20); INSERT INTO TRAINEE1 VALUES(3000,'전우치',30); INSERT INTO TRAINEE1 VALUES(4000,'일지매',40);
※ 수강생 번호가 중복안되서 잘 저장됨
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM TRAINEE1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ TRAINEE1 테이블과 SUBJECT1 테이블에서 모든 수강생의 수강생번호,수강생이름,수강과목명 검색
◈ 결합조건 : TRAINEE1 테이블의 수강과목코드(SCODE)와 SUBJECT1 테이블의 과목코드(SNO)가 같은 행을 결합하여 검색 - INNER JOIN
◈ INNER JOIN은 결합조건이 맞는 행만 결합하여 검색 - 결합조건이 맞지 않는 행 미검색(일지매)
◈ 테이블 결합시 결합조건에 맞지 않는 컬럼값이 저장되어 있는 경우 잘못된 결과를 제공
→ 데이터 무결성 위반SELECT TNO,TNAME,SNAME FROM TRAINEE1 JOIN SUBJECT1 ON SCODE=SNO;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
◈ OUTER JOIN 사용하여 결합조건이 맞지 않는 행은 NULL과 결합하여 검색SELECT TNO,TNAME,SNAME FROM TRAINEE1 LEFT OUTET JOIN SUBJECT1 ON SCODE=SNO;
▦ TRAINEE2 테이블 생성 : 수강생번호(숫자형 - PRIMARY KEY),수강생이름(문자형),수강과목코드(숫자형 - FOREIGN KEY) : 자식 테이블
◈ TRAINEE2 테이블의 수강과목코드(SCODE)는 SUBJECT1 테이블의 과목코드(SNO)를 참조하도록 FROEIGN KEY 제약조건 설정
◈ 자식 테이블이 참조하는 부모 테이블의 컬럼은 반드시 PRIMARY KEY 제약조건이
설정되어 있어야 참조 가능 - 테이블의 관계 형성CREATE TABLE TRAINEE2(TNO NUMBER(4) CONSTRAINT TRAINEE2_TNO_PK PRIMARY KEY, TNAME VARCHAR2(20), SCODE NUMNER(2),CONSTRAINT TRAINEE2_SCODE_FK FOREIGN KEY(SCODE) REFERENCES SUBJECT1(SNO);
───────────────────────────────────────
◈ 제약조건 확인
◈ R_CONSTRINT_NAME : 참조하는 부모 테이블의 컬럼에 설정된 PRIMARY KEY 제약조건의 이름SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,R_CONSTRINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME='TRAINEE2';
───────────────────────────────────────
◈ TRAINEE2 테이블 행 상입INSERT INTO TRAINEE2 VALUES(1000,'홍길동',10); INSERT INTO TRAINEE2 VALUES(2000,'임꺽정',20); INSERT INTO TRAINEE2 VALUES(3000,'전우치',30);
───────────────────────────────────────
◈ FOREIGN KEY 제약조건이 설정된 컬럼에 부모 테이블의 참조 컬럼에 저장되지 않은 값을 전달할 경우 참조가 불가능 하여 에러 발생INSERT INTO TRAINEE2 VALUES(4000,'일지매',40);
※ 에러 발생 : FOREIGN KEY 제약조건을 위반하여 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM TRAINEE2;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ TRAINEE2 테이블과 SUBJECT1 테이블에서 모든 수강생의 수강생번호,수강생이름,수강과목명 검색
◈ 결합조건 : TRAINEE2 테이블의 수강과목코드(SCODE)와 SUBJECT1 테이블의 과목코드(SNO)가 같은 행을 결합하여 검색 - INNER JOIN
SELECT TNO,TNAME,SNAME FROM TRAINEE2 JOIN SUBJECT1 ON SCODE=SNO;
▦ TRAINEE2 테이블에서 수강생번호가 1000인 수강생의 과목코드를 40으로 변경
◈ FOREIGN KEY 제약조건이 설정된 컬럼에 부모 테이블의 참조 컬럼에 저장되지 않은
값을 전달할 경우 참조가 불가능 하여 에러 발생UPDATE TRAINEE2 SET SCODE=40 WHERE TNO=1000;
※ 에러 발생 : FOREIGN KEY 제약조건을 위반하여 에러 발생
▦SUBJECT1 테이블에서 과목코드가 10인 과목정보 삭제
◈ FOREIGN KEY 제약조건이 설정된 자식 테이블의 컬럼이 참조하는 부모 테이블의
컬럼값이 포함된 행을 삭제할 경우 에러 발생DELETE FROM SUBJECT1 WHERE SNO=10;
※ 에러 발생 : FOREIGN KEY 제약조건을 위반하여 에러 발생
───────────────────────────────────────
◈ 자식 테이블의 컬럼이 참조하는 부모 테이블의 컬럼값 검색
→ 검색된 컬럼값이 저장된 부모 테이블의 행은 삭제 불가능SELECT DISTINCT SCODE FROM TRAINEE2;
※ 검색결과 : 10,20,30
▦ SUBJECT2 테이블 생성 : 과목코드(숫자형 - PRIMARY KEY),과목명(문자형) : 부모 테이블
CREATE TABLE SUBJECT2(SNO NUMBER(2) CONSTRAINT SUBJECT2_SNO_PK PRIMARY KEY, SNAME VARCHAR2(20));
───────────────────────────────────────
◈ SUBJECT2 테이블에 행 삽입INSERT INTO SUBJECT2 VALUES(10,'JAVA'); INSERT INTO SUBJECT2 VALUES(20,'JSP'); INSERT INTO SUBJECT2 VALUES(30,'SPRING');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM SUBJECT2;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ TRAINEE3 테이블 생성 : 수강생번호(숫자형 - PRIMARY KEY),수강생이름(문자형),수강과목코드(숫자형 - FOREIGN KEY) : 자식 테이블
◈ TRAINEE3 테이블의 수강과목코드(SCODE)는 SUBJECT2 테이블의 과목코드(SNO)를
참조하도록 FROEIGN KEY 제약조건 설정
◈ FOREIGN KEY 제약조건을 설정할 경우 ON DELETE CASCADE 또는 ON DELETE SET NULL
기능 추가
◈ ON DELETE CASCADE : 부모 테이블의 행을 삭제할 경우 자식 테이블에 참조 컬럼값이
저장된 행도 같이 삭제하는 기능 제공
◈ ON DELETE SET NULL : 부모 테이블의 행을 삭제할 경우 자식 테이블에 참조
컬럼값을 NULL로 변경하는 기능 제공CREATE TABLE TRAINEE3(TNO NUMBER(4) CONSTRAINT TRAINEE3_TNO_PK PRIMARY KEY, TNAME VARCHAR2(20), SCODE NUMBER(2), CONSTRAINT TRAINEE3_SCODE_FK FOREIGN KEY(SCODE) REFERENCES SUBJECT2(SNO) ON DELETE CASCADE);
───────────────────────────────────────
◈ TRAINEE3 테이블 행 상입INSERT INTO TRAINEE3 VALUES(1000,'홍길동',10); INSERT INTO TRAINEE3 VALUES(2000,'임꺽정',20); INSERT INTO TRAINEE3 VALUES(3000,'전우치',30);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM TRAINEE3;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ SUBJECT2 테이블에서 과목코드가 10인 과목정보 삭제
DELETE FROM SUBJECT2 WHERE SNO=10;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM SUBJECT2;
───────────────────────────────────────
◈ ON DELETE CASCADE 옵션에 의해 TRAINEE3 테이블에 저장된 수강생 중 10번 과목을
수강하는 모든 수강생정보 삭제SELECT * FROM TRAINEE3;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;