DDL(Data Definition Language) : 데이터 정의 언어 란?
다른말로 데이터 정의어,
오라클에서 제공하는 객체를 새로 만들고, 구조를 변경하고, 구조 자체를 삭제하는 즉
실제 데이터 값이 아닌 규칙 자체를 정의하는 언어이다.
그럼 오라클에선 무슨 객체(구조)가 있을까?
- 테이블
- 뷰
- 시퀀스
- 인덱스
- 패키지
- 트리거
- 프로시저
- 함수
- 동의어
- 사용자
이렇게 존재하며 차차 알아가게 될 것 같다.
오늘은 DDL에 대해 다뤄보겠다 !
먼저 DDL의 첫 번째
생성을 담당하는
CREATE
객체(테이블)을 생성하는 구문
테이블이란?
- 행과 열로 구성되는 가장 기본적인 데이터베이스 객체, 모든 데이터들은 테이블을 통해서 저장된다.
[사용법]
CREATE TABLE 테이블명(
컬럼명 자료형(크기),
컬럼명 자료형(크기),
컬럼명 자료형,
...
혹시나 자료형을 잊었을 수 있으니 자료형에 대해 잠깐 복습해보자 !
*자료형 -문자(CHAR(바이트크기) | VARCHAR2(바이트크기))
CHAR : 최대 2000바이트까지 지정가능 / 고정길이(고정된 글자수의 데이터가 담길 경우)
(지정한 크기보다 더 작은 값이 들어오면 공백으로라도 채워서 처음 지정한 크기를 만들어준다)
VARCHAR2 : 최대 4000바이트까지 지정가능 / 가변길이(몇 글자의 데이터가 담길지 모르는 경우)
(담긴 값에 따라서 공간 크기가 맞춰짐)
숫자(NUMBER)
날짜(DATE)
SQL언어에서 자료형엔 딱히 특이한게 없고 사용하기 편리한 구조로 되어있으니 기억을 잘 해놓자
- 회원에 대한 데이터를 담기위한 테이블 MEMBER 생성
CREATE TABLE MEMBER(
MEM_NO NUMBER,
MEM_ID VARCHAR2(20),
MEM_PWD VARCHAR2(20),
MEM_NAME VARCHAR2(20),
GENDER CHAR(3), //남, 여 로 받기때문에 3BYTE, 한글은? : 한 글자에 3바이트!
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
MEM_DATE DATE
);
CREATE 쿼리를 실행했는데 컬럼만 잔뜩 나왔다.
당연하다 우리는 테이블의 컬럼만 생성한 것이고 값을 넣어주지 않았으니 빈 테이블이(컬럼만 있는) 나오게 된다.
컬럼에 주석달기
CCOMMENT ON COLUMN 테이블명.컬럼명 IS "주석내용";
TIP)잘못 작성시 새로 수정하면 된다.
COMMENT ON COLUMN MEMBER.MEM_NO IS '회원번호';
COMMENT ON COLUMN MEMBER.MEM_ID IS ' 회원아이디';
COMMENT ON COLUMN MEMBER.MEM_PWD IS '회원비밀번호';
COMMENT ON COLUMN MEMBER.MEM_NAME IS '회원명';
COMMENT ON COLUMN MEMBER.GENDER IS '성별';
COMMENT ON COLUMN MEMBER.PHONE IS '전화번호';
COMMENT ON COLUMN MEMBER.EMAIL IS '이메일';
COMMENT ON COLUMN MEMBER.MEM_DATE IS '회원가입일';
이런식으로 주석을 달아서 가독성을 높일 수 있다.
DROP
테이블 삭제하는 구문
[사용법]
DROP TABLE 테이블명;
DROP TABLE MEMBER;
이렇게 하면 되는데 솔직히 테이블을 만들어놓고 삭제할 일은 거의 없을 것 같다는 생각이 든다.
INSERT
테이블에 데이터를 추가시키는 구문
[사용법]
INSERT INTO 테이블명 VALUES(값1, 값2, 값3...멤버 테이블의 각 컬럼의 행 만큼 값을 넣어줘야함)
그럼 위에 만든 MEMBER 테이블에 값을 넣어보자.
INSERT INTO MEMBER
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'SDFSE@GAGF2341', '24/02/23');
*주의사항
INSERT INTO MEMBER
VALUES( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
테이블에 널만 들어가 있다면 오류가 발생하게된다. (하지마라는 뜻)
제약조건
원하는 데이터값(유효한 형식의 값)만 유지하기 위해서 특정 컬럼에 설정하는 제약
테이터 무결성 보장을 목적으로 한다.
종류 : NOT NULL, UNIQUE, CHECK, PRIMARY KEY, FOREIGN KEY
NOT NULL
NOT NULL 제약조건 해당 컬럼에 반드시 값이 존재해야만 할 경우(즉, 절때 NULL이 들어오면 안되는 경우
삽입/수정시 NULL값을 허용하지 않도록 제한
제약조건을 부여하는 방식은 크게 2가지가 있다.
(컬럼레벨방식 / 테이블레벨 방식) NOT NULL제약 조건은 무조건 컬러레벨방식으로만 가능하다.
예를 들어보자, 회원 정보에 관한 테이블을 만들게 될 때 꼭 필요한 정보들이 있다.
이름, 나이, 성별, 아이디, 비밀번호 등등.. 이름이 없으면 사람을 특정할 수 없고 사람이라면 성별과 나이를 꼭 가지고 있다.
이런 필수정보에 NOT NULL을 써주면 된다!
CREATE TABLE MEM_NOTNULL(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50)
);
위 테이블에 값을 넣어보자
INSERT INTO MEM_NOTNULL
VALUES(2, 'USER2', NULL, '홍길서', NULL, NULL, NULL);
현재 PWD 즉 비밀번호에 NULL 값을 넣으려고 하면
이렇게 오류가 뜨게 된다.
UNIQUE
해당컬럼에 중복된 값이 들어가서는 안될 경우 사용한다.
컬럼값에 중복값을 제한하는 제약조건이다.
삽입/ 수정시 기존에 있는 데이터값 중 중복값이 있을 경우 오류를 발생시킨다.
사용법은 간단하다. 그냥 제약조건 뒤에 붙여주면 된다.
CREATE TABLE MEM_UNIQUE(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE, --컬럼레벨 방식
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50)
);
이렇게 컬럼명 줄에 달아주는 것을 컬럼레벨 방식이라 한다.
다른 방식 한 가지가 더 있다
CREATE TABLE MEM_UNIQUE(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50)
UNIQUE(MEM_ID) --테이블 레벨 방식
);
이렇게 테이블 제일 밑에 따로 UNIQUE(컬럼명) 으로 작성하는 것을
테이블 레벨 방식이라고 한다.
둘 다 장단점이 있다고 생각한다.
컬럼 레벨 방식은 우리가 코드를 읽을 때 한눈에 들어와 가독성이 뛰어나고
테이블 레벨 방식은 여러가지를 한번에 기술해야 할 때 편리할 것 같다.
하지만 그래도 컬럼 레벨 방식이 조금 더 많이 쓰인다고 한다.
위 만들어진 테이블에 값을 넣어 UNIQUE가 제대로 적용 되었는지 확인해보자!
INSERT INTO MEM_UNIQUE
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');
INSERT INTO MEM_UNIQUE
VALUES(2, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');
이렇게 ID 가 같은 INSERT 쿼리를 실행하려 하니 오류가 발생한다.
UNIQUE가 제대로 적용됐다는 것이다.
제일 밑 줄 오류 구문을 보면
ORA-00001: unique constraint (KH.SYS_C007119) violated 이렇게 나와있는데
컴퓨터가 알아서 오류번호를 부여하는 것인데 우리가 확인하기도 어렵고 뭔 소리인가 싶다.
그래서 이 오류를 우리가 원하는 메세지로 발생할 수 있게 해주는 것이 있다.
제약조건명 설명 방법
이것도 두 가지 방법이 있다. 위에서 배웠듯 컬럼레벨 , 테이블 레벨이 있다.
1. 컬럼레벨방식
컬럼레벨방식 CREATE TABLE 테이블병(
컬럼명 자료형 (CONSTRAINT 제약조건명)제약조건 )
2. 테이블레벨 방식
CREATE TABLE 테이블명(
컬럼명 자료형,
컬럼명 자료형,
(CONSTRAINT 제약조건명) 제약조건(컬럼명) )
CREATE TABLE MEM_UNIQUE(
MEM_NO NUMBER CONSTRAINT MEMNO_NT NOT NULL,
MEM_ID VARCHAR2(20) CONSTRAINT MEMID_NT NOT NULL , --컬럼레벨 방식
MEM_PWD VARCHAR2(20) CONSTRAINT MEMPWD_NT NOT NULL,
MEM_NAME VARCHAR2(20) CONSTRAINT MEMNAME_NT NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
--테이블 레벨 방식
--UNIQUE(MEM_ID)
CONSTRAINT MEMID_UQ UNIQUE(MEM_ID)
);
NOT NULL은 컬럼레벨 방식으로하고
UNIQUE는 테이블 레벨 방식으로 선언하였다.
값을 넣어서 잘 적용됐는지 확인해보자
INSERT INTO MEM_UNIQUE
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');
INSERT INTO MEM_UNIQUE
VALUES(2, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');
이렇게 두 번째 쿼리를 실행하면 오류가 나고 ORA-00001: unique constraint (KH.MEMID_UQ) violated 로 MEMID_UQ
로 우리가 설정한 제약조건메세지가 나오는 것을 볼 수 있다.
INSERT INTO MEM_UNIQUE
VALUES(3, 'USER2', 'PASS1', NULL, '남', '010-1111-2222', 'AAAA@NAVER.COM');
NOT NULL과 UNIQUE 두 가지에 대한 오류도 잘 나오는 것을 볼 수 있다.
CHECK
해당컬럼에 들어올 수 있는 값에 대한 조건을 제시해둘 수 있다
해당 조건에 만족하는 데이터 값만 담길 수 있다
[사용법]
CHECK (조건식)
CREATE TABLE MEM_CHECK(
MEM_NO NUMBER CONSTRAINT MEMNO_NT NOT NULL,
MEM_ID VARCHAR2(20) CONSTRAINT MEMID_NT NOT NULL , --컬럼레벨 방식
MEM_PWD VARCHAR2(20) CONSTRAINT MEMPWD_NT NOT NULL,
MEM_NAME VARCHAR2(20) CONSTRAINT MEMNAME_NT NOT NULL,
GENDER CHAR(3) CONSTRAINT MEMNAME_CK CHECK(GENDER IN ('남', '여')), --남, 여
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
--테이블 레벨 방식
--UNIQUE(MEM_ID)
CONSTRAINT MEMID_UQ UNIQUE(MEM_ID)
);
이번에도 NOT NULL은 컬럼레벨방식, UNIQUE는 테이블 레벨 방식으로 선언하였다.
또 GENDER 에는 CHECK로 남, 여 만 입력할 수 있게 테이블을 생성했다.
INSERT INTO MEM_CHECK
VALUES(2, 'USER2', 'PASS2', '홍길', 'ㅇ', '010-1111-2223', 'EAAAA@NAVER.COM');
성별에 ㅇ을 넣었더니 오류가 나는 것을 볼 수 있다.
**하지만 NULL은 들어가게 된다. NULL은 값 자체가 없다는 뜻이기에 값으로써 NULL이 아닌 비어있다는 것을 알려주기 위해 NULL이 들어가진다
PRIMARY KEY
테이블에서 각 행(ROW)을 식별하기 위해 사용될 컬럼에 부여하는 제약조건(식별자 역할)
PRIMARY KEY(기본키) 제약조건
-유의사항 : 한 테이블당 오직 한개만 설정 가능-
예를들어 회원번호, 학번, 군번, 부서코드, 직급코드, 주문번호, 택배운송장번호, 예약번호 등등
PRIMARY KEY 제약조건을 부여 -> NOT NULL + UNIQUE 기능을 가지고 있다.
CREATE TABLE MEM_PRI(
MEM_NO NUMBER CONSTRAINT MEMNO_PK PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL , --컬럼레벨 방식
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN ('남', '여')), --남, 여
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
UNIQUE(MEM_ID)
);
제일 첫 번째 NUMBER에 PRIMARY KEY를 주고 제약조건위반 메세지 MEMNO_PK도 선언해주었다. (컬럼레벨방식)
테이블 레벨에는 UNIQUE가 선언되어 있다.
INSERT INTO MEM_PRI
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-5111-2444', 'AAAA@NAVER.COM');
위 코드를 실행해서 값을 넣어주고
INSERT INTO MEM_PRI
VALUES(1, 'USER2', 'PASS2', '홍길', '여', '010-5111-2424', 'AA3A@NAVER.COM');
위 코드를 실행하려하면 오류가 나온다.
이유가 무엇일까?
-> 기본키가 1로 같은데 기본키는 무조건 하나여야만 한다. (UNIQUE : 중복불가)
INSERT INTO MEM_PRI
VALUES(NULL, 'USER2', 'PASS2', '홍길', '여', '010-5111-2424', 'AA3A@NAVER.COM');
위 코드도 오류가 나게 되는데
기본키는 NULL값을 지정할 수 없다.(NOT NULL)
복합키
두 개의 컬럼을 동시에 하나의 PRIMARY KEY로 지정하는 것
*복합키는 테이블 레벨 방식으로 선언하는 것이 편하다.
CREATE TABLE MEM_PRI2(
MEM_NO NUMBER,
MEM_ID VARCHAR2(20) NOT NULL , --컬럼레벨 방식
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN ('남', '여')), --남, 여
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
UNIQUE(MEM_ID),
PRIMARY KEY(MEM_NO, MEM_ID)
);
위는 그대로지만 제일 밑 테이블레벨 부분에 보면 PRIMARY KEY(MEM_NO, MEM_ID) 가 선언된 것을 볼 수 있다.
이런식으로 두 개의 컬럼 값을 합쳐 하나의 키로 만드는 것을 복합키라고 한다.
값을 하나 추가해주고
INSERT INTO MEM_PRI2
VALUES(1, 'USER1', 'PASS1', '홍길동', NULL, NULL, NULL);
값을 하나 더 추가하려하니
INSERT INTO MEM_PRI2
VALUES(1, 'USER2', 'PASS2', '홍길순', NULL, NULL, NULL);
잘 된다. 분명 기본키가 같은데 오류가 나지않고 삽입이 가능하다.
이유는 복합키로 설정해놓았기 때문에 MEM_NO, MEM_ID 가 둘 다 똑같지만 않으면 오류가 나지 않는다.
복합키는 헷갈릴 수 있으니 예시를 들어보자
--복합키 사용 예시(어떤 회원이 어떤 상품을 찜하는 지에 대한 데이터를 보관하는 테이블)
CREATE TABLE TB_LIKE(
MEM_NO NUMBER,
PRODUCT_NAME VARCHAR2(10),
LIKE_DATE DATE,
PRIMARY KEY(MEM_NO, PRODUCT_NAME)
);
위 테이블을 만들고 예를 들어 상상해보자.
네이버에서 쇼핑을 할 때 우리는 여러가지의 제품을 장바구니에 담을 수 있다.
INSERT INTO TB_LIKE VALUES(1,'자전거A', SYSDATE);
이렇게 자전거A를 담았고
INSERT INTO TB_LIKE VALUES(1,'자전거B', SYSDATE);
이렇게 자전거 B도 담았다.
만약 복합키가 아닌 MEM_ID로 기본키가 있다면, 우리는 같은 1 으로 오류가 날 것이고 장바구니에는 하나의 상품만 담을 수 있는 단일장바구니가 되는 것이다.
이럴 때 사용한다.
FOREIGN KEY(외래키)
다른 테이블에 존재하는 값만 들어와야되는 특정 컬럼에 부여하는 제약조건
- 다른 테이블을 참조한다고 표현
- 주로 FOREIGN KEY 제약조건으로 인해 테이블간 관계가 형성된다.
[사용법]
FOREIGN KEY(외래키) 제약조건
* 컬럼레벨방식 컬럼명 자료형 REFERENCES 참조할 테이블
* 테이블레벨방식 FOREIGN KEY(컬럼명) REFERENCES 참조할 테이블명[(참조할 컬럼명)]
* 참조할 컬럼명 생략이 참조할 테이블에 PRIMARY KEY로 지정된 컬럼이 매칭된다.
예를 들어보자!
--회원등급에 대한 데이터를 따로 보관하는 테이블
CREATE TABLE MEM_GRADE(
GRADE_CODE NUMBER PRIMARY KEY,
GRADE_NAME VARCHAR2(30) NOT NULL
);
INSERT INTO MEM_GRADE VALUES(10, '일반회원');
INSERT INTO MEM_GRADE VALUES(20, '우수회원');
INSERT INTO MEM_GRADE VALUES(30, '특별회원');
이렇게 회원등급에 따른 값을 넣어주고 테이블을 완성해놓는다.
CREATE TABLE MEM(
MEM_NO NUMBER PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE, --컬럼레벨 방식
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN ('남', '여')), --남, 여
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
GRADE_ID NUMBER REFERENCES MEM_GRADE(GRADE_CODE)
--FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE)
);
마지막 줄을 보면 GRADE_ID 가 있는데 이것은 MEM_GRADE(GRADE_CODE)를 REFERENCES(참조) 한다고 선언되어 있다.
*외래키는 다른 테이블의 기본키를 가져오는 것이다.
INSERT INTO MEM VALUES(1, 'USER1', 'PASS1', '홍길순', '여', NULL, NULL, NULL);
마지막 NULL이 외래키 부분인데 외래키는 기본적으로 NULL값을 허용한다.
(회원등급이 없을 수도 있으니)
INSERT INTO MEM VALUES(2, 'USER2', 'PASS2', '홍길동', '남', NULL, NULL, 10);
INSERT INTO MEM VALUES(3, 'USER3', 'PASS3', '최재똥',NULL, NULL, NULL, 40); --오류
마지막 줄에서는 왜 오류가 날까?
외래키 부분이 40인데 우리가 만든 MEM_GRADE 테이블에는 10, 20, 30 까지만 등록이 되어 있기 때문에
parent key not found라는 오류가 나게된다.
--MEM_GRADE(부모테이블) 1 : N MEM(자식테이블)
-- 1:N 관계 1쪽이 부모테이블 N이 자식테이블
여기서 참조의 관계를 한 번 살펴보자.
자바에서 extends 로 상속을 받았듯, 부모클래스로부터 자식클래스가 여러개 탄생하듯
같은 개념으로 생각하면 될 것 같다.
MEM_GRADE는 그냥 회원등급를 저장하고 있는 테이블(부모테이블)이고 이것을 이용하는 헬스장 회원프로그램, 쇼핑몰 회원프로그램 등 여러가지의 자식테이블이 탄생할 수 있다.
그러므로 1개의 부모테이블에서는 N개의 자식테이블이 나올 수 있다.
우리는 위에서 부모테이블인 회원등급 테이블과
자식테이블인 MEM을 생성해서 외래키로 관계를 형성해줬다.
그럼 자식테이블 GRADE_ID 는 MEM_GRADE를 참조하고 있는데 이 때 부모테이블에서 데이턱 값을 삭제하게 된다면 어떻게 될까?
--데이터 삭제 : DELETE FROM 테이블명 WHERE 조건 :
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 10;
위 쿼리를 실행하면 오류가 나게되는데 이 오류는 이미 자식테이블에서 10이라는 값을 사용하고 있기 때문에 삭제가 불가능하다는 오류이다.
하지만 GRADE_CODE = 30 는 사용하고 있지 않기 때문에 삭제가 가능하다.
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 30;
여기서 우리는 자섹테이블이 이미 사용하고 있는 값이 있는 경우에 부모테이블에서는 삭제가 무조껀 안되는
"삭제제한" 옵션이 있다는 것을 알 수 있다.
자식테이블 생성시 외래키 제약조건 부여할 때 삭제옵션 지정
*삭제옵션 : 부모테이블의 데이터 삭제시 그 데이터를 사용하고 있는 자식테이블의 값을 어떻게 할 것인가?
-ON DELETE RESTRICTED(기본값) : 삭제제한옵션, 자식데이터로부터 쓰이는 부모데이터는 삭제가 아예 안됨
-ON DELETE SET NULL : 부모데이터 삭제시 해당 데이터를 사용하고 있는 자식 데이터의 값을 NULL로 변경
-ON DELETE CASCADE : 부모데이터 삭제시 해당 데이터를 사용하고 있는 자식데이터도 같이 삭제시키는 옵션
CREATE TABLE MEM(
MEM_NO NUMBER PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE, --컬럼레벨 방식
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN ('남', '여')), --남, 여
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
GRADE_ID NUMBER REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE CASCADE
--FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE)
);
위 MEM 테이블을 생성할 때 ON DELETE CASCADE 도 같이 기술하여 부모데이터를 삭제시킬 때 데이터를 사용하고 있는 자식 데이터도 같이 삭제시키게 했다.
확인해보자 !
INSERT INTO MEM VALUES(1, 'USER1', 'PASS1', '홍길순', '여', NULL, NULL, NULL);
INSERT INTO MEM VALUES(2, 'USER2', 'PASS2', '홍길동', '남', NULL, NULL, 10);
INSERT INTO MEM VALUES(3, 'USER3', 'PASS3', '김개똥','여', NULL, NULL, 20);
INSERT INTO MEM VALUES(4, 'USER4', 'PASS4', '최배달','남', NULL, NULL, 10);
먼저 이렇게 4개의 데이터를 넣어주었다.
--10번 등급 삭제
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 10;
그리고 삭제 시 GRADE_ID가 10 이였던 친구들도 모두 삭제되었다.
DEFAULT
컬럼을 선정하지않고 INSERT시 NULL이 아닌 기본값을 INSERT하고자 한다.
이때 세팅해 둘 수 있는 값.
[사용법]
컬럼명 자료형 DEFAULT 기본값
CREATE TABLE MEMBER(
MEM_NO NUMBER PRIMARY KEY,
MEM_NAME VARCHAR2(20) NOT NULL,
MEM_AGE NUMBER,
HOBBY VARCHAR2(20) DEFAULT '없음',
ENROLL_DATE DATE DEFAULT SYSDATE
);
위 처럼 DEFAULT 뒤에 '없음' 이나 원하는 말을 적어주고 테이블을 생성해준다.
그리고 테이블에 값을 넣을 때 DEFAULT를 적어주면 된다.
INSERT INTO MEMBER VALUES(1, '빵빵이', 20,'운동','20/01/01');
INSERT INTO MEMBER VALUES(2, '옥지', 22, DEFAULT ,DEFAULT);
INSERT INTO MEMBER VALUES(3, '최최최', 26, NULL ,NULL);
SELECT * FROM MEMBER;
이렇게 옥지에는 DEFAULT를 넣어놓은 후 모든 MEMBER의 값을 가져오면
옥지 행에는 취미가 DEFAULT인 '없음' 과 ENROLL_DATE에 DEFAULT인 오늘 날짜가 나온다.
--주의사항--
INSERT INTO MEMBER(MEM_NO, MEM_NAME) VALUES (4, '이광인');
이렇게 컬럼을 안주고 넣었을 시
테이블 생성 때 DEFAULT를 사용한 것은 DEFAULT의 값이 들어가고 사용하지 않은 것에는
NULL이 들어가는걸 알 수 있다.
테이블 복제
CREATE TABLE EMPLOYE_COPY
AS (SELECT * FROM EMPLOYEE);
이렇게 원래 있던 테이블의 COPY를 만들 수 있다.
데이터테이블은 한 번 만들면 변경이 힘들다.
만약 나중에 우리가 만든 데이터베이스로 서비스를 할 때 테이블의 제약조건에 문제가 있다면 어떻게 해결해야할까?
1. 테이블을 삭제하고 다시만든다 --> 서비스도중에 말도 안되는 소리다.
2. ALTER TABLE 사용 !
ALTER TABLE
테이블이 다 생성된 후에 뒤늦게 제약조건을 추가하는 방법
[사용법]
ALTER TABLE 테이블명 변경할 내용
-PRIMARY KEY : ALTER TABLE 테이블명 ADD PRIMARY KEY(컬럼명);
-FOREIGN KEY : ALTER TABLE 테이블명 ADD FOREIGN KEY(컬럼명) REFERENCES 참조할 테이블명[(참조할 컬럼)];
-UNIQUE : ALTER TABLE 테이블명 ADD UNIQUE(컬럼명);
-CHECK : ALTER TABLE 테이블명 ADD CHECK(컬럼에 대한 조건식);
-NOT NULL : ALTER TABLE 테이블명 MODIFY 컬럼명 NOT NULL;
[] 안에 있는 것들은 생략이 가능하다. 대신 시스템상 기본 값이 자동으로 들어가게 된다.
PRIMARY KEY (기본 키) 제약조건 추가
ALTER TABLE EMPLOYE_COPY ADD PRIMARY KEY(EMP_ID);
ALTER TABLE EMPLOYE_COPY DROP PRIMARY KEY; --삭제도 가능하지만 삭제시킬일이 거의 없다.
FOREIGN KEY (외래키) 제약조건 추가, 참조할 대상 잊지말기
--EMPLOYEE 테이블에 DEPT_CODE에 외래키 제약조건 추가
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(DEPT_CODE) REFERENCES DEPARTMENT(DEPT_ID);
--EMPLOYEE 테이블에 JOB_CODE에 외래키 제약조건 추가
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(JOB_CODE) REFERENCES JOB(JOB_CODE);
--DEPARTMENT 테이블에 LOCATION_ID에 외래키 제약조건 추가
ALTER TABLE DEPARTMENT ADD FOREIGN KEY(LOCATION_ID) REFERENCES LOCATION(LOCAL_CODE);
이렇게 데이터베이스 DDL이 마무리 되었다.
원래 생성-> SELECT(제어) 순 일텐데 나는 거꾸로 배웠다.
왜 거꾸로 배울까? 했는데 막상 배우고 나니까 이미 만들어져있는 테이블로 제어해보고 그 다음 CREATE순으로 배우니
이 방법이 훨씬 편하구나 라고 느꼈다!
복습잊지말자
'데이터베이스' 카테고리의 다른 글
[9일차] ETC(DCL, TCL) , VIEW(뷰) (2) | 2024.02.27 |
---|---|
[8일차] DML(Data Manipulation Language), DDL(Data Definition Language) (0) | 2024.02.26 |
[6일차] SUBQUERY (0) | 2024.02.24 |
[5일차] JOIN (0) | 2024.02.23 |
[4일차] GROUP함수 (0) | 2024.02.22 |