본문 바로가기

MySQL

dbms 정규화 예제

USE TestDB

/*
 1. 업무분석 : 담당자와 인터뷰, 문서(서류, 장표, 보고서) 중심으로 업무 파악
 2. 개념적 데이터 베이스 모델링 : Entity(Table), Attribute(field) 구성(도출)
 3. 논리적 데이터 베이스 모델링 : 관계형 데이터 베이스 이론에 입각한 Schema(스키마) 설계
 4. 물리적 데이터 베이스 모델링 : DBMS의 종류 결정 column(field)의 Data Type, Size 정의
           
*/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  제1정규화  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--1) 부서적인 데이터를 저장하기 위해 기본 데이터가 중복된다
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE TABLE MemberShip1  -- 회원테이블
(
 mem_no int not null  
, names varchar(20) not null
, address varchar(255) null 
, mobile varchar(14) null
, ssnum char(14) null
, licencename varchar(30) null
, licence_no varchar(30) null
)
-- DROP TABLE MemberShip1
go

-- 데이타 INSERT
INSERT INTO MemberShip1 (mem_no, names, address, mobile, ssnum, licencename, licence_no) 
VALUES (1, ''백수영'', ''서울틀별시 강동구 천호동 천호동뒷골목'',''011-123-1234'',''123456-1234567'', ''정보처리기사'', ''123-456-887'')

INSERT INTO MemberShip1
VALUES (1, ''백수영'', ''서울틀별시 강동구 천호동 천호동뒷골목'',''011-123-1234'',''123456-1234567'', ''SCJP'', ''123-111-1111'')

INSERT MemberShip1
VALUES (1, ''백수영'', ''서울틀별시 강동구 천호동 천호동뒷골목'',''011-123-1234'',''123456-1234567'', ''MCSE'', ''2222-2222-1111'')


-- 테이블 조회
SELECT 
 mem_no as ''회원번호''
, names as ''이름''
, address as ''주소''
,   mobile as ''핸드폰번호''
, ssnum as ''주민번호''
, licencename as ''자격증''
, licence_no as ''자격증번호''
FROM MemberShip1

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 회원테이블처럼 반복되어지는 그룹 속성을 제거한 뒤 세로운 테이블을 생성하고 기존의 테이블과 
-- 1 : N의 관계를 형성하면 된다.
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CREATE TABLE MemberShip  -- 회원테이블
(
 mem_no int not null  
, names varchar(20) not null
, address varchar(255) null 
, mobile varchar(14) null
, ssnum char(14) null
, primary key (mem_no)
)
-- DROP TABLE MemberShip

CREATE TABLE Licence -- 자격증테이블
(
 licence_id int not null
, mem_no int not null
, licencename varchar(30) null
, licence_no varchar(30) null 
, primary key (licence_id)
)
-- DROP TABLE Licence

-- 회원테이블에 데이터 등록
INSERT INTO MemberShip (mem_no, names, address, mobile, ssnum) 
VALUES (1, ''백수영'', ''서울틀별시 강동구 천호동 천호동뒷골목'', ''011-123-1234'',''123456-1234567'')

-- 자격증테이블 데이터 등록
INSERT INTO Licence (licence_id, mem_no, licencename, licence_no)
VALUES (1, 1, ''정보처리기사'', ''123-456-887'')

INSERT INTO Licence (licence_id, mem_no, licencename, licence_no)
VALUES (2, 1, ''SCJP'', ''123-111-1111'')

INSERT INTO Licence (licence_id, mem_no, licencename, licence_no)
VALUES (3, 1, ''MCSE'', ''2222-2222-1111'')


-- 회원테이블 검색

SELECT mem_no, names, address, mobile, ssnum FROM MemberShip

-- 자격증테이블 검색
SELECT licence_id, mem_no, licencename, licence_no FROM Licence

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--2) 테이블에 필요없는 null값의 데이터 제거(쓸데없는 데이터 저장 공간 낭비)  
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CREATE TABLE Curriculum1 --과정테이블
(
 curri_code varchar(10) not null           -- 과정코드
, curri_name varchar(100) not null          -- 과정명  
, curri_contents varchar(100) not null      -- 교육내용
, curri_period varchar(10) not null         -- 교육시간
, curri_time varchar(10) not null           -- 강의시간
, curri_price int not null                  -- 수강료
, curri_1 varchar(20) null                  -- 교재1
, curri_2 varchar(20) null                  -- 교재2
, curri_3 varchar(20) null                  -- 교재2  
, curri_4 varchar(20) null                  -- 교재4  
, primary key(curri_code)                   -- primary key(과정코드)
)

-- DROP TABLE Curriculum1

-- 과정테이블에 데이터 등록
INSERT INTO Curriculum1 (curri_code, curri_name, curri_contents, curri_period, curri_time, 
curri_price, curri_1, curri_2, curri_3, curri_4)
 VALUES (''A001'', ''웹프로그래밍'', ''웹 구현에 필요한 기본 구문'', ''5개월'', ''8시간'', 
1800000, ''SQL Server'', ''Html 활용'', ''ASP기초'', ''JSP활용'')

INSERT INTO Curriculum1 (curri_code, curri_name, curri_contents, curri_period, curri_time, 
curri_price, curri_1, curri_2)
 VALUES (''A002'', ''웹마스터'', ''웹 사이트를 구축할 수'', ''4개월'', ''4시간'', 
700000, ''Windows 2000'', ''SQL Server'')

INSERT INTO Curriculum1 (curri_code, curri_name, curri_contents, curri_period, curri_time, 
curri_price, curri_1, curri_2)
 VALUES (''A003'', ''ASP프로그래밍'', ''ASP를 활용한 웹사이트 구축'', ''3개월'', ''8시간'', 
1400000, ''Html 기초'', ''ASP 활용'')

INSERT INTO Curriculum1 (curri_code, curri_name, curri_contents, curri_period, curri_time, 
curri_price, curri_1, curri_2)
 VALUES (''J001'', ''JAVA 프로그래밍'', ''자바 프로그래머가 되기 위'', ''9개월'', ''9시간'', 
2000000, ''SQL Server'', ''JAVA기초'')

-- 과정 테이블 검색

SELECT curri_code, curri_name, curri_contents, curri_period, curri_time
  ,curri_price ,curri_1, curri_2, curri_3, curri_4
FROM Curriculum1

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 현재 테이블의 경우 교재 컬럼처럼 반복되는 속성을 갖는 컬럼의 경우 따로 분리해서 기존의 테이블
-- 과 1:N의 관계형성을 해야 한다
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CREATE TABLE Curriculum --과정테이블
(
 curri_code varchar(10) not null           -- 과정코드
, curri_name varchar(100) not null          -- 과정명  
, curri_contents varchar(100) not null      -- 교육내용
, curri_period varchar(10) not null         -- 교육시간
, curri_time varchar(10) not null           -- 강의시간
, curri_price int not null                  -- 수강료
, primary key(curri_code)                   -- primary key(과정코드)
)

-- DROP TABLE Curriculum

CREATE TABLE Part
(
 curri_no int not null                     -- 교재번호
, part_name varchar(20) not null            -- 교재명
,   curri_code varchar(10) not null           -- 과정코드
,   primary key (curri_no)                    -- primary key(교재번호)
)
-- DROP TABLE Part
-- 과정테이블에 데이터 등록

INSERT INTO Curriculum (curri_code, curri_name, curri_contents, curri_period, curri_time, curri_price) 
VALUES (''A001'', ''웹프로그래밍'', ''웹 구현에 필요한 기본 구문'', ''5개월'', ''8시간'', 1800000)

INSERT INTO Curriculum (curri_code, curri_name, curri_contents, curri_period, curri_time, curri_price)
VALUES (''A002'', ''웹마스터'', ''웹 사이트를 구축할 수'', ''4개월'', ''4시간'', 700000)

INSERT INTO Curriculum (curri_code, curri_name, curri_contents, curri_period, curri_time, curri_price)
VALUES (''A003'', ''ASP프로그래밍'', ''ASP를 활용한 웹사이트 구축'', ''3개월'', ''8시간'', 1400000)

INSERT INTO Curriculum (curri_code, curri_name, curri_contents, curri_period, curri_time, curri_price) 
VALUES (''J001'', ''JAVA 프로그래밍'', ''자바 프로그래머가 되기 위'', ''9개월'', ''9시간'', 2000000)

-- 교재테이블에 데이터 등록

INSERT INTO Part (curri_no, part_name, curri_code) VALUES (1, ''SQL Server'', ''A001'')
INSERT INTO Part (curri_no, part_name, curri_code) VALUES (2, ''Html 활용'', ''A001'')
INSERT INTO Part (curri_no, part_name, curri_code) VALUES (3, ''ASP기초'', ''A001'') 
INSERT INTO Part (curri_no, part_name, curri_code) VALUES (4, ''JSP활용'', ''A001'')

INSERT INTO Part (curri_no, part_name, curri_code) VALUES (5, ''Windows 2000'', ''A002'') 
INSERT INTO Part (curri_no, part_name, curri_code) VALUES (6, ''Html 기초'', ''A003'') 
INSERT INTO Part (curri_no, part_name, curri_code) VALUES (7, ''ASP 활용'', ''A003'') 
INSERT INTO Part (curri_no, part_name, curri_code) VALUES (8, ''JAVA기초'', ''J001'')

-- 과목테이블 검색
SELECT curri_code, curri_name, curri_contents, curri_period, curri_time, curri_price FROM Curriculum
-- 교제테이블 검색
SELECT curri_no, part_name, curri_code FROM Part

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  제2정규화  
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
--1)기본키가 아닌 일반키의 경우에는 기본키와 상관이 있어야 한다.(의존적이어야 한다)

CREATE TABLE Ohem  --사원테이블
(
 empid int not null                       -- 사원번호
, name varchar(20) not null                -- 이름
, address varchar(255) not null            -- 주소   
, sex char(2) not null                     -- 성별
, entdate varchar(30) not null             -- 입사일
, primary key (empid)                      -- primary key(사원번호)
)
-- DROP TABLE Ohem
-- 사원테이블에 데이터 등록

INSERT INTO Ohem (empid, name, address, sex, entdate) VALUES (1, ''백수영'', ''서울'', ''남'', ''2006-04-07'')
INSERT INTO Ohem (empid, name, address, sex, entdate) VALUES (2, ''이종선'', ''시흥'', ''남'', ''2006-09-04'')
INSERT INTO Ohem (empid, name, address, sex, entdate) VALUES (3, ''김대문'', ''서울'', ''남'', ''2006-09-11'')
INSERT INTO Ohem (empid, name, address, sex, entdate) VALUES (4, ''정태호'', ''경기'', ''남'', ''2006-01-02'')

-- 사원테이블 검색
SELECT empid, name, address, sex, entdate FROM Ohem

--2)복합키인경우(키가 2개이상이 결합하여 PK가 되는것)

 

CREATE TABLE Partinsert1 -- 학과등록테이블
(
 stud_no int not null                      -- 학번
, part_code char(3) not null                -- 과정코드  
, valuation_code char(3) not null           -- 평가코드   
, part_name varchar(100) not null           -- 과정명
, perioddate varchar(6) not null            -- 기간
    primary key(stud_no, part_code)           -- primary key(학번, 과정코드:복합키)
)
-- DROP TABLE Partinsert1
-- 학과등록테이블 데이터 등록
INSERT INTO Partinsert1 (stud_no, part_code, valuation_code, part_name, perioddate) 
VALUES (100, ''A01'', ''A'', ''JAVA 프로그래밍'', ''4개월'')

INSERT INTO Partinsert1 (stud_no, part_code, valuation_code, part_name, perioddate) 
VALUES (101, ''B01'', ''D+'', ''웹 마스터'', ''6개월'')

INSERT INTO Partinsert1 (stud_no, part_code, valuation_code, part_name, perioddate) 
VALUES (101, ''B03'', ''A'', '' DBMS 전문가'', ''5개월'')

INSERT INTO Partinsert1 (stud_no, part_code, valuation_code, part_name, perioddate) 
VALUES (100, ''B01'', ''B'', ''웹 마스터'', ''6개월'')


-- 학과테이블 검색
SELECT stud_no, part_code, valuation_code, part_name, perioddate FROM Partinsert1
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 평가코드는 학번과 과정코드 전체에 의존적이지만 과정명, 기간은 복합키의 일부분인 과정코드
-- 에 의해서 지배됨을 알수 있다. 
-- 학과테이블을 보면 과정명, 기간에 중복되는 데이터가 계속 쌓이고 있다
-- 학과테이블처럼 설계되었을경우 데이터 무결성(데이터중복)을 유지하기가 어렵다. 만약 과정명이 
-- ''웹 마스터''이 ''웹 마스터과정''으로 수정이 되었을 경우는 그에 해당하는 모든 데이터를 변경해야 한다
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CREATE TABLE Partinsert
(
 stud_no int not null                      -- 학번
, part_code char(3) not null                -- 과정코드(fk)  
, valuation_code char(3) not null           -- 평가코드   
    primary key(stud_no, part_code)           -- primary key(학번, 과정코드:복합키)
)
-- DROP TABLE Partinsert
CREATE TABLE Part_1
(
 part_code char(3) not null                -- 과정코드
, part_name varchar(100) not null           -- 과정명
, perioddate varchar(6) not null            -- 기간
, primary key(part_code)                    -- primary key(과정코드)
)
-- DROP TABLE Part_1
-- 학과등록테이블에 데이터 등록
INSERT INTO Partinsert (stud_no, part_code, valuation_code) VALUES (100, ''A01'', ''A'')
INSERT INTO Partinsert (stud_no, part_code, valuation_code) VALUES (101, ''B01'', ''D+'')
INSERT INTO Partinsert (stud_no, part_code, valuation_code) VALUES (101, ''B03'', ''A'')
INSERT INTO Partinsert (stud_no, part_code, valuation_code) VALUES (100, ''B01'', ''B'')

-- 과정테이블에 데이터 등록 
INSERT INTO Part_1 (part_code, part_name, perioddate) VALUES (''A01'', ''JAVA 프로그래밍'', ''4개월'')
INSERT INTO Part_1 (part_code, part_name, perioddate) VALUES (''B01'', ''웹 마스터'', ''6개월'')
INSERT INTO Part_1 (part_code, part_name, perioddate) VALUES (''A03'', ''DBMS 전문가'', ''5개월'')

-- 학과테이블 검색
SELECT stud_no, part_code, valuation_code FROM Partinsert
-- 과정테이블 검색
SELECT part_code, part_name, perioddate FROM Part_1


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  제3정규화 :  테이블의 키(primary key)가 아닌 컬럼들은 기본키에 의존해야 하는데 겉으로는 그런 것처럼 보이지만 실제
            로는 기본키가 아닌 다른 일반 컬럼에 의존하는 컬럼들이 있을수 있다. 이를 이전적 함수 종속 관계라고
               하며 이를 해결하는 것이 바로 제 3정규화이다   
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

CREATE TABLE Orderer1 -- 주문테이블 생성
(
 order_id int not null                    -- 주문ID
,   thing_id char(3) not null                -- 상품ID 
, mem_id varchar(10) not null              -- 회원ID
, mem_name varchar(30) not null            -- 회원명
, mem_phone varchar(15)                    -- 전화번호
, mem_level char(5)                        -- 회원등급
, pic int                                  -- 수량
, pic_price int                            -- 단가 
, primary key (order_id)                   -- primary key(주문ID)
)
-- DROP TABLE Orderer1
-- 주문테이블 데이터 등록
INSERT INTO Orderer1 (order_id, thing_id, mem_id, mem_name, mem_phone, mem_level, pic, pic_price) 
VALUES (1, ''A01'', ''KIM'', ''김대문'', ''02-222-2222'', ''우수'', 2, 10000)

INSERT INTO Orderer1 (order_id, thing_id, mem_id, mem_name, mem_phone, mem_level, pic, pic_price) 
VALUES (2, ''B03'', ''BACK'', ''백수영'', ''043-2345-4568'', ''일반'', 1, 20000)

INSERT INTO Orderer1 (order_id, thing_id, mem_id, mem_name, mem_phone, mem_level, pic, pic_price) 
VALUES (3, ''A02'', ''LEE'', ''이종건'', ''031-123-5555'', ''일반'', 4, 15000)

INSERT INTO Orderer1 (order_id, thing_id, mem_id, mem_name, mem_phone, mem_level, pic, pic_price) 
VALUES (4, ''B03'', ''JEONG'', ''정태호'', ''042-2234-1278'', ''우수'', 3, 16000)


-- 주문테이블 검색
SELECT order_id, thing_id, mem_id, mem_name, mem_phone, mem_level, pic, pic_price FROM Orderer1
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 주문 테이블에서 키가 아닌 모든 컬럼은 기본키인 주문ID에 종속적인가?
-- 그렇지 않다. 회원명, 전화번호, 회원등급은 회원ID에 종속적이다
-- 주문테이블처럼 설계될경우 주문할때마다 회원ID, 회원명, 전화번호, 회원등급에 대한 데이터가 계속해서 종복되어 
-- 쌓인다. 중복되이터로 인한 데이터의 무결성이 유지되기 어렵다. 만약 홍길동이란 회원의 전화번호가 변경될경우
-- 홍길동이란 회원의 모든 전화번호를 수정해 주어야 한다. 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

-- 제3정규화에 의한 테이블 분리
CREATE TABLE Orderer -- 주문테이블생성
(
 order_id int not null                    -- 주문ID
,   thing_id char(3) not null                -- 상품ID 
, mem_id varchar(10) not null              -- 회원ID
, pic int                                  -- 수량
, pic_price int                            -- 단가 
, primary key (order_id)                   -- primary key(주문ID)
)
-- DROP TABLE Orderer
CREATE TABLE OrdererMembers -- 회원테이블생성
(
 mem_id varchar(10) not null              -- 회원ID
, mem_name varchar(30) not null            -- 회원명
, mem_phone varchar(15) null               -- 전화번호
, mem_level char(5) null                   -- 회원등급
, primary key (mem_id)                     -- primary key(회원ID)
)
-- DROP TABLE OrdererMembers
-- 주문테이블에 데이터 등록
INSERT INTO Orderer (order_id, thing_id, mem_id, pic, pic_price) VALUES (1, ''A01'', ''KIM'', 3, 16000)
INSERT INTO Orderer (order_id, thing_id, mem_id, pic, pic_price) VALUES (2, ''B03'', ''BACK'', 1, 20000)
INSERT INTO Orderer (order_id, thing_id, mem_id, pic, pic_price) VALUES (3, ''A02'', ''LEE'', 4, 15000)
INSERT INTO Orderer (order_id, thing_id, mem_id, pic, pic_price) VALUES (4, ''B03'', ''JEONG'', 3, 16000)

-- 회원테이블 데이터 등록
INSERT INTO OrdererMembers (mem_id, mem_name, mem_phone, mem_level) VALUES (''KIM'', ''김대문'', ''02-222-2222'', ''우수'')
INSERT INTO OrdererMembers (mem_id, mem_name, mem_phone, mem_level) VALUES (''BACK'', ''백수영'', ''043-2345-4568'', ''일반'')
INSERT INTO OrdererMembers (mem_id, mem_name, mem_phone, mem_level) VALUES (''LEE'', ''이종건'', ''031-123-5555'', ''일반'')
INSERT INTO OrdererMembers (mem_id, mem_name, mem_phone, mem_level) VALUES (''JEONG'', ''정태호'', ''042-2234-1278'', ''우수'')

-- 주문테이블 검색
SELECT order_id, thing_id, mem_id, pic, pic_price FROM Orderer
-- 회원테이블 검색
SELECT mem_id, mem_name, mem_phone, mem_level FROM OrdererMembers

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 제3정규화란 기본키에 전적으로 의존하지 않고 키(primary key)가 아닌 일반 컬럽에 의존하는 컬럼을 제거
-- 시켜 원래의 제자리에 위치시키는 것이다.
-- 따라서 주문테이블에서 키가 아닌 컬럼인 회원ID에 종속되어지는 회원명, 전화번호, 회원등급을 제거시켜 
-- 회원(OrdererMembers)이라는 새로운 테이블로 구성을 한다.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 제4정규화
-- 3정규화를끝내고 나서도 , 두 테이블간에 의존적인 다대다 관계가 나오면 , 그것은 제4정규화에 해당한다.
-- 예)학생과 과목의 관계 (학생이 여러과목의 수업을듣는다. 하나의 과목에 수강생이 여러명이다.)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
CREATE TABLE Student1 -- 학생테이블
(
 stud_no int not null                  -- 학번
, stud_name varchar(30)                 -- 이름   
, primary key (stud_no)                 -- primary key(학번)
)
-- DROP TABLE Student1
CREATE TABLE Part4 -- 과목테이블
(
 part_no int not null                  -- 과목번호
, part_name varchar(30)                 -- 과목명
, primary key (part_no)                 -- primary key(과목번호)
)
-- DROP TABLE Part4

-- 학생테이블에 데이터 등록
INSERT INTO Student1 (stud_no, stud_name) VALUES (1, ''김대문'')
INSERT INTO Student1 (stud_no, stud_name) VALUES (2, ''백수영'')
INSERT INTO Student1 (stud_no, stud_name) VALUES (3, ''이종선'')
INSERT INTO Student1 (part_no, stud_name) VALUES (4, ''정태호'')

-- 과목테이블 데이터 등록
INSERT INTO Part4 (part_no, part_name) VALUES (1, ''국어'') 
INSERT INTO Part4 (part_no, part_name) VALUES (2, ''영어'') 
INSERT INTO Part4 (part_no, part_name) VALUES (3, ''수학'') 
INSERT INTO Part4 (part_no, part_name) VALUES (4, ''과학'') 
INSERT INTO Part4 (part_no, part_name) VALUES (5, ''문학'') 
INSERT INTO Part4 (part_no, part_name) VALUES (6, ''역사'')

-- 학생테이블 검색
SELECT stud_no, stud_name FROM Student1
-- 과목테이블 검색
SELECT part_no, part_name FROM Part4

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 다:다(N:N) 관계를 피하기 우해서 1:다 와 다:1의 관계로 테이블을 나누어야 한다. 중간에 학생테이블과 과목테이블이 
-- 참조할 수 있는 새로운 테이블을 만든다.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
CREATE TABLE Student -- 학생테이블
(
 stud_no int not null                  -- 학번
, stud_name varchar(30)                 -- 이름   
, primary key (stud_no)                 -- primary key(학번)
)

-- DROP TABLE Student

CREATE TABLE Lecture
(
 Lecture_no int not null               -- 수강번호
,   stud_no int not null                  -- 학번
, part_no char(1) not null              -- 과목코드
, primary key (Lecture_no)              -- primary key(수강번호) 
)

-- DROP TABLE Lecture

CREATE TABLE PartS -- 과목테이블
(
  part_no char(1) not null              -- 과목코드
, part_name varchar(30)                 -- 과목명
, primary key (part_no)                 -- primary key(과목코드)
)

-- DROP TABLE PartS

-- 학생테이블에 데이터 등록
INSERT INTO Student (stud_no, stud_name) VALUES (1, ''김대문'')
INSERT INTO Student (stud_no, stud_name) VALUES (2, ''백수영'')
INSERT INTO Student (stud_no, stud_name) VALUES (3, ''이종선'')
INSERT INTO Student (stud_no, stud_name) VALUES (4, ''정태호'')

-- 수강테이블에 데이터 등록
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (1, 1, ''A'') 
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (2, 1, ''B'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (3, 2, ''A'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (4, 2, ''B'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (5, 2, ''C'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (6, 3, ''F'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (7, 3, ''D'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (8, 4, ''B'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (9, 4, ''D'')
INSERT INTO Lecture (Lecture_no, stud_no, part_no) VALUES (10, 4, ''E'')  

-- 과목테이블 데이터 등록
INSERT INTO PartS (part_no, part_name) VALUES (''A'', ''국어'') 
INSERT INTO PartS (part_no, part_name) VALUES (''B'', ''영어'') 
INSERT INTO PartS (part_no, part_name) VALUES (''C'', ''수학'') 
INSERT INTO PartS (part_no, part_name) VALUES (''D'', ''과학'') 
INSERT INTO PartS (part_no, part_name) VALUES (''E'', ''문학'') 
INSERT INTO PartS (part_no, part_name) VALUES (''F'', ''역사'')

-- 학생테이블 검색
SELECT stud_no, stud_name FROM Student
-- 수강테이블 검색
SELECT Lecture_no, stud_no, part_no FROM Lecture
-- 과목테이블 검색
SELECT part_no, part_name FROM PartS