본문 바로가기
개발일지

[내일배움단] SQL 데이터 분석 강의 4주차 (feat. 스파르타코딩클럽)

by 창조하는 인간 2022. 8. 21.

드디어 마지막 4주차가 된 SQL 강의

 

 

Subquery 

 

카카오페이 결제 유저만 모아보기 

기존 방법은 Inner join사용해서 테이블을 붙여 놓고 필드명에서 보고 싶은 항목을 where 지정해 select 해주었다. 

 

subquery로도 볼 수 있는 방법이 있다. 

 

쿼리문 안에 들어가는 모든 쿼리문을 서브쿼리문이라고 한다. 

Where, select, from 절에 들어가는 쿼리들이 있다. 

복잡하지만 엑셀보다 복잡한 처리를 해낼 수 있다. 

줄맞춤에 신경써야 헷갈리지 않는다. 

 

From 절에 들어가는 subquery (가장 많이 사용되는 유형)

 

유저별 평균 좋아요 수를 알고 싶은데, 포인트가 많은 순서(활동량이 많은)로 좋아요도 많이 받았을까? 

유저별 평균 좋아요 수와 포인트에 대한 상관관계를 알아보자. 

 

먼저 유저별 평균 좋아요 수를 구한다 (group by) 

그다음 point_users 테이블을 살펴본다. 

 

둘을 조인해서 봐도 되겠지만, 

편하게 볼수 있는 방법은 from 서브쿼리 하는 방법 

내가 지금 만든 select문을 마치 원래부터 있었던 테이블로 사용하는게 from절에서의 subquery

 

서브 쿼리 안에 서브 쿼리.

다양한 방식의 해법이 있다. 

하지만, 한눈에 알아보기 쉽고 간결하게 짜는게 쿼리의 핵심! 

 

checkins테이블에 course_id별 평균 likes수 필드 우측에 붙여보기

 

checkins 테이블에 과목명별 평균 likes수 필드 우측에 붙여보려면? 

위에 작성했던 쿼리는 그대로 두고 inner join 하면 된다. 

이때, c2에 모든 것이 잘 붙었는지를 확인하기 위해서 c2.*를 붙여 확인을 해본 뒤에

course_id 대신 title 넣어주면 된다. 

 

 

checkins  테이블에   과목명별   평균  likes 수   필드   우측에 붙여보기

 

강사님의 설명에 의하면 쿼리문은 한 번에 정답을 맞히는 게임이 아니라고 한다. 

이렇게 해보고, 저렇게 해보고 하다가 맞으면 해냈다는 느낌이 맞다.

시행착오를 겪어 나가면서 쿼리문을 완성해 나가면 된다. 

 

course_id 체크인 개수에 전체 인원 붙이기를 했는데,

강사님과 답이 살짝 다르다. 내가 더 헷갈리게 생각한 거 같다 ㅠ 

앞에서 차근차근 써온걸 from절에 넣어주고 알리아스 처리하고 , inner join 해서 넣어주고 알리아스 처리하면 되는데, 난 뭔가 좀 복잡스…?  

그래서 뒤로 갈수록 힘들었던 거구나…

답이 나올때까지 수정하느라 뭐가 뭔지 모르겠다..  

 

강의제목별로 체크인한 개수와 전체 개수를 세어 그 비율을 결괏값으로 내고 싶을 때는? 

서브 쿼리를 select와 innerjoin 안에 야무지게 넣고, 시작하지 않아서 0인 유저의 정보를 세지 않는 distinct를 써주는 것이 포인트다. 

헷갈리지 않게 테이블의 별칭을 야무지게 챙겨주고, 콤마나 줄 바꿈 같은 것도 빠뜨리지 않게 유의한다. 

 

이렇게 만들기 위해 머리를 싸매야 했다.

With 사용해서 쿼리문을 간결하게 만들기. 

서브 쿼리를 활용해서 이너조인을 여러번 한 복잡해 보이는 쿼리문

 

from에도 subquery 되어있고, inner join으로도 subquery 해서 상당히 복잡한 느낌의 쿼리문이 되었는데, 

최상단에 가상의 테이블을 만들어줌으로써 알리아스 시켜 간결한 쿼리문으로 구성해낼수 있다.

with 절을 활용한 쿼리문

 

with를 써서 테이블명을 지정해주고 원하는 쿼리문을 넣어준다. 

프롬 안에 있는 서브 쿼리는 특히 위드 절을 활용하면 훨씬 깔끔하게 사용할 수 있다. 

 

실전에서 유용한 SQL 문법 

첫 번째, 문자열

 

실전에서는 문자열 데이터가 원하는 대로 존재하지 않을 경우가 많기 때문에 원하는 형태로 한번 정리해야 하는 경우가 많다. 

그중에서 문자열 데이터를 쪼개는 방식도 사용이 되는데 그럴때 SUBSTRING_INDEX라는 문법을 사용하면 된다. 

형식을 잘 알고 있으면 count나 avg, sum 처럼 유용하다

두 번째, Case

 

포인트를 구간별로 표시해주고 싶을 때는?

Case when을 쓰면 되는데, 

10000 포인트가 넘어가는 유저에게는 잘하고 있어요 를 

넘지 않는 유저에게는 조금만 파이팅 이라는 문구를 달고 싶다고 하면,  하단의 사진처럼 쓰면 된다. 

 

case when 을 활용한 쿼리문

case 문법을 잘 활용하면 통계를 낼 수도 있고, 

복잡해진다면 with 절을 활용해서 더 간단하게 나타낼 수도 있는데... 

문제에 관해 고민해보고 가장 간결하게 쓰는 게 좋다. 

 

내가 알고 있는 선에서 가장 간결한 쿼리문으로 정확한 데이터 값을 도출하는 것을 목표로 공부해야겠다. 

배운 지식을 잘 응용해서 써먹을 수 있길 바라며 완강을 기념해야지.. ^___^ 

물론 복습 필수다 ㅠ 

 

댓글