본문 바로가기
Data

[Mysql] SQL 문법연습 풀이 및 해석

by Dora the explorer 2024. 9. 12.
반응형

 

🥑 학습내용

사용된 문법&함수 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)
  • 문제: 다음과 같은 결과테이블을 만들어봅시다.
    • 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)
  • 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에 연결해서 문제를 풀 수 있으니 더 직관적으로 문제를 해결할 수 있었다.

반응형