본문 바로가기
개발일지

[내일배움단] 엑셀보다 쉬운 SQL - 3주차 / 22년 1월 11일

by 능이버섯 2022. 1. 11.
반응형

[수업목표]

1. 여러 테이블의 정보를 연결하는 Join을 이해한다.
2. 연결된 정보를 바탕으로 보다 풍부한 데이터분석을 연습한다.
3. 아래 위로 결과를 연결하는 Union을 공부한다.

 

[배운 것]

  • 교집합 inner join

교집합을 구하는 것이기 때문에 순서가 바뀌어도 상관 없음

select * from checkins c

select * from users u

이렇게 둘 다 적어보고 뭐가 겹치는지 확인하고 그걸 연결해준다.

inner join users u on c.user_id = u.user_id

이런 식으로 겹치는 걸 적어주면 연결됨.

 

전체로 다 쓰면 이런 느낌

select * from checkins c
inner join users u on c.user_id = u.user_id

select * from users (이 부분은 나중에 지우기)

  • 테이블끼리 연결되는 값 left join

A, B 테이블을 연결할 때 어떤 테이블은 값이 들어있고 어떤 테이블은 비어있을 수 있다.

이 경우 NULL 이라고 뜨며 이건 count(*) 할 때 숫자에 포함되지 않음 주의.

inner join과 다르게 연결되는 값을 구하는 거라서 순서가 매우 중요하다.

 

  • 그룹/정렬할 때 콤마를 써서 한 번에 여러 개 기준을 세울 수 있다

A, B 테이블을 연결할 때 어떤 테이블은 값이 들어있고 어떤 테이블은 비어있을 수 있다.

이 경우 NULL 이라고 뜨며 이건 count(*) 할

 

 

  • 숙제 : enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기. user_id도 같이 출력되어야 한다

일필휘지로 쓱쓱 써서 정답화면 바로 나옴.

 

내가 작성한 코드

select e.enrolled_id, e.user_id, count(ed.done) as max_count from enrolleds e 
inner join enrolleds_detail ed on e.enrolled_id = ed.enrolled_id
where ed.done = '1'
group by e.enrolled_id
order by max_count desc

 

근데 답안 코드랑은 약간 차이가 있긴 했지만.. 아무튼 정답은 나왔으니깤ㅋㅋㅋㅋㅋㅋ

참고용 답안 코드

select e.enrolled_id,
	     e.user_id,
	     count(*) as cnt
  from enrolleds e
 inner join enrolleds_detail ed on e.enrolled_id = ed.enrolled_id
 where ed.done = 1
 group by e.enrolled_id, e.user_id
 order by cnt desc

 

 

[수강소감]

정말 응용력이 없다... 그리고 기억력이 나쁘다....

7월 10일 ~ 19일 사이를 구하려면 between을 쓰면 된다는 것까진 알겠는데....

어떻게 해야 결과가 도출되는지 기억이 안 나서 헤매다가 그냥 포기하고 7월 10일 이후인 사람 전부 다 해봄 ^^

그리고 ratio 어떻게 구하는지 1도 모르겠어서 걍 포기하고 강사님 설명 들었음.

정답은 중간에 and를 썼어야 했다 ^^

중간 중간에 ' 를 빼먹거나 ,를 안 쓰거나 하는 사소한 실수로 데이터가 제대로 안 나옴..

좀 차분하게 할 필요가 있음! 그리고 나는 방정리도 드럽게 못하는데 코드 정리도 못한다...

예쁘게 정리해야 되는데 자꾸 까먹네.

 

그리고 자꾸 내가 문제 푼 거랑 튜터님이 한 거랑 명령어가 달라서 살짝 쪼그라들어있었는데....

할 수 있는 방법은 여러 가지이기 때문에 모로 가도 데이터만 나오면 된다고 하셔서 안심했음.

 

오늘 대충 내가 한 거랑 강사님이 한 거랑 달랐던 코드들 모음..

 

select name, count(e.is_registered) as cnt from enrolleds e
inner join users u on e.user_id = u.user_id
group by name
order by cnt desc

select name, e.is_registered from enrolleds e
inner join users u on e.user_id = u.user_id
where e.is_registered like 0

select u.name, count(*) from enrolleds e
inner join users u on e.user_id = u.user_id
where e.is_registered like 0
group by name
order by count(*) desc

자세하게는 기억 안 나는데 아마 실패하는 과정이었던 것 같음...


강사님 정답

select u.name, count(*) as cnt from enrolleds e
inner join users u on e.user_id = u.user_id
where e.is_registered = 0
group by u.name
order by count(*) desc






select title, count(c.title) as cnt from courses c
inner join enrolleds e on c.course_id = e.course_id
where e.is_registered = 0
group by c.title



강사님 정답

select c.course_id, c.title, count(*) as cnt_notstart from courses c
inner join enrolleds e on c.course_id = e.course_id
where e.is_registered = 0
group by c.course_id



select c.title, ci.week, count(*) from courses c
inner join checkins ci on c.course_id = ci.course_id
group by c.title, ci.week
order by c.title


강사님 정답

select c1.title, c2.week, count(*) from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
group by c1.title, c2.week
order by c1.title, c2.week

 

아예 틀린 문제 말고 얼추 답은 다 비슷하게 나왔으니까 그거면 됐따.

 

SQL 엑셀보다 쉬운 거 맞나 싶긴 하지만 엑셀도 짜증나는 놈이긴 하니까.... 1주차만 더 들으면 SQL은 완강!

이제부터 웹개발에 집중한다으아 ㅠㅠ 그만 조져지자.

반응형

댓글