이제는 몇번째인지도 헷갈리는 DATABASE 개념 정리!
오늘은 DDL에 대해 정리해보았습니다😲😲
테이블을 생성하는 것!
테이블 생성하는 방법
- 표현법
CREATE TABLE 테이블명( 컬럼명 TYPE() [제약조건] , 컬럼명 TYPE[()] [제약조건],......--)
- CHAR : 고정크기 문자열 저장소
- VARCHAR2 : 가변크기 문자열 저장소
- NVARCHAR2 : 가변크기 확장적 문자열들을 저장
EX)
테이블 TBL_STR을 A컬럼은 CHAR(6),B컬럼은 VARCHAR(6),C컬럼은 NVLCHAR2(6)으로 생성하고, 각 테이블안에 INSERT로 타입에 맞는 데이터를 넣어줌 ⤵️
CREATE TABLE TBL_STR(
A CHAR(6),
B VARCHAR2(6),
C NVARCHAR2(6));
SELECT * FROM TBL_STR;
INSERT INTO TBL_STR VALUES('ABC','ABC','ABC');
INSERT INTO TBL_STR VALUES('ABCDEFG','ABCDEF','ABCDEF');
INSERT INTO TBL_STR VALUES('가나','오나','자나');
INSERT INTO TBL_STR VALUES('가나다','오나다','자나다');
INSERT INTO TBL_STR VALUES('가나','오나','자나다라바마');
SELECT LENGTHB(A), LENGTHB(B), LENGTHB(C)
FROM TBL_STR;
- NUMBER : 표현가능한 모든 숫자 저장함
- NUMBER(PRECISION, SCALE) : 숫자저장에 제한설정
- PRECISION : 저장가능한 숫자의 전체 자리수(1~38)
- SCALE : 소수점 자리수설정(-84~127)
EX) TBL_NUM에 숫자형 자료형들로 컬럼ABCD를 만들어서 각 타입에 맞는 데이터 넣어주고 조회 ⤵️
CREATE TABLE TBL_NUM(
A NUMBER,
B NUMBER(5),
C NUMBER(5,1),
D NUMBER(5,-2));
SELECT * FROM TBL_NUM;
INSERT INTO TBL_NUM VALUES(1234.567,1234.567,1234.567,1234.567);
INSERT INTO TBL_NUM VALUES(1234.123,1234.123,1234.123,1234.123);
INSERT INTO TBL_NUM VALUES(123400.12300,12340.123,1234.123,12340000.123);
- DATE : 년, 월, 일 저장하는 자료형
- TIMESTAMP : 년, 월, 일 시, 분 초 저장하는 자료형
EX)
날짜타입의 컬럼들이 있는 테이블을 생성해주고 날짜 데이터 삽입⤵️
CREATE TABLE TBL_DATE(
BIRTHDAY DATE,
RENT_START TIMESTAMP);
INSERT INTO TBL_DATE VALUES(SYSDATE,SYSTIMESTAMP);
- 문자형태로 저장
INSERT INTO TBL_DATE VALUES('24/02/13','24/02/13 09:00');
- 형변환해서 저장하기
INSERT INTO TBL_DATE VALUES (TO_DATE('24/02/13','YY/MM/DD'),TO_TIMESTAMP('24/02/13 09:00','RR/MM/DD HH24:MI'));
- VARCHAR2() -> 최대 4천바이트
-- LONG, CLOB을 사용한다.
CREATE TABLE TBL_STR2(
TESTSTR VARCHAR2(4000),
TESTSTR2 CLOB
);
SELECT * FROM TBL_STR2;
DESC TBL_STR2;
INSERT INTO TBL_STR2 VALUES('엄청긴문자열이있다고침');
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
컬럼레벨에서 설정 : 컬럼한개에 제약조건을 설정할때
테이블레벨에서 설정 : 여러컬럼을 묶어서 제약조건을 설정할때
- 표현법
CREATE TABLE 테이블명( 컬럼명 타입명 [제약조건] 컬럼레벨, 컬럼명 타입명 [제약조건], [제약조건] 테이블레벨 )
설정된 컬럼에는 NULL값을 저장하지 않게 하는 제약조건 , 컬럼은 별다른 제약조건이 없으면 NULLABLE(DEFUALT)이다.
CREATE TABLE NN_MEMBER(
MEMBER_NO NUMBER,
MEMBER_ID VARCHAR2(50) NOT NULL,
MEMBER_PWD VARCHAR2(50) NOT NULL,
MEMBER_NAME VARCHAR2(20),
MEMBER_AGE NUMBER
-- NOT NULL(MEMBER_ID)
);
INSERT INTO NN_MEMBER VALUES(NULL, 'ADMIN',NULL,NULL,NULL);
INSERT INTO NN_MEMBER VALUES(NULL, 'ADMIN','1234',NULL,NULL);
설정된 컬럼에 중복데이터를 저장할 수 없게 하는 기능이다.
CREATE TABLE UQ_MEMBER2(
MEMBER_NO NUMBER,
MEMBER_ID VARCHAR2(50),
MEMBER_PWD VARCHAR2(50) NOT NULL,
MEMBER_NAME VARCHAR2(20),
MEMBER_AGE NUMBER,
UNIQUE(MEMBER_ID,MEMBER_NAME)
);
설정된 컬럼에 중복, NULL 둘다 안되게하는 기능이다.
CREATE TABLE PK_MEMBER(
MEMBER_NO NUMBER PRIMARY KEY,
MEMBER_ID VARCHAR2(50) UNIQUE NOT NULL,
MEMBER_PWD VARCHAR2(50) NOT NULL,
MEMBER_NAME VARCHAR2(20),
MEMBER_AGE NUMBER
--첫번째 줄 없애고 PRIMARY KEY(MEMBER_NO)를 써줘도 됨, PRIMARY도 다중으로 묶어서 사용할 수 있음-> PRIMARY KEY(MEMBER_NO,MEMBER_ID)
);
컬럼에 저장되는 데이터가 다른테이블에 있는 값만 저장하게 하는 것
CREATE TABLE FK_BOARD(
BOARD_NO NUMBER PRIMARY KEY,
BOARD_TITLE VARCHAR2(200) NOT NULL,
BOARD_CONTENT VARCHAR2(2000),
BOARD_WRITER VARCHAR2(20), --NOT NULL REFERENCES UQ_MEMBER(MEMBER_ID), --REFERENCES 테이블명(컬럼명),
BOARD_DATE DATE,
FOREIGN KEY(BOARD_WRITER) REFERENCES UQ_MEMBER(MEMBER_ID)
);
SELECT * FROM UQ_MEMBER;
INSERT INTO UQ_MEMBER VALUES(4,'ADMIN','1234','관리자',44);
INSERT INTO UQ_MEMBER VALUES(5,'USER01','1111','유저일',11);
INSERT INTO UQ_MEMBER VALUES(6,'BS','1111','유저일',11);
INSERT INTO FK_BOARD VALUES(1,'나는 오늘 db를 즐기고있다.',NULL,'GDJ79',SYSDATE);
INSERT INTO FK_BOARD VALUES(2,'참조관계에 NULL값은?.',NULL,NULL,SYSDATE);
INSERT INTO FK_BOARD VALUES(3,'참조관계에 NULL값은?.',NULL,'BS',SYSDATE);
SELECT * FROM FK_BOARD;
🖐️문제풀이
CREATE TABLE FK_BOARD_COMMENT(
COMMENT_NO NUMBER PRIMARY KEY,
COMMENT_CONTENT VARCHAR2(1000) NOT NULL,
COMMENT_WRITER VARCHAR2(20) REFERENCES UQ_MEMBER(MEMBER_ID),
BOARD_NO NUMBER REFERENCES FK_BOARD(BOARD_NO),
COMMENT_DATE DATE
);
INSERT INTO FK_BOARD_COMMENT VALUES(1, 'MJ 두끼 힘내요! 아랫배?','GDJ79',1,SYSDATE);
INSERT INTO FK_BOARD_COMMENT VALUES(2, '헌수 MJ 그만 눌러! 아랫배?','USER01',1,SYSDATE);
SELECT * FROM FK_BOARD_COMMENT;
FK제약조건이 설정된 부모테이블의 데이터는 함부로 삭제 할 수 없다.
FK 설정시 삭제에 대한 옵션을 설정할 수 있음
1. ON DELETE SET NULL : 참조값이 삭제되면 NULL로 설정 / 컬럼에 NOT NULL 제약조건을 설정하면 안됨!
2. ON DELETE CASCADE : 참조값이 삭제되면 같이 삭제됨
CREATE TABLE FK_BOARD_COMMENT(
COMMENT_NO NUMBER PRIMARY KEY,
COMMENT_CONTENT VARCHAR2(1000) NOT NULL,
COMMENT_WRITER VARCHAR2(20) REFERENCES UQ_MEMBER(MEMBER_ID),
--1. BOARD_NO NUMBER REFERENCES FK_BOARD(BOARD_NO) ON DELETE SET NULL,
--2.BOARD_NO NUMBER REFERENCES FK_BOARD(BOARD_NO) ON DELETE CASCADE,
COMMENT_DATE DATE
);
CHECK(C)
특정 조건에 맞는 값만 저장할 수 있게 해주는 것이다.
- 컬럼레벨에서 설정가능
✓ PERSON테이블 생성시 GENDER컬럼의 값을 'M'/'F'로 지정함CREATE TABLE PERSON( NAME VARCAHR2(20), AGE NUMBER CHECK(AGE>0), GENDER VARCHAR(5) CHECK(GENDER IN('M','F')) );
테이블 생성 시 컬럼명, 자료타입 뒤에 DEFAULT '기본값'을 써준다.
데이터의 기본값을 '기본값'으로 지정함
CREATE TABLE DEFAULT_TEST( TEST_NO NUMBER PRIMARY KEY, TEST_DATE DATE DEFAULT SYSDATE NOT NULL, TEST_DATA VARCHAR2(20) DEFAULT '기본값' );
제약조건을 설정할 때 제약 조건에 대한 이름을 설정해준다.
(CONSTRAING 뒤에 있는것이 이름)CREATE TABLE MEMBER_TEST( MEMBER_NO NUMBER CONSTRAINT MEMBER_NO_PK PRIMARY KEY, MEMBER_ID VARCHAR(20) CONSTRAINT MEMBER_ID_UQ UNIQUE CONSTRAINT NN_MEMBER_ID NOT NULL, MEMBER_AGE NUMBER CONSTRAINT CK_AGE CHECK(MEMBER_AGE>0), BOARD_NO NUMBER, CONSTRAINT FK_BOARD FOREIGN KEY(BOARD_NO) REFERENCES FK_BOARD(BOARD_NO) ); INSERT INTO MEMBER_TEST VALUES(1,'ADMIN',10,2); -- 에러 메시지에서 이름이 나오기때문에 찾기 더 편함
오라클에서 USER_CONSTRAINTS,USER_CONS_COLUMNS 테이블을 제공한다.
SELECT * FROM USER_CONSTRAINTS; --컬럼 안나옴 -- 컬럼 확인하기(타입과 내용 안나옴)SELECT * FROM USER_CONS_COLUMNS; -- > 합쳐서 사용(유일한 값을 갖는 CONSTRAINT_NAME)이 기준다 나오게 하기⤵️
SELECT UC.CONSTRAINT_NAME,UC.TABLE_NAME,CONSTRAINT_TYPE,COLUMN_NAME FROM USER_CONSTRAINTS UC JOIN USER_CONS_COLUMNS UCC ON UC.CONSTRAINT_NAME=UCC.CONSTRAINT_NAME;
- 다른 사람이 못알아보는 코드는 좋은 코드가 아니기 때문에 설명을 작성하는게 좋음
COMMENT ON COLUMN MEMBER_TEST.MEMBER_NO IS'회원번호 PRIMARY KEY'; COMMENT ON COLUMN MEMBER_TEST.MEMBER_ID IS '회원아이디 8글자이상 영문';
- 표현법
COMMENT ON TABLE MEMBER_TEST IS '제약조건 연습테이블';
- 확인하기
SELECT* FROM USER_TAB_COMMENTS WHERE TABLE_NAME='MEMBER_TEST';
- 복사해서 생성한 테이블은 제약조건이 NOT NULL제약조건만 복사됨
✔️ ENPLOYEE 테이블 복사해서 테이블 생성하고 확인하기CREATE TABLE COPY_EMP AS SELECT *FROM EMPLOYEE; SELECT*FROM COPY_EMP;
🖐️문제풀이
CREATE TABLE COPY_EMP
AS SELECT EMP_ID,EMP_NAME,SALARY*12 AS YEAR_SAL FROM EMPLOYEE;
SELECT*FROM COPY_EMP;
CREATE TABLE COPY_EMP2
AS SELECT*FROM EMPLOYEE WHERE 1=2; --컬럼들만 복사해서 가져오게됨(NOT NULL제약조건만 복사됨)
CREATE TABLE BOARD_TYPE(
TYPE_NO NUMBER PRIMARY KEY,
TYPE_NAME VARCHAR2(10)
);
테이블 생성하기
CREATE TABLE TEST_MEMBER(
MEMBER_CODE NUMBER PRIMARY KEY,
MEMBER_ID VARCHAR2(20) UNIQUE NOT NULL ,
MEMBER_PWD CHAR(20) NOT NULL,
MEMBER_NAME NCHAR(10) DEFAULT '아무개',
MEMBER_ADDR CHAR(50) NOT NULL,
GENDER VARCHAR(5) NOT NULL CHECK(GENDER IN('남','여')),
PHONE VARCHAR(20) NOT NULL,
HEIGHT NUMBER(5,2) CHECK(HEIGHT>=130),
TYPE_NO NUMBER REFERENCES BOARD_TYPE(TYPE_NO)
);
코멘트 달기
COMMENT ON COLUMN TABLE_MEMNBER.MEMBER_CODE IS'회원전용코드';
COMMENT ON COLUMN TABLE_MEMNBER.MEMBER_ID IS'회원아이디';
COMMENT ON COLUMN TABLE_MEMNBER.MEMBER_PWD IS'회원비밀번호';
COMMENT ON COLUMN TABLE_MEMNBER.MEMBER_ADDR IS'회원 거주지';
COMMENT ON COLUMN TABLE_MEMNBER.GENDER IS'성별';
COMMENT ON COLUMN TABLE_MEMNBER.PHONE IS'회원 연락처';
COMMENT ON COLUMN TABLE_MEMNBER.HEIGHT IS'회원키';
COMMENT ON COLUMN TABLE_MEMNBER.TYPE_TO_NUM IS'보드타입 참조';
이상으로 DDL끝입니당!