일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 부트스트랩
- Oracle SQL
- CRUD
- JavaScript
- Oracle DB
- tomcat
- ||
- group by
- jQuery
- oracle
- github
- HTTP Status 500
- Bootstrap
- git
- SQL
- 제약조건
- 한글 인코딩
- rownum
- sql developer
- 성적프로그램
- 모조칼럼
- 과정평가형
- JSP
- 이클립스
- distinct
- Java
- HTML
- HTTP Status 404
- alias
- 답변형 게시판
초급의 끄적거림
[SQL] 학사관리프로그램 만들기 본문
[학사관리 프로그램만들기]
1) 시나리오 작성
⊙ 학생, 교과목, 수강신청 등의 컬럼들을 필요로 함
다대다 관계 |
학생테이블 -- 수강 -- 과목테이블 → 1명의 수강생이 여러 개를 수강신청 할 수 있음 1 n n 1 n m
회원테이블 -- 예매 -- 영화테이블 |
1대1 관계 |
직원과 부서, 학생과 학생, 시립유치원과 원생 |
2) 학생테이블 만들기
create table tb_student( hakno char(5) primary key ,uname varchar(20) not null ,email varchar(50) unique ,address varchar(20) not null ,phone varchar(20) ,regdt date default sysdate -- 등록일 ); |
3) 학생 테이블 행추가
insert into tb_student(hakno, uname, email, address, phone)
values('g1001', '홍길동', '1hong1@naver.com', '서울', '111-2222');
insert into tb_student(hakno, uname, email, address, phone )
values('g1002', '홍길동', '2gil2@daum.com', '제주', '331-2223');
insert into tb_student(hakno, uname, email, address, phone)
values('g1003', '개나리', '3gae3@naver.com', '서울', '111-2224');
insert into tb_student(hakno, uname, email, address, phone)
values('g1004', '홍길동', '4dong4@google.com', '부산', '222-2225');
insert into tb_student(hakno, uname, email, address, phone)
values('g1005', '진달래', '5jin5@naver.com', '서울', '445-2226');
insert into tb_student(hakno, uname, email, address, phone)
values('g1006', '개나리', '6dog6@google.com', '제주', '311-2227');
문1) 지역별 인원수를 인원수순으로 조회하시오 |
select address, count(*) from tb_student group by address order by count(*); |
문2) 동명이인이 몇 명인지 조회하시오 |
select uname, count(*) from tb_student group by uname; |
문3) 학생테이블의 학번, 이름, 주소를 조회하시오 (주소는 영문으로 출력) |
select hakno, uname, CASE when address='서울' then 'SEOUL' when address='제주' then 'JEJU' when address='부산' then 'BUSAN' END as JUSO from tb_student; |
문4) 주소별 인원수가 3명 미만 인원수순으로 내림차순으로 조회하시오 |
select address, count(*) from tb_student group by address having count(*)<3 order by count(*) desc ; |
4) 과목테이블 만들기
create table tb_gwamok( gcode char(5) primary key --과목코드 ); |
5) 과목테이블 행추가
insert into tb_gwamok(gcode, gname, ghakjum)
values ('p001', 'OOP', 3);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('p002', 'Oracle', 2);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('p003', 'JSP', 3);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('d001', '웹표준', 1);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('d002', '포토샵', 3);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('d003', 'HTML', 1);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('c011', '실내건축', 3);
insert into tb_gwamok(gcode, gname, ghakjum)
values ('p004', 'JavaScript', 2);
문5) 프로그램 교과목만 조회하시오 |
select gcode, gname from tb_gwamok where gcode like 'p%'; |
문6) 디자인 교과목 중 3학점만 조회하시오 |
select gname, ghakjum from tb_gwamok where gcode like 'd%' and ghakjum=3; |
문7) 프로그램 교과목의 학점 평균보다 낮은 프로그램 교과목을 조회하시오 |
① 프로그램 교과목의 학점 평균구하기 select avg(ghakgum) from tb_gwamok where gcode like 'p%'; --프로그램 교과목의 학점평균 2.5
|
② 프로그램 교과목의 학점 평균보다 낮은 프로그램 교과목을 조회 select gcode, gname, ghakjum from tb_gwamok where ghakjum< ( select avg(ghakgum) from tb_gwamok where gcode like 'p%') -- 미리 만들어 둔 프로그램 교과목의 학점평균을 넣어줌 and gcode like 'p%'; -- 프로그램 교과목을 조회하라고 함
|
6) 수강테이블 생성
create table tb_sugang( sno number -- 일련번호 ,hakno char(5) --학번 (fk 이기 때문에 부모칼럼과 동일하게 들어가야 함) ,gcode char(5) --과목코드 (fk 이기 때문에 부모칼럼과 동일하게 들어가야 함) ,primary key(sno) --제약조건을 뒤에 따로 , 를 달아서 붙여줘도 됨 ,foreign key(hakno) references tb_student(hakno) ,foreign key(gcode) references tb_gwamok(gcode) ); |
<foreign key에 달 수 있는 옵션>
⊙ NO ACTION(자료형을 남기겠다), SET DEFAULT, SET NULL, ON DELETE CASCADE, CASCADE
⊙ ON UPDATE CASCADE : 부모테이블이 수정되면 자식테이블도 같이 수정 되도록
⊙ ON DELETE NO ACTION : 부모테이블이 삭제되더라도 자식테이블은 남아 있도록
⊙ ON DELETE CASCADE : 부모컬럼이 지워지면 같이 지워짐
7) 수강테이블의 일련번호 시퀀스생성
create sequence sugang_seq; |
8) 수강테이블 행추가
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1002', 'p001');
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1004', 'p001');
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1004', 'p002');
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1002', 'p004');
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1006', 'd001');
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1006', 'd003');
insert into tb_sugang(sno, hakno, gcode) values (sugang_seq.nextval, 'g1002', 'd003');
9) 수강테이블(tb_sugang)과 학생테이블(tb_student) 조인
① 테이블 별칭 사용 X select tb_student.hakno, tb_sugang.gcode, tb_student.uname from tb_sugang join tb_student on tb_sugang.hakno=tb_student.hakno;
|
② 테이블 별칭 사용 select SU.hakno, SU.gcode, STU.uname from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno; |
10) 수강테이블과 과목테이블 조인
select SU.hakno, GW.gcode, GW.gname, GW.ghakjum from tb_sugang SU join tb_gwamok GW on SU.gcode=GW.gcode; |
11) 수강테이블을 기준으로 학생테이블, 과목테이블 조인
select SU.hakno, SU.gcode, STU.uname, GW.gname, GW.ghakejum from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno join tb_gwamok GW on SU.gcode=GW.gcode; |
문1) 수강신청을 한 학생들 중에서 '제주'에 사는 학생들만 학번, 이름, 주소를 조회 |
① 테이블 별칭 사용 select STU.hakno, STU.uname, STU.address from tb_student STU join tb_sugang SU on STU.hakno=SU.hakno where address='제주';
② 수강신청을 한 학생들의 학번, 이름, 주소를 조회 → 테이블 전체를 AA로 칭하고 수행 select hakno, uname, address |
문2) 지역별로 수강신청 인원수, 지역을 조회하시오 (제주 5, 부산 2) |
select STU.address, count(*) from tb_studetn STU join tb_sugang SU on STU.hakno=SU.hakno group by address order by count(*) desc;
select address, count(*) from( select SU.hakno, STU.uname, STU.address from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno ) group by AA.address, AA.hakno; |
문3) 과목별 수강 신청 인원수, 과목코드, 과목명을 조회하시오 |
- gcode만 카운트 select gcode, count(gcode) from tb_sugang group by gcode;
- AA 테이블로 만들고 과목테이블을 조인 select gcode, cnt, gname from ( select gcode, count(gcode) cnt from tb_sugang group by gcode ) AA join tb_gwamok GW AA.gcode=GW.gcode; |
문4) 지역별로 수강신청 인원수, 지역을 조회하시오 ('문2'의 확장판) |
select STU.hakno, STU.address from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno order by STU.address; |
문4-1) 문4의 데이터를 학번이 같은 동일인물끼리 묶어서 부산 1 / 제주 2로 만들기 |
select AA.address, count(aa.address) from ( select STU.hakno, STU.address from tb_sugang SU join tb_student STU on SU.hakno=STU.hakno group by STU.address, STU.hakno ) AA group by AA.address; |
'DB > Oracle' 카테고리의 다른 글
[SQL] join의 종류 (inner join / left join / right join) (0) | 2019.07.29 |
---|---|
[SQL] 학사프로그램 inner join 활용 (0) | 2019.07.29 |
[SQL] case when ~ then end 구문 / decode() 함수 (0) | 2019.07.25 |
[SQL] join 1 (0) | 2019.07.24 |
[SQL] Index (0) | 2019.07.24 |