본문 바로가기

DB 수업 정리

DB 4일차

school db에서 활용

1. at_year을 2024로 업데이트

update attend
set at_year=2024;


2. at_term 학기 11명은 (1~11) => 1   / 12~22 => 2
업데이트 (if문 / case when then 활용)

update attend
set at_term =
case
when at_num <= 11 then 1
when at_num >= 12 then 2
end;


3. at_mid:40 / at_final:40 / at_hw:10 / at_attend:10
1학기 점수만 채우기

update attend
set at_attend = 10
where at_num = 1;
update attend
set at_attend = 10
where at_num = 2;
update attend
set at_attend = 8
where at_num = 3;
update attend
set at_attend = 9
where at_num = 4;
update attend
set at_attend = 3
where at_num = 5;
update attend
set at_attend = 6
where at_num = 6;
update attend
set at_attend = 2
where at_num = 7;
update attend
set at_attend = 10
where at_num = 8;
update attend
set at_attend = 2
where at_num = 9;
update attend
set at_attend = 4
where at_num = 10;
update attend
set at_attend = 1
where at_num = 11;

중앙 set 자리에 4개를 바꿔가며 업데이트 했는데,

update attend set at_mid = , at_final = , at_hw = , at_attend = , where at_num = 

이렇게 한번에 하는게 더 좋았을거같음.


4. at_score(학점) 1학기만 채우기

at_mid + at_final + at_hw + at_attend >= 90 A
at_mid + at_final + at_hw + at_attend >= 80 B
at_mid + at_final + at_hw + at_attend >= 70 C
at_mid + at_final + at_hw + at_attend >= 60 D
else F


update attend
set at_score =(
case 
when (at_mid+at_final+at_hw+at_attend) >= 90 then 'A'
when (at_mid+at_final+at_hw+at_attend) >= 80 then 'B'
when (at_mid+at_final+at_hw+at_attend) >= 70 then 'C'
when (at_mid+at_final+at_hw+at_attend) >= 60 then 'D'
else 'F'
end)
where at_term = 1;


5. at_repetition(재수강여부) 1학기만 채우기
at_score 'F' 또는 at_attend이 3이하이면 y

update attend
set at_repetition = (
case
when (at_score = 'F' or at_attend<= 3) then 'y'
else 'n'
end)
where at_term = 1;

----------------------------------------------------------------------------

- score별 인원수 집계(단, null은 제외)

select at_score , count(at_score) from attend
group by at_score
having at_score is not null
order by at_score;


- 재수강 인원 집계

select at_repetition ,count(at_repetition) as '재수강 인원' from attend
group by at_repetition
having at_repetition = 'y';

 

- join

 

 

inner join => join

- 재수강 학생 명단 

select s.std_name from student s
inner join attend a on s.std_num = a.at_std_num
where a.at_repetition = 'y';

--------------------------------------------------

select * from student s
inner join attend a on s.std_num = a.at_std_num
inner join course c on a.at_co_code = c.co_code;

----------------------------------------------------


- A 학점 학생들의 명단을 출력

select * from student s
inner join attend a on s.std_num = a.at_std_num
where a.at_score = 'A';

- 학번, 이름 ,학점만 표시

select s.std_num, s.std_name, a.at_score from attend a
join student s on s.std_num = a.at_std_num
where a.at_score = 'A';

 

 


 

ERD Cloud : ERD 다이어그램을 그리는 사이트

 

 

식별관계 : 둘다 같은 기본키
비식별관계 : 기본키를 따로두고 외래키로 연결

 

 

workbench 에서도 표시가능 단, 전부 만들고나서 가능 만들기전에는 불가능.

 

-----------------------------------------------------------

1. F 학점의 학생명단 (학번,이름,학과)

select s.std_num, s.std_name, s.std_major from student s
inner join attend a on s.std_num = a.at_std_num
where a.at_score = 'F';

2. A 학점의 학생명단 (학번,이름,과목)

select s.std_num, s.std_name, c.co_name from student s
join attend a on s.std_num = a.at_std_num
join course c on a.at_co_code = c.co_code
where a.at_score = 'A';


3. A학점 학생들의 (학번, 이름, 과목, 성적)
- 성적(mid+final+attend+hw) as '성적' 

select s.std_num, s.std_name, c.co_name, (at_mid+at_final+at_attend+at_hw) as '성적' from student s
join attend a on s.std_num = a.at_std_num
join course c on a.at_co_code = c.co_code
where a.at_score = 'A';


4. 과목별 (co_name) 성적 (중간,기말,출석,과제) 합계
과목              중  기  출 과
프로그래밍일반 65 68  30 40 

select c.co_name, sum(at_mid) 중간, sum(at_final) 기말, sum(at_attend) 출석, sum(at_hw) 과제 from attend a
join course c on a.at_co_code = c.co_code
group by c.co_name
order by c.co_name;



5. 학점별 중간,기말,출석,과제 평균

select at_score, round(avg(at_mid+at_final+at_attend+at_hw),2) as '성적평균' from attend
group by at_score
having at_score is not null
order by at_score;

select at_score, round(avg(at_mid),2) 중간, round(avg(at_final),2) 기말, round(avg(at_attend),2) 출석, round(avg(at_hw),2) 과제 from attend
group by at_score
having at_score is not null
order by at_score;


6. 강철수가 수강하고 있는 과목들의 이름, 교수명 출력

select c.co_name, c.co_professor from attend a
join student s on s.std_num = a.at_std_num
join course c on a.at_co_code = c.co_code
where s.std_name = '강철수';


-------------------------------------------------------------------------

1. 학번이 2020으로 시작되는 학생들의
학번, 이름, 학과 출력

select std_num, std_name, std_major from student
where std_num like '%2020%';


2. 프로그래밍일반 과목을 듣는 학생 명단 출력
학번, 이름, 학과 출력

select s.std_num, s.std_name, s.std_major from student s
join attend a on s.std_num = a.at_std_num
join course c on a.at_co_code = c.co_code
where c.co_name = '프로그래밍일반';



3. 홍길동 교수가 강의하는 과목을 듣는 학생명단 출력
학번, 이름, 학과, 수강과목, 담당교수

select s.std_num, s.std_name, s.std_major, c.co_name, c.co_professor from attend a
join student s on s.std_num = a.at_std_num
join course c on c.co_code = a.at_co_code
where c.co_professor = '홍길동';

4. 최수지, 강길동 학생이 흭득한 학점(co_point) 합계
 => 2학기는 미포함, 미 이수학점을 제외

select s.std_name, sum(c.co_point) from attend a
join student s on s.std_num = a.at_std_num
join course c on c.co_code = a.at_co_code
where at_score is not null and at_repetition ='n'

 

-- where at_term = 1 and at_repetition = 'n'
-- where at_term <> 2 and at_repetition <> 'y'
-- where not at_term = 2 and not at_repetition ='y'


group by s.std_name
having std_name = '최수지';


select s.std_name, sum(c.co_point) from attend a
join student s on s.std_num = a.at_std_num
join course c on c.co_code = a.at_co_code
where at_score is not null and at_repetition ='n'
group by s.std_name
having std_name = '강길동';


5. 재수강자 점수(중간+기말+출석+과제) as 합계
학번, 이름, 학과, 과목명, 점수합계

select s.std_num , s.std_name, s.std_major, c.co_name, (a.at_mid+ a.at_final + a.at_attend + a.at_hw) as 합계 from attend a
join student s on s.std_num = a.at_std_num
join course c on c.co_code = a.at_co_code
where at_repetition ='y';

 

 

 

WITH ROLLUP : 그룹별로 합계를 한번에 구할때 사용
GROUP BY 그룹명 WITH ROLLUP


과목별 (co_name) 성적 (중간,기말,출석,과제) 합계

과목              중  기  출 과
프로그래밍일반 65 68  30 40 
디자인기초      50 50  10  10
합계                00  00 00 00

select 
case
 when co_name is NULL then '합계'
else co_name
end as co_name,
sum(at_mid) 중간, sum(at_final) 기말, sum(at_attend) 출석, sum(at_hw) 과제 from attend a
join course c on a.at_co_code = c.co_code
group by c.co_name WITH ROLLUP
order by grouping(c.co_name);

select if(co_name is Null, '합계', c.co_name) as co_name, sum(at_mid) 중간, sum(at_final) 기말, sum(at_attend) 출석, sum(at_hw) 과제 from attend a
join course c on a.at_co_code = c.co_code
group by c.co_name WITH ROLLUP
order by grouping(c.co_name);

ifnull(값1, 값2) : 값1이 null이면 값2를 표시

select ifnull(c.co_name,'합계') as co_name, sum(at_mid) 중간, sum(at_final) 기말, sum(at_attend) 출석, sum(at_hw) 과제 from attend a
join course c on a.at_co_code = c.co_code
group by c.co_name WITH ROLLUP
order by grouping(c.co_name);


학점별 중간,기말,출석,과제 평균

select at_score, round(avg(at_mid),2) 중간, round(avg(at_final),2) 기말, round(avg(at_attend),2) 출석, round(avg(at_hw),2) 과제 from attend
group by at_score
having at_score is not null
order by at_score;


select ifnull(at_score,'평균') as 학점, round(avg(at_mid),2) 중간, round(avg(at_final),2) 기말, round(avg(at_attend),2) 출석, round(avg(at_hw),2) 과제 from attend
where at_term = 1
group by at_score WITH ROLLUP
order by grouping(at_score);

-- having a.at_score is not null
with rollup은 having 조건을 인식못함.


---------------------------------------------------------------------

rank() : 순위
rank() over(order by 기준칼럼 desc, asc) as 칼럼명
=> 값이 같다면 같은 순위를 가짐 다음순위는 건너 뜀
dense_rank() over(order by 기준칼럼 desc, asc) as 칼럼명
=> 값이 같다면 같은 순위를 가짐 다음 순위를 이어 감 

at_final을 기준으로 순위를 작성
학번 at_final ranking

select at_std_num, at_final, rank() over(order by at_final desc) as ranking from attend
where at_term = 1;

select at_std_num, at_final, dense_rank() over(order by at_final desc) as ranking from attend
where at_term = 1;


- 기말 성적을 기준으로 5등 미만까지만 장학금대상 명단

select at_std_num as 장학금대상, at_final, ranking from 
( select at_std_num, at_final, rank() over(order by at_final desc) as ranking from attend
where at_term = 1 ) p
where p.ranking < 5;

 

 

'DB 수업 정리' 카테고리의 다른 글

DB 6일차  (0) 2024.09.03
DB 5일차.  (3) 2024.09.02
DB 3일차  (2) 2024.08.29
DB 2일차  (0) 2024.08.28
DB 1일차  (5) 2024.08.27