내일배움캠프/사전캠프 퀘스트

[내일배움캠프]_달리기반 1-3

cork-7 2024. 12. 4. 23:00

<김씨 성을가진 학생수 구하기]

users 테이블

 

SELECT COUNT(SUBSTR(name,1,1)) as name_cut
FROM users u
where name like '김%'
- name컬럼에서 성 부분만 조회/카운트 ,  where 김으로 조건 부여(왜인지 '김'으로 하면 안나오드라)

SELECT SUM(name like '김%') as name_cut
FROM users u 
- sunstr사용안하고 like 사용해서 김**의 수만 합침

SELECT count(distinct(user_id)) as name_cnt
FROM 
    users
where substr(name,1,1) = '김'
- user_id카운트/ name앞글자만 조회하고 거기서 김인 id인 조건부여



결론: 상관은 없다

다만 3번째 거는 고유 id의 수를 셈
1,2번은 김으로 시작하는 이름의 총 갯수, 3번은 고유 id를 세는것

-------------------------------------------------------------------------------------------------------------------------------------------------

SELECT SUBSTR(created_at,1,10) as created_at,
       ROUND(AVG(point)) 
FROM point_users 
group by 1
- 이건 날짜가 문자열

 

SELECT 
    DATE(p.created_at) AS created_at,
    ROUND(AVG(p.point)) AS average_points
FROM 
    point_users p
GROUP BY 
    DATE(p.created_at);

- 표시상 created_at는 날짜형인데 이걸 date를 사용하면 날짜형 그래도 시간을 빼고 추출할수 있음
- substr은 데이터형으로 뽑기에 이 상황에서 부적합
- round 함수는 반올림할때 사용함

문제 및 답

----------------------------------------------------------------------------------------------------------------------------------------------------

- 포인트를 획득한 학생한테 메일을 보내려 한다.
- users테이블에는 존재하나, point_users테이블에 존재하지 않는 학생을 제외
- 이 학생들은 point를 0으로 표시하여 처리

해결과정
1) users테이블과 point_users 테이블을 left join으로 연결
2) null로 표시된 학생의 포인트를 0으로 변경
3) 표시할 컬럼은 users_id(두 테이블의 공통 컬럼), email, point

SELECT u.user_id,
       u.email,
       COALESCE(pu.point,0) as point
FROM users u left join point_users pu on u.user_id = pu.user_id 
order by pu.point desc

- COALESCE함수는 NULL을 다른 값으로 변환해 출력
- 기본구조는 COALESCE(컬럼명, '값') 값에 문자는' ' , 숫자는 그냥 입력 숫자를 ' '으로 입력하면 문자로 출력됨