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 쿼리문을 많이 작성하게 될 것 같다.
'온보딩 주차' 카테고리의 다른 글
250227_Data_6기 TIL 9일차 (0) | 2025.02.27 |
---|---|
250225_Data_6기 TIL 8일차 - 예제로 익히는 SQL - 4회차 복습 (0) | 2025.02.26 |
250224_Data_6기 TIL 6일차 - 2, 라이브 세션 복습 (0) | 2025.02.24 |
250224_Data_6기 TIL 6일차, 엑셀보다 쉽고 빠른 SQL 5주차 (0) | 2025.02.24 |
250221_Data_6기 TIL 5일차-주간 복습, [예제로 익히는 SQL] - 2회차 복습 (0) | 2025.02.21 |