반응형
🥑 학습내용
사용된 문법&함수 | COUNT DISTINCT SUBSTR DATE ROUND AVG COALESCE JOIN ORDER BY |
Lv1. 데이터 속 김서방 찾기
- 상황: 여러분들은 스파르타코딩클럽의 분석가로 취직했습니다. DBeaver를 테스트 해볼 겸 “김”씨로 시작하는 이용자들 수를 세어 보기로 했습니다.
- 데이터 설명
-
- user_id: 익명화된 유저들의 아이디(varchar255)
- created_at: 아이디 생성 날짜(timestamp)
- updated_at: 정보 업데이트 날짜(timestamp)
- name: 익명화된 유저들의 이름(varchar255)
- email: 이메일(varchar255)user 테이블은 스파르타 코딩클럽에 가입한 유저들의 정보를 날짜별로 기록한 테이블입니다.
-
- 문제: 다음과 같은 결과테이블을 만들어봅시다.
- name_cnt: “김”씨 성을 가지고 있는 교육생의 수
내가 제출한 답
select count(1) name_cnt
from users
where name like '김%'
정답
SELECT count(distinct(user_id)) as name_cnt
FROM users
where substr(name,1,1) = '김'
💡 해석&회고
문자를 추출하거나 자를 때 사용하는 SUBSTR 함수 사용
SUBSTR(컬럼,시작지점,글자수) 로 '김'으로 시작하는 이름 찾기
COUNT로 갯수 세기, DISTINCT로 중복값 제거
내가 제출한 답과 정답은 같은 결과값이 나오지만, 위 데이터베이스가 아닌 다른 데이터 베이스에서 비슷한 문제를 해결해야 한다면
정답의 방법으로 접근하는 것이 더욱 오차를 줄일 수 있다.
Lv2. 날짜별 획득포인트 조회하기
- 상황: 이번에는 이용자들이 잘 활동하고 있는지 보고자 합니다. 포인트가 많을수록 활동을 잘하고 있다고 생각 할 수 있습니다. 날짜별로 획득한 포인트가 점점 늘어나는지 줄어드는지 확인해 봅시다.
- 데이터 설명
- point_users 테이블은 스파르타코딩클럽 가입 유저들의 포인트에 대한 정보를 기록한 테이블입니다.
- point_user_id: user_point 행을 구별하기 위한 key(varchar255)
- created_at: 아이디 생성 날짜(timestamp)
- updated_at: 정보 업데이트 날짜(timestamp)
- user_id: 익명화된 유저들의 아이디(varchar255)
- point: 보유하고 있는 포인트(int)
- point_users 테이블은 스파르타코딩클럽 가입 유저들의 포인트에 대한 정보를 기록한 테이블입니다.
- 문제: 다음과 같은 결과테이블을 만들어봅시다.
- created_at: 익명화된 유저들의 아이디(varchar255)
- average_points: 유저가 획득한 날짜별 평균 포인트(int), 반올림 필수
내가 제출한 답&정답
select date(created_at) created_at,
round(avg(point)) average_points
from point_users
group by date(created_at)
💡 해석&회고
DATE 함수를 사용해 created_at 컬럼에서 YYYY-MM-DD 형식의 날짜만을 추출한다.
AVG 함수로 평균값을 구한 뒤 ROUND 함수로 반올림 해준다.
ROUND 함수의 경우 뒤에 컬럼을 넣을 수도 있고,
ROUND(number : 반올림할 값, decimals : 반올림할 소숫점 자리값 미입력시 정수로 반환)로 사용할 수도 있다.
SELECT ROUND(345.156, 0); 결과 345
SELECT ROUND(345.156, 2); 결과 345.16
Lv3. 이용자의 포인트 조회하기
- 상황: 이번에는 이용자들 별로 획득한 포인트를 학생들에게 이메일로 보내려고 합니다. 이를 위한 자료를 가공해봅시다. 특히 users 테이블에는 있으나 point_users 에는 없는 유저가 있어요. 이 유저들의 경우 point를 0으로 처리합시다.
- 데이터 설명
- users 테이블은 스파르타 코딩클럽에 가입한 유저들의 정보를 날짜별로 기록한 테이블입니다.
- user_id: 익명화된 유저들의 아이디(varchar255)
- created_at: 아이디 생성 날짜(timestamp)
- updated_at: 정보 업데이트 날짜(timestamp)
- name: 익명화된 유저들의 이름(varchar255)
- email: 이메일(varchar255)
- users 테이블은 스파르타 코딩클럽에 가입한 유저들의 정보를 날짜별로 기록한 테이블입니다.
- point_users 테이블은 스파르타코딩클럽 가입 유저들의 포인트에 대한 정보를 기록한 테이블입니다.
- point_user_id: point_users 테이블의 행을 구별하기 위한 key(varchar255)
- created_at: 아이디 생성 날짜(timestamp)
- updated_at: 정보 업데이트 날짜(timestamp)
- user_id: 익명화된 유저들의 아이디(varchar255)
- point: 보유하고 있는 포인트(int)
- 문제: 다음과 같은 결과 테이블을 만들어봅시다.
- user_id: 익명화된 유저들의 아이디
- email: 유저들의 이메일
- point: 유저가 획득한 포인트
- users 테이블에는 있지만 point_users에는 없는 user는 포인트가 없으므로 0 으로 처리
- 포인트 기준으로 내림차순 정렬
내가 제출한 답&정답
SELECT u.user_id, u.email,
coalesce(pu.point,0) point
FROM users u left join point_users pu on u.user_id = pu.user_id
order by point desc
💡 해석&회고
COALESCE 함수 또는 IFNULL 함수를 사용하여 NULL을 0으로 반환한다.
ORDER BY DESC로 내림차순으로 정렬해준다.
🥑 회고
lv.3까지는 비교적 간단하고 쉬운 문제로 엑셀보다 쉽고 빠른 SQL 강의를 복습하는 개념으로 풀었다. 직접 데이터베이스를 DBeaver에 연결해서 문제를 풀 수 있으니 더 직관적으로 문제를 해결할 수 있었다.
반응형
'Data' 카테고리의 다른 글
[Mysql] SQL 문법연습 / HAVING절 (2) | 2024.09.16 |
---|---|
[아티클스터디] 데이터 리터리시& 잘못된 데이터 해석 (4) | 2024.09.12 |
[아티클스터디] 데이터 분석가는 어떤 일을 하는가? 요약 정리 (3) | 2024.09.06 |
[Mysql] SQL 문법연습 사용된 명령어/문법/함수 총정리 (1) | 2024.09.06 |
[Mysql] SQL 왕초보 문법연습 +업데이트 (5) | 2024.09.05 |