[간단한 DB모델링 연습]
1.학사관리 업무분석
- 우리 학교에서 학생들이 어떤과목을 수강을 하고
어떤 과목을 교육을 하는지 데이터베이스로 시스템을 구축하려고 한다.
- 자바과정을 수강하는 학생들이 누구인지?
자바세부교과목이 무엇이고, 학점이 얼마인지?
- 어떤과목이 개강하는지? 어떤 과목이 폐강인지?
위와 같은 업무분석을 한 내용을 토대로 테이블설계를 한다.
1.중요 단어들만 나열해보자
: 학생, 과목, 수강, 학점
2.테이블설계 (주제)
:학생테이블->번호,이름,주소,연락처,이메일 등등
:과목테이블->과목명,학점
* 학생테이블에 과목코드가 입력이 되거나
과목테이블에 학번이 입력이 되면 테이블 모양이 이상해 진다.
학생 ---------- 과목
1 : N
N : 1
결론) 학생테이블과 과목테이블은 다:다 (N:M) 관계가 성립된다.
다:다 관계일경우 반드시 교차테이블이 있어야 한다.
* 학생테이블과 과목테이블의 관계를 정의한다.
학생 ---- 수강 ----- 과목
1 N 1
예)
회원 ------ 예매 ------ 영화
회원 ------ 구매 ------ 물품
사원 ------ 부서
N 1
* 테이블과의 관계는 대부분 일직선 형태를 이룬다.
drop table tb_student
drop table tb_gwamok
drop table tb_sugang
select * from tb_student
select * from tb_gwamok
[학생테이블]
create table tb_student
(
hakno char(4) primary key
,uname varchar(10) not null
,phone varchar(10) not null
)
[과목테이블]
create table tb_gwamok
(
gcode char(4) primary key
,gname varchar(20) not null
,hakjum tinyint default 1
)
[수강테이블]
create table tb_sugang
(
sno int identity primary key
,hakno char(4) foreign key references tb_student(hakno)
,gcode char(4) foreign key references tb_gwamok(gcode)
on update cascade
on delete cascade
,regdt smalldatetime default getdate()
)
insert tb_student values('5002','민들레','478-6932')
insert tb_student values ('5003','홍길동','223-4569')
insert tb_student values ('5004','라일락','354-7788')
insert tb_student values ('5005','무궁화','354-8520')
insert tb_student values ('5001','홍길동','444-8952')
insert tb_gwamok values('P001','데이터베이스',2)
insert tb_gwamok values('P002','JSP',5)
insert tb_gwamok values('D001','포토샵',3)
insert tb_gwamok values('D002','일러스트',3)
insert tb_gwamok values('C001','CAD',5)
insert tb_sugang values('5003','P001','2009-11-05')
insert tb_sugang values('5002','P001','2009-11-07')
insert tb_sugang values('5002','D001','2009-11-07')
insert tb_sugang values('5004','D001','2009-11-09')
insert tb_sugang values('5001','P002','2009-11-15')
select * from tb_student
select * from tb_sugang
select * from tb_gwamok
문)학번 5002의 이름과 수강과목은?
select tb_sugang.hakno,tb_student.uname,tb_gwamok.gname
from tb_sugang,tb_student,tb_gwamok
where tb_sugang.hakno=tb_student.hakno
and tb_sugang.gcode=tb_gwamok.gcode
and tb_sugang.hakno='5002'
select *
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
where tb_sugang.hakno='5002'
select *
from tb_sugang
where hakno='5002'
use mydb
[테이블 조인]
-- MS-SQL방식
select T1.*,T2.*
from T1,T2
where T1.x=T2.x
select T1.*,T2.*,T3.*
from T1,T2,T3
where T1.x=T2.x
and T2.y=T3.y
-- ANSI 표준방식
select T1.*, T2.*
from T1 join T2
on T1.x=T2.x
select *
from T1 join T2
on T1.x=T2.x join T3
on T2.y=T3.y
문) 학번 5002가 수강한 과목명과 이름 조회하시오
select tb_sugang.hakno,tb_sugang.gcode,
tb_gwamok.gname,tb_gwamok.hakjum,tb_student.uname
from tb_sugang join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode join tb_student
on tb_sugang.hakno=tb_student.hakno
where tb_sugang.hakno='5002'
문) 학번5002가 수강한 전체 학점의 합계는?
select AA.hakno,AA.uname,sum(AA.hakjum) as [전체학점]
from (
select tb_sugang.hakno,tb_sugang.gcode,
tb_gwamok.gname,tb_gwamok.hakjum,tb_student.uname
from tb_sugang join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode join tb_student
on tb_sugang.hakno=tb_student.hakno
where tb_sugang.hakno='5002'
) as AA
group by AA.hakno,AA.uname
문1)수강날짜 '2009-11-07' 입력하면 수강한 학번,학생이름,과목명 조회
select tb_student.hakno,tb_student.uname,tb_gwamok.gname,regdt
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
where convert(char(10),tb_sugang.regdt,120)='2009-11-07'
문2)과목코드 'P001'를 입력하면 수강한 학생의 학번,이름 조회
select tb_sugang.gcode,tb_gwamok.gname,
tb_student.hakno,tb_student.uname
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
where tb_sugang.gcode='P001'
문3)과목당 수강한 인원이 각각 몇명인지 조회
select tb_sugang.gcode,tb_gwamok.gname,count(tb_sugang.gcode)
from tb_sugang join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
group by tb_sugang.gcode, tb_gwamok.gname
문4)과목당 수강인원이 2명이상인 과목명,과목코드,인원수 조회
select AA.gcode,AA.gname,count(AA.gcode)
from (
select tb_sugang.gcode,tb_gwamok.gname
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
) as AA
group by AA.gcode,AA.gname
having count(AA.gcode)>=2
문5)수강신청한 인원이 제일 적은 과목명과 학생의 학번,이름 조회
select *
from tb_student
where hakno in (select hakno
from tb_sugang
where gcode=(select top 1 gcode
from tb_sugang
group by gcode
order by count(gcode)
)
)
문6)수강신청을 하지 않은 과목은?
select *
from tb_gwamok
where gcode not in (select gcode from tb_sugang)
[관계형 데이터베이스]
개념:데이터베이스내의 테이블은 최소한의 의미(주제)를 가지는
테이블로 분리해서 구성하되,
그 테이블에 있는 컬럼을 연결한 것이다.
부모테이블:Primary Key 기본키
자식테이블:Foreign Key 외래키
형태로 연결된다.
* 분리된 테이블은 관계가 형성되는데 총3가지 유형이 있다.
1. 1:1 관계
두테이블간 어떤 테이블의 PK라도
다른 테이블에 전이되어도 상관없다
2. 1:N 관계
두 테이블간의 관계를 위해서 교차테이블 만들 필요 없다.
단, 1관계에 있는 PK를 N관계에 있는 테이블에 컬럼으로
전이시켜 관계를 맺는다.
예)부서 ---- 사원
3. N:M 관계
두 테이블간의 관계를 위해서 교차테이블을 반드시 만든다
예)학생-수강-과목
회원-예매-영화
회원-구매-물품
* Foreign Key로 두 테이블간의 데이터 무결성(결점이 없는)을
강제할수 있으며, JOIN작업으로 원하는 작업을 처리한다.
[참조무결성(FK제약조건)]
컬럼에 적용되는 3가지 제약조건
not null
no change->함부로 변하면 안됨
no duplicate
부모테이블 자식테이블
입력 상관없음 반드시 부모테이블에 있는
데이터가 입력된다.
수정 수정하려는 데이터가 부모테이블에 존재하는
자식테이블에서 참조하고 다른데이터로 변경 가능
있는지 검증
삭제 삭제하려는 데이터가 제약없다.
자식테이블에서 참조하고
있는지 검증
'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글
뷰 VIEW (0) | 2009.11.27 |
---|---|
[MS-SQL] 최종 실습 예제 (0) | 2009.11.27 |
우편번호 쿼리 (0) | 2008.12.19 |
18_회원 (0) | 2008.06.18 |
17_공지사항 (0) | 2008.06.18 |