온보딩 주차

250225_Data_6기 TIL 7일차 - 과제 문제 풀이 및 아티클 스터디

juneoh20 2025. 2. 25. 19:50

250225_Data_6기 TIL 7일차

어느덧 7일차 기초분석 팀과제도 있고 여러모로 정신 없지만 쭉쭉 달려나가자~

 

오늘은 라이브 세션 강의 과제 문제 1~3번을 풀고 분석하고 주석도 달아보면서 복습해보자

 

 

과제 문제 풀이

문제 1) 집계함수의 활용

 

조건1) 서버별, 월별 게임계정id 수를 중복값 없이 추출해주세요. 월은 첫 접속일자를 기준으로 계산해주세요. 월은 yyyy-mm의 형태로 추출해주세요. 

힌트: 월을 추출하는 방법→날짜는 string(문자열) 형식으로 저장되어 있으므로, 문자열을 자르는 함수를 사용해주시면 좋겠죠?

 

먼저 서버별, 월별 게임 계정id 수를 중복값 없이 추출해주세요

→ SELECT에서 서버를 조회해야하고, 월별로 조회해야하고,

게임계정 id 수를 중복 값 없이 추출해야 함을 알 수 있다.

월은 첫 접속일자를 기준으로 계산해주세요

→ first_login_date를 기준으로 월별로 조회한다, order by 절을 사용하여 월별 내림차순으로 조회

월은 yyyy-mm의 형태로 추출해주세요

→ 기준으로 1부터 7번째 문자열까지 잘라 yyyy-mm(총 7개의 문자열 구성) first_login_date를 월별로 추출한다.

 

- 문자열을 자르고 중복 값 없이 계정 수를 세어야 하기 때문에 사용할 집계함수의 형태는 substr(), count(distinct '') 임을 알 수 있다.

그럼 구문을 작성해보자.

SELECT u.serverno,
substr(u.first_login_date, 1, 7) AS month,
count(distinct u.game_account_id) AS game_account_id 
from users u
group by u.serverno , month
order by month desc, u.serverno;

 

 

문제 2) 집계함수와 조건절의 활용

 

조건1) group by 를 활용하여 first_login_date별 게임캐릭터수를 중복값 없이 구하고,
조건2) having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임캐릭터id 개수를 추출해주세요. 

조건 1)은 문제 1)의 "게임 계정id 수를 중복값 없이 추출" 과 동일하게 작성

조건 2) 부터는 개념적으로는 알고 있었지만 의식하지는 않았던 부분을 마주하면서 이번 기회에 확실히 알게 되었다.

SQL문의 작동순서는 FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY 이다.

개념적으로는 알고 있었는데 실 사용에선 의식하지 않았었는데 오늘 SELECT문에서 COUNT() 집계 함수를 사용하여 game_actor_id라고 별명을 붙인 game_actor_id를 HAVING 문을 쓰면서 그대로 사용하였는데 오류가 발생하여, 디버깅을 하던 중 작동순서를 의식하여 혹시 하는 마음으로 COUNT() 집계함수 구문을 붙여 넣었고 실행하였더니 실행 성공하였다! SQL 구문을 작성하면서 만났던 여러가지 오류 중에서 구글링 없이 스스로 문제점을 파악해 풀어낸 게 처음이라 굉장히 강렬한 경험으로 기억될 것 같다.

-- 작동순서: FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
SELECT first_login_date,
COUNT(distinct u.game_actor_id) AS game_actor_id
FROM users u
GROUP BY first_login_date
HAVING COUNT(distinct u.game_actor_id) > 10 
-- select가 마지막으로 작동하기 때문에 HAVING 절에도 집계함수 사용해야한다.
ORDER BY first_login_date;

 

문제 3) 집계함수와 조건절의 활용2

조건1) group by 절을 사용하여 서버별, 유저구분(기존/신규) 게임캐릭터id수를 구해주세요. 중복값을 허용하지 않는 고유한 갯수로 추출해주세요.
조건2) 기존/신규 기준→ 첫 접속일자가 2024-01-01 보다 작으면(미만) 기존유저, 그렇지 않은 경우 신규유저
조건3) 또한, 서버별 평균레벨을 함께 추출해주세요.

→ case when과 COUNT(distinct) avg() 집계함수를 select에서 사용해야 한다.

→ 서버넘버, 기존/신규를 기준으로 그룹바이와 오더바이를 사용해야 한다.

SELECT serverno,
CASE WHEN first_login_date < '2024-01-01' THEN "기존 유저"
ELSE "신규 유저" 
END AS `유저 유형`,
COUNT(distinct game_actor_id) AS `고유캐릭터id수`,
avg(u.level) AS `평균 레벨` 
FROM users u
GROUP BY serverno, `유저 유형`
ORDER BY serverno, `유저 유형`;

 

 

 


 

 

아티클 스터디 - 12조 아티클 스터디 ③ : SQL 가독성을 높이는 다섯 가지 사소한 습관

 

이번 주차 첫 아티클 스터디를 진행하였다. 이번 주제는 SQL 가독성을 높이는 다섯 가지 사소한 습관.

 

나는 대략적으로 이런 방향으로 정리하였다.

 

1. 예약어는 대문자로
    - select, from, group by, having, as, and 와 같은 SQL 예약어를 대문자로 쓰는 습관이다.
    - 사용 이유 : 대문잘로 써주는 습관을 들이면 쉽게 자신이 쓴 코드를 구분할 수 있기 때문에.

 

2. 행갈이를 자주 하자.
    - 사용 이유 : 한 행에 모든 코드를 쓰게 되면 쓸 땐 편하지만, 나중에 그 의미를 파악하기 위해 모든 코드를 읽어 봐야 하기 때문이다.
    - 행을 잘 구분해두면 예약어만 확인하더라도 작성자의 의도와 코드 구조를 쉽게 파악 가능하다.

 

3. 행갈이를 더 자주 하자.
    - 다음 예약어가 나올 때만 행갈이를 하는 것이 아닌 한 명령어 마다 행갈이를 해두면 로직에 제외시키기 위해 주석처리를 할 때 등 유용하게 사용이 가능하다.
    - SQL을 잘하는 분들을 보면 WHERE 절이 시작하자마자 1=1 이라는 아무 의미없는 조건을 넣어 행갈이를 한 다음 AND로 진짜 필터링 조건을 쓰기도 한다. 재밌는 응용

 

4. 주석을 쓰자.
    - 코드를 쓴 의도를 짧게 적어 놓는 습관을 들이는 게 좋다.
    - 코드가 길어질 수록 각 코드 단락이 어떤 의도로 작성 되었는지 적어놓아야 코드 이해가 빠르다.
    - 주로 설명을 다는 상황 : 서브쿼리 단위, CASE, IF 조건문 또는 WHERE절의 필터링 조건
    - 모든 조건에 주석을 적는 건 비효율적. 해석의 오해가 있을 수 있거나, 추가 설명이 필요한 경우에 작성하자
    - ex) 조건이 왜 필요한지(Why?), 어떻게 동작하는 지 (How) 같은 내용을 상세하게 적자!

 

5. Alias를 잘 쓰자
    - 별명을 잘 지어주는 것 또한 중요하다.

 

🚩 가장 중요한 건 합의된 규칙

같이 일하는 사람들과 합의된 규칙이 중요하다.

레거시 코드를 죄다 바꿀 수 없기 때문에 기존 제도를 따라야 하는 경우도 있다.

코드 작성 시 중요한 건 나 말고도 누군가가 볼 것이라고 생각하면서 작성하고 정리하는 것이다.

 

[인사이트]


 업무에서 협업은 빠질 수 없는 요소이다. 자신이 쓴 코드가 어떤 ‘의도’로 작성 되었는지를 잘 전하는 것이 가독성 높은 코드를 짜는 핵심이라고 생각한다.

 

[공통 인사이트]

SQL 코드는 협업을 위한 커뮤니케이션이기 때문에 다른 사람과 나 자신도 쉽게 이해할 수 있도록 가독성을 높여 작성하는 것이 중요하다.

 

[의미 있었던 의견]

 

오석준 : 지윤님의 “코드의 가독성을 높이는 이러한 습관들은 몇 초밖에 걸리지 않지만 그 몇 초를 투자하면 나중에 그 코드를 해석하기 위해서 불필요한 시간을 낭비하는 일을 줄일 수 있어 반드시 필요한 일이다.” 에 공감하였고 네이밍 컨벤션에 대해 알아봐야겠다고 생각하였다. 혜현님이 작성하신 내가 쓴 코드가 남에게 어떻게 보여지는 지 또한 중요하다는 인사이트가 제 생각과 비슷한 맥락으로 다가와서 인상적이였습니다.

 


이상으로 오늘 TIL 정리를 마치도록 하겠다. 내일은 팀 과제 발표 준비로 SQL 쿼리문을 많이 작성하게 될 것 같다.