개발 공부 기록

[Oracle 실습문제] CREATE 본문

실습 문제/oracle

[Oracle 실습문제] CREATE

좨랭이 2021. 10. 11. 21:55
-- 도서관리 프로그램을 만들기 위한 테이블 만들기
-- 이때, 제약조건에 이름을 부여하고, 각 컬럼에 주석 달기

-- 1. 출판사들에 대한 데이터를 담기 위한 출판사 테이블(TB_PUBLISHER) 
--  1) 컬럼 : PUB_NO(출판사 번호) -- 기본 키
--           PUB_NAME(출판사명) -- NOT NULL
--           PHONE(출판사 전화번호) -- 제약조건 없음
CREATE TABLE TB_PUBLISHER (
    PUB_NO NUMBER CONSTRAINT PUB_PUB_NO_PK PRIMARY KEY,
    PUB_NAME VARCHAR2(20) CONSTRAINT PUB_PUB_NAME_NN NOT NULL,
    PHONE VARCHAR2(20)
);

COMMENT ON COLUMN TB_PUBLISHER.PUB_NO IS '출판사 번호';
COMMENT ON COLUMN TB_PUBLISHER.PUB_NAME IS '출판사명';
COMMENT ON COLUMN TB_PUBLISHER.PHONE IS '출판사 전화번호';

SELECT * FROM TB_PUBLISHER;
--  2) 3개 정도의 샘플 데이터 추가하기
INSERT INTO TB_PUBLISHER VALUES(101, 'ABC출판', '031-123-123');
INSERT INTO TB_PUBLISHER VALUES(102, '가나다출판', '02-111-222');
INSERT INTO TB_PUBLISHER VALUES(103, 'QQ출판', NULL);

-- 2. 도서들에 대한 데이터를 담기 위한 도서 테이블 (TB_BOOK)
--  1) 컬럼 : BK_NO (도서번호) -- 기본 키
--           BK_TITLE (도서명) -- NOT NULL
--           BK_AUTHOR(저자명) -- NOT NULL
--           BK_PRICE(가격)
--           BK_PUB_NO(출판사 번호) -- 외래 키(TB_PUB 테이블을 참조하도록)
--                                  이때 참조하고 있는 부모 데이터 삭제 시 자식 데이터도 삭제 되도록 옵션 지정
CREATE TABLE TB_BOOK (
    BK_NO NUMBER CONSTRAINT TB_BOOK_BK_BK_NO_PK PRIMARY KEY,
    BK_TITLE VARCHAR2(30) CONSTRAINT TB_BOOK_BK_TITLE_NN NOT NULL,
    BK_AUTHOR VARCHAR2(30) CONSTRAINT TB_BOOK_BK_AUTHOR_NN NOT NULL,
    BK_PRICE VARCHAR2(30),
    BK_PUB_NO NUMBER CONSTRAINT TB_BOOK_BK_PUB_NO_FK REFERENCES TB_PUBLISHER (PUB_NO) ON DELETE CASCADE
);

COMMENT ON COLUMN TB_BOOK.BK_NO IS '도서번호';
COMMENT ON COLUMN TB_BOOK.BK_TITLE IS '도서명';
COMMENT ON COLUMN TB_BOOK.BK_AUTHOR IS '저자명';
COMMENT ON COLUMN TB_BOOK.BK_PRICE IS '가격';
COMMENT ON COLUMN TB_BOOK.BK_PUB_NO IS '출판사 번호';

SELECT * FROM TB_BOOK;
--  2) 5개 정도의 샘플 데이터 추가하기
INSERT INTO TB_BOOK VALUES(11, '인생은 실전이다', '신영준', '16000', 101);
INSERT INTO TB_BOOK VALUES(22, '오케팅', '오두환', '11000', 101);
INSERT INTO TB_BOOK VALUES(33, '작은 별이지만', '소윤', '13000', 102);
INSERT INTO TB_BOOK VALUES(44, '트렌드 코리아', '김난도', '16000', 103);
INSERT INTO TB_BOOK VALUES(55, '소크라테스', '신영준', '16200', 101);

-- 3. 회원에 대한 데이터를 담기 위한 회원 테이블 (TB_MEMBER)
--  1) 컬럼 : MEMBER_NO(회원번호) -- 기본 키
--           MEMBER_ID(아이디)   -- 중복 금지
--           MEMBER_PWD(비밀번호) -- NOT NULL
--           MEMBER_NAME(회원명) -- NOT NULL
--           GENDER(성별)        -- 'M' 또는 'F'로 입력되도록 제한
--           ADDRESS(주소)       
--           PHONE(연락처)       
--           STATUS(탈퇴 여부)     -- 기본값으로 'N'  그리고 'Y' 혹은 'N'으로 입력되도록 제약조건
--           ENROLL_DATE(가입일)  -- 기본값으로 SYSDATE, NOT NULL
CREATE TABLE TB_MEMBER (
    MEMBER_NO NUMBER CONSTRAINT TB_MEMBER_MEMBER_NO_PK PRIMARY KEY,
    MEMBER_ID VARCHAR2(20) CONSTRAINT TB_MEMBER_MEMBER_ID_UQ UNIQUE,
    MEMBER_PWD VARCHAR2(20) CONSTRAINT TB_MEMBER_MEMBER_PWD_NN NOT NULL,
    MEMBER_NAME VARCHAR2(20) CONSTRAINT TB_MEMBER_MEMBER_NAME_NN NOT NULL,
    GENDER CHAR CONSTRAINT TB_MEMBER_MEMBER_GENDER_CK CHECK(GENDER IN('M', 'F')),
    ADDRESS VARCHAR2(50),
    PHONE VARCHAR2(20),
    STATUS VARCHAR2(1) DEFAULT 'N' CHECK(STATUS IN ('N', 'Y')),
    ENROLL_DATE DATE DEFAULT SYSDATE CONSTRAINT TB_MEMBER_ENROLL_DATE_NN NOT NULL
);

COMMENT ON COLUMN TB_MEMBER.MEMBER_NO IS '회원번호';
COMMENT ON COLUMN TB_MEMBER.MEMBER_ID IS '아이디';
COMMENT ON COLUMN TB_MEMBER.MEMBER_PWD IS '비밀번호';
COMMENT ON COLUMN TB_MEMBER.MEMBER_NAME IS '회원명';
COMMENT ON COLUMN TB_MEMBER.GENDER IS '성별';
COMMENT ON COLUMN TB_MEMBER.ADDRESS IS '주소';
COMMENT ON COLUMN TB_MEMBER.PHONE IS '연락처';
COMMENT ON COLUMN TB_MEMBER.STATUS IS '탈퇴여부';
COMMENT ON COLUMN TB_MEMBER.ENROLL_DATE IS '가입일';

SELECT * FROM TB_MEMBER;
--  2) 3개 정도의 샘플 데이터 추가하기
INSERT INTO TB_MEMBER VALUES(1, 'AAA', '1234', '김철수', 'M', '서울시 동대문구 123번지', '010-1111-2222', 'N', DEFAULT);
INSERT INTO TB_MEMBER VALUES(2, 'SSS', '1234', '홍길동', 'M', '경기도 구리시 234번지', '010-3333-2222', 'Y', DEFAULT);
INSERT INTO TB_MEMBER VALUES(3, 'DDD', '1234', '김영희', 'F', '서울시 중랑구 345번지', '010-5555-2222', 'N', DEFAULT);

-- 4. 도서를 대여한 회원에 대한 데이터를 담기 위한 대여 목록 테이블(TB_RENT)
--  1) 컬럼 : RENT_NO(대여번호) -- 기본 키
--           RENT_MEM_NO(대여 회원번호) -- 외래 키  TB_MEMBER와 참조하도록
--                                      이때 부모 데이터 삭제 시 NULL 값이 되도록 옵션 설정
--           RENT_BOOK_NO(대여도서번호) -- 외래 키  TB_BOOK와 참조하도록
--                                      이때 부모 데이터 삭제 시 NULL 값이 되도록 옵션 설정
--           RENT_DATE(대여일) -- 기본값 SYSDATE
CREATE TABLE TB_RENT ( 
    RENT_NO NUMBER CONSTRAINT TB_RENT_RENT_NO_PK PRIMARY KEY,
    RENT_MEM_NO NUMBER CONSTRAINT TB_RENT_RENT_MEM_NO_FK REFERENCES TB_MEMBER ON DELETE SET NULL,
    RENT_BOOK_NO NUMBER CONSTRAINT TB_RENT_RENT_BOOK_NO_PK REFERENCES TB_BOOK ON DELETE SET NULL,
    RENT_DATE DATE DEFAULT SYSDATE
);

COMMENT ON COLUMN TB_RENT.RENT_NO IS '대여번호';
COMMENT ON COLUMN TB_RENT.RENT_MEM_NO IS '대여회원번호';
COMMENT ON COLUMN TB_RENT.RENT_BOOK_NO IS '대여도서번호';
COMMENT ON COLUMN TB_RENT.RENT_DATE IS '대여일';

SELECT * FROM TB_RENT;
--  2) 샘플 데이터 3개 정도 
INSERT INTO TB_RENT VALUES(1001, 1, 33, DEFAULT);
INSERT INTO TB_RENT VALUES(1002, 2, 22, DEFAULT);
INSERT INTO TB_RENT VALUES(1003, 3, 44, DEFAULT);

-- 4. 2번 도서를 대여한 회원의 이름, 아이디, 대여일, 반납 예정일(대여일 + 7일)을 조회하시오
SELECT TM.MEMBER_NAME AS "이름", 
       TM.MEMBER_ID AS "아이디", 
       TR.RENT_DATE AS "대여일", 
       TR.RENT_DATE + 7 AS "반납예정일"
FROM TB_MEMBER TM
JOIN TB_RENT TR ON (TM.MEMBER_NO = TR.RENT_MEM_NO)
WHERE RENT_BOOK_NO = 22;

-- 5. 회원번호가 1번인 회원이 대여한 도서들의 도서명, 출판사명, 대여일, 반납예정일을 조회하시오
SELECT TB.BK_TITLE AS "도서명",
       TP.PUB_NAME AS "출판사명",
       TR.RENT_DATE AS "대여일", 
       TR.RENT_DATE + 7 AS "반납예정일"
FROM TB_PUBLISHER TP  
JOIN TB_BOOK TB ON (TP.PUB_NO = TB.BK_PUB_NO)
JOIN TB_RENT TR ON (TB.BK_NO = TR.RENT_BOOK_NO)
WHERE RENT_MEM_NO = 1;