'벌써'라는 말이
2월처럼 잘 어울리는 달은
아마 없을 것이다.
- 오세영, 「2월」 中 -
벌써 2월이다. 1월 20일부터 사전캠프에 합류했으니, 중간에 설 연휴가 길긴 했어도, 얼추 절반 정도는 된 셈이다. 2월을 어떻게 보낼지 가늠해보기 위해 1월 동안 데이터 분석 공부를 얼마나 했는지 점검했다.
아티클 스터디야 계획대로 하면 되고, 개인퀘스트랑 [엑셀보다 쉽고 빠른 SQL] 강의 수강도 그냥 하면 될 거 같은데,
아.. [SQLD 자격증 챌린지]와 [ADSP 자격증 챌린지] 강의 듣기를 더 이상 미룰 수 없다.
근데 SQLD랑 ADSP를 동시에 들어도 되는지 찾아봤는데 독학으로 2주 만에 SQLD 땄다는 사람도 있고, SQLD와 ADSP를 독학으로 딴 사람의 후기도 있는 걸 봐서는 '그렇게 어렵진 않은가?' 하는 생각이 들었다. 그리고 [SQLD 자격증 챌린지], [ADSP 자격증 챌린지] 모두 15강(=15주차)라서 하루에 한두 개씩 들으면 되지 않을까 싶었다.
오늘 한 일은,
- 다섯 번째 아티클 스터디 진행하기
- SQL 공부
- 온라인 강의 - [엑셀보다 쉽고 빠른 SQL] 5주차, [SQLD 자격증 챌린지] 1주차
- 개인 퀘스트(달리기반) - [SQL 실전!] Lv.1
아티클 스터디 ⑤: SQL의 가독성을 높이는 다섯 가지 사소한 습관
오늘 읽은 아티클:
SQL 가독성을 높이는 다섯 가지 사소한 습관 | 요즘IT
지독하게 읽기 힘든 SQL 문을 해석해 본 적 있으신가요? 마치 암호를 읽는 것처럼 어렵습니다. 파이선처럼 들여쓰기와 띄어쓰기를 문법적으로 강제하는 언어를 사용해 봤다면 SQL의 자유로움에
yozm.wishket.com
오늘 읽은 글은 가독성을 개선하는 습관들을 소개한 글이어선지 쉽게쉽게 읽었다.
아티클 읽으면서 강조하는 습관들이 모두 '지금'의 '나'에게서 벗어나 모두를 고려하는 방식으로 SQL을 작성하라는 의미였다고 느꼈다. 그 모두에는 같이 일하는 동료, 미래에 올지도 모를 후임자, 그리고 미래의 나까지도. 그래서 언급한 5가지 습관보다 중요한 것으로 기존에 조직 내 사용하는 컨벤션이 중요하다고 강조하는 것이다. 나라는 개인이 일하는 것이지만 동시에 나는 나라는 개인으로서만 조직 내 존재하는 것은 아니기에.
그리고 언급한 습관 5가지 중에 다른 건 나름 잘 지키면서 작성 중인데 4번에 '주석 작성하기'는 한 번도 신경 쓴 적이 없다. 아직 내가 그리 복잡한 쿼리를 작성하지 않으니까 쓸 일이 없기도 했겠지만 앞으로를 위해 주석 작성하는 습관도 신경 써야겠다고 새겼다.
SQL 공부 ①: [엑셀보다 쉽고 빠른 SQL] 5주차 수강하기
- 데이터에 입력된 값이 없을 때,
- ⑴ 없는 값은 제외시키기: 조건문 IF나 WHERE절을 이용해 NULL값을 이용한다.
- ⑵ 없는 값을 대체시키기: COALESCE(컬럼명, 대체값)
- 테이블에 상식적이지 않은 데이터가 포함됐을 때,
- CASE문을 사용하여 어떤 범위의 값을 일반적인 데이터로 대체하도록 조건을 지정한다.
- SQL로 피봇 테이블 구현하기
- (쿼리를 두 줄 이상 띄워서 작성하게 되면 둘을 별도의 쿼리로 인식함. 그래서 쿼리를 2개 이상 적어놓고 커서로 선택하여 실행할 수도 있음) (우와!)
- 우선 ① 데이터베이스를 먼저 만들어주고 >> ②그 데이터베이스로 피봇 테이블로 만들어준다
- ① 데이터베이스로 만들 때,
- 데이터베이스를 만들어놓고 그를 서브쿼리로 묶어준다.
- ② 그 데이터베이스로 피봇 테이블을 만들 때,
- SELECT문을 쓸 때 제목열로 들어갈 부분을 먼저 첫 번째로 입력한다.
- 그 다음은 ① IF문으로 조건을 주고 >> ② 함수 MAX() 그를 묶어 준다.
- WINDOW 함수: 단위별로 묶어서 연산해준다
- 기본 구조: WINDOW_FUNCTION(argument) OVER (PARTITION BY 그룹 기준 컬럼 ORDER BY 정렬 기준)
- RANK() OVER (PARTITION BY 그룹기준 컬럼 ORDER BY 정렬기준 컬럼)
- 윈도우 함수들은 함수+OVER가 한 쌍
- SUM(컬럼명) OVER (PARTITION BY 그룹기준 컬럼)
- SUM(컬럼명) OVER (PARTITION BY 그룹기준 컬럼 ORDER BY 정렬 기준) <= 누적합 구할 때
- 날짜 함수
- DATE(컬럼명) : 데이터 형식을 날짜 데이터로 변환
- DATE_FORMAT(날짜 데이터 컬럼, '') : 원하는 날짜 데이터만 추출할 수 있음
- '%Y' (연도 4자리) / '%y' (연도 2자리) / '%m' (월) / '%d' (일) / '%w' (요일)
- '%w' => 0=일요일, 1=월요일 …
5주차 숙제
Q. 음식 타입별, 연령별 주문건수 pivot view 만들기 (연령 조건: 10~59세 사이)
우선 데이터베이스를 만들어보자. 우선 필요한 데이터는 음식 타입, 고객 연령으로 2개의 테이블을 사용해야 한다.
SELECT fo.cuisine_type,
CASE WHEN age BETWEEN 10 AND 19 THEN 10
WHEN age BETWEEN 20 AND 29 THEN 20
WHEN age BETWEEN 30 AND 39 THEN 30
WHEN age BETWEEN 40 AND 49 THEN 40
WHEN age BETWEEN 50 AND 59 THEN 50 END age,
COUNT(1) order_cnt
FROM food_orders fo INNER JOIN customers c ON fo.customer_id=c.customer_id
WHERE c.age BETWEEN 10 AND 59
GROUP BY 1, 2
그래서 연령 데이터가 있는 것만 조작하겠끔 INNER JOIN을 사용하고, 연령을 CASE문을 사용해 구분 지어 묶어줬고, 마지막으로 GROUP BY로 음식 타입별, 연령별 주문건수를 세게끔 작성했다.
해당 쿼리를 서브쿼리로 묶고 다시 SELECT-FROM문을 적었다.
SELECT cuisine_type,
MAX(IF(age=10, order_cnt, 0)) "10대",
MAX(IF(age=20, order_cnt, 0)) "20대",
MAX(IF(age=30, order_cnt, 0)) "30대",
MAX(IF(age=40, order_cnt, 0)) "40대",
MAX(IF(age=50, order_cnt, 0)) "50대"
FROM
(
SELECT fo.cuisine_type,
CASE WHEN age BETWEEN 10 AND 19 THEN 10
WHEN age BETWEEN 20 AND 29 THEN 20
WHEN age BETWEEN 30 AND 39 THEN 30
WHEN age BETWEEN 40 AND 49 THEN 40
WHEN age BETWEEN 50 AND 59 THEN 50 END age,
COUNT(1) order_cnt
FROM food_orders fo INNER JOIN customers c ON fo.customer_id=c.customer_id
WHERE c.age BETWEEN 10 AND 59
GROUP BY 1, 2
) a
GROUP BY 1
제목열에 올 cuisine_type을 첫 번째로 적어주고, 그 다음부터는 IF문으로 조건을 주고 마지막에 MAX()로 묶어준다. 그리고 마지막에 GROUP BY로 cuisine_type으로 묶어서 계산하게끔 적어줬다. (근데 이거 숙제 채점해서 알려주시는건가)
SQL 공부 ②: 개인퀘스트(달리기반) - [SQL 실전!]
Lv1. 데이터 속 김서방 찾기
예시로 주어진 결과 테이블이 도출되는 쿼리는 작성하시오.
SELECT COUNT(1) name_cnt
FROM users
WHERE SUBSTR(name,1,1)='김'
이렇게 작성하니 바로 원하는 결과값이 떴다!
생각보다 금방 끝나서 하나 더 풀었다.
Lv2. 날짜별 획득포인트 조회하기
예시로 주어진 결과 테이블이 도출되는 쿼리는 작성하시오.
결과 테이블을 보면, created_at 데이터는 년-월-일만 추출하고 average_points는 날짜별 평균 획득 포인트를 반올림하여 나타내야 한다.
SELECT DATE_FORMAT(created_at,'%Y-%m-%d')
FROM point_users
여기까지 입력하고 중간 점검을 했더니 날짜 데이터가 사진에서처럼 날짜형이 아니라 문자열 데이터로 뽑혀서 DATE()로 한번 감싸주고 평균 포인트 구하는 쿼리를 마저 추가로 작성했다.
SELECT DATE(DATE_FORMAT(created_at, '%Y-%m-%d')) created_at,
ROUND(AVG(point)) average_points
FROM point_users
GROUP BY 1
이제 사진 속 결과 테이블과 같은 모습이 나왔다.
SQL 공부 ③: [SQLD 자격증 챌린지] 1주차 수강하기
사실 1주차는 공부할 내용은 없다. 다만 SQLD 자격증에 대해서 설명해주셔서 그 부분만 정리해봤다.
SQLD
- 응시료: 5만 원
- 필기 시험
- 100점 만점에 60점 이상이면 합격 (과락: 과목별 40% 미만일 경우)
- 총 2과목으로 구성
- 1과목(10문제):
데이터 모델링의 이해 (데이터를 데이터베이스에 넣는 효율적인 방법을 고민하는 파트) - 2과목(40문제):
SQL로 데이터를 저장하고 또 꺼내서 활용하는 방법을 묻는 파트
- 1과목(10문제):
- ORACLE( + SQL Server)을 기반으로 출제
- 길게 공부해서 치는 시험이 아님. 단기간에 바짝 공부해서 보는 시험.
- 비전공자에게 추천!
2월 3일, 오늘부터 접수 받는다. 그치만 응시료가 50,000원... 나중에 내일배움캠프 하면서 훈련장려금 들어오면 그때 접수해야겠다^^
아직 갈 길이 멀긴 해도 한 일주일 정도 공부해서 벌써 이 정도까지 왔다는 것도 신기하다. 생각보다 SQLD 공부하는 것도 어렵진 않을 것 같아서 내일, 아, 모레(^^)부터는 SQLD 강의를 듣는 데 박차를 가해야겠다! 내일은 저녁에 특강 들을 게 있다. 재밌겠다!!! 얼른 책 읽어야지~
'[내배캠] 데이터분석 6기 > 사전캠프 기록' 카테고리의 다른 글
[사전캠프 9일차] 아티클 스터디⑦, 파이썬 공부, SQLD 공부 (1) | 2025.02.05 |
---|---|
[사전캠프 8일차] 아티클 스터디⑥, SQLD 공부 (0) | 2025.02.04 |
[사전캠프 6일차] 아티클 스터디④, SQL 공부, 파이썬 공부 (1) | 2025.01.31 |
[사전캠프 5일차] 아티클 스터디③, 스타터노트 작성, SQL 복습, 파이썬 복습 (1) | 2025.01.25 |
[스타터 노트] 데이터 분석 트랙을 신청한 이유 (0) | 2025.01.24 |