| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 마스킹
- vscode
- WHERE절
- channels
- WIL
- WebSocket
- 프로그래머스
- Class
- resnet50
- 알고리즘
- 장고
- js
- 가상환경
- re-id
- 채팅
- 1주차
- 정보처리기사실기
- Git
- 프로젝트
- 파이썬
- 2주차
- github
- 백준
- Commpot
- poetry
- 미니프로젝트
- sql
- REDIS
- 정보처리기사
- 개발일지
Archives
- Today
- Total
개발일기
SQL 2주차 마지막으로, 종합 퀴즈 풀기 :) 본문
지금까지 배운 내용들을 가지고, 종합문제를 풀어보면서 내용도 정리하고 복잡한 문제 푸는 방법도 정리해보겠다~

그럼 가봅시다~~
퀴즈1) 평균 이상 포인트를 가지고 있으면 '잘 하고 있어요' / 낮으면 '열심히 합시다!' 표시하기
select pu.point_user_id, pu.point,
case when pu.point > (select avg(pu2.point) from point_users pu2 ) then '잘 하고 있어요!'
else '열심히 합시다' END as comment
from point_users pu;

이 문제에서 주의할 점..! 이렇게 하면 안돼요..
(select avg(pu2.point) from point_users pu2 ) => avg(pu2.point) 로 쓰면 안된다!!
처음에 이렇게 썼다가.. 이상한 결과값이 나와서 당황..;;
꼭 서브쿼리를 쓰도록 하자!
퀴즈2) 이메일 도메인별 유저의 수 세어보기
select SUBSTRING_INDEX(email,'@',-1), count(*) from users
group by SUBSTRING_INDEX(email,'@',-1);

이건 비교적 최근에 배운 내용이라 그런지 큰 어려움은 없었다~ substring_index를 쓰면 되는 문제!
퀴즈3) '화이팅'이 포함된 오늘의 다짐만 출력해보기
select c.comment from checkins c
where c.comment like '%화이팅%';

이것도 no problem!!
퀴즈4) 수강등록정보(enrolled_id)별 전체 강의 수와 들은 강의의 수, 그리고 진도율 출력해보기
어후.. 이 퀴즈는 좀 헤맸다..ㅠㅠ
이런 퀴즈를 풀 때는 step by step 생각해보자!
먼저, 수강등록정보별 전체 강의 수를 출력해보자!
select ed.enrolled_id , count(*) as total_cnt from enrolleds_detail ed
group by ed.enrolled_id
그 다음으로 들은 강의 수를 출력해보자!
select ed2.enrolled_id, count(*) as done_cnt from enrolleds_detail ed2
where ed2.done=1
group by ed2.enrolled_id
둘을 서브쿼리로 합쳐보자!
with table1 as (select ed.enrolled_id , count(*) as total_cnt from enrolleds_detail ed
group by ed.enrolled_id),
table2 as(select ed2.enrolled_id, count(*) as done_cnt from enrolleds_detail ed2
where ed2.done=1
group by ed2.enrolled_id )
select a.enrolled_id, a.total_cnt, b.done_cnt from table1 a
inner join table2 b
on a.enrolled_id=b.enrolled_id
그리고 진도율까지 구해주면, 문제 끝!
with table1 as (select ed.enrolled_id , count(*) as total_cnt from enrolleds_detail ed
group by ed.enrolled_id),
table2 as(select ed2.enrolled_id, count(*) as done_cnt from enrolleds_detail ed2
where ed2.done=1
group by ed2.enrolled_id )
select a.enrolled_id,
a.total_cnt,
b.done_cnt,
round(b.done_cnt/a.total_cnt,2) as '진도율' from table1 a
inner join table2 b
on a.enrolled_id=b.enrolled_id

이 퀴즈를 다음과 같은 방법으로도 해결할 수 있다~
select enrolled_id,
sum(done) as cnt_done,
count(*) as cnt_total,
round(sum(done)/count(*),2) as '진도율'
from enrolleds_detail ed
group by enrolled_id
가끔은.. 서브쿼리를 사용하지 않고도 더 간단히 데이터를 정리하는 방법이 있을 수 있다..ㅎㅎ
여기까지~ SQL에서 저장된 데이터를 읽어오고, 정리하는 방식, Read기능에 대해 배워보았다~

'오늘의 공부일기 > SQL 공부일기' 카테고리의 다른 글
| SQL 2주차 쿼리문 더 깔끔하게 정리하기 (0) | 2023.03.10 |
|---|---|
| SQL 2주차 Subquery 연습하기 (0) | 2023.03.02 |
| SQL 2주차 Join, Union 연습하기 (0) | 2023.03.02 |
| SQL 1주차 Group by, Order by 문법 연습 (0) | 2023.03.01 |
| SQL 1주차 select문, where절 연습 (0) | 2023.03.01 |