[25.02.24]본캠프 6일차 SQL라이브세션,

김명서·2025년 2월 24일
3

TIL_sparta

목록 보기
25/60

SQL라이브세션 요약

🔻강조해주신 내용

⭐1

select 기준컬럼, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)   
from 테이블명
where 조건 #(생략가능)
group by 기준컬럼
;

기준컬럼? 집계함수?

  • 성별 기준 평균 나이= 성별(기준) + 평균 나이(집계함수)
  • 성별 기준 나이 합계 = 성별(기준)+ 나이 합계(집계함수)
    : 성별이라는 기준 컬럼을 두고, 평균 나이&나이 합계를 살펴볼 수 있음

⭐2

where과 having의 차이를 , '집계함수+작동 순서'정도로만 차이가 있다고 이해하고있었는데,

필터링 구문필터링 시점
WHEREGROUP BY 전 개별 데이터 필터링
HAVINGGROUP BY 후 그룹화된 결과 기준 필터링

필터링 시점 원리로 다시한 번 짚어볼 수 있었다.

⭐3

서브쿼리 where 절에서 사용하는 쿼리
=> 🔴중첩(일반) 서브쿼리

ex. 문동은의 나이보다 나이가 많은 모든 데이터 반환하기
where 나이 > (select 나이 from basic.theglory where 이름='문동은')


select 절에서 하나의 컬럼처럼 사용하는(다른 테이블ok)
=> 🔴스칼라 서브쿼리
예시 코드

# theglory 의 이름과 theglory2 테이블의 이름이 일치하는 경우를 count 하여 
# same_name_cnt 컬럼으로 반환
# theglory 의 이름과 theglory 테이블의 이름이 일치하는 경우의 결제금액을 sum 하여 
# same_name_sumamount 컬럼으로 반환

select 이름
, 나이
, (select count(*) from theglory2 where theglory2.이름=theglory.이름) as same_name_cnt
, (select sum(결제금액) from theglory2 where theglory2.이름=theglory.이름)as same_name_sumamount
from basic.theglory
;

from절에서 하나의 테이블처럼 사용하고 가장 많이 사용됨.
=> 🔴인라인뷰

  • as 구문 사용해서 명칭을 반드시 작성해주어야함.
  • 오늘은 이정도로 작성하고, 내일 복습하면서 빈곳 생기면 더 메꿔봐야겠다.


코드카타

  • sql

    🔴51.

animal_outs에는 있는데, animal_ins에 없는 데이터를 가져와야함.
겪었던 오류
문법적 오류는 없어서 테이블 생성은 되는데 값 나열이 안됨.
해결방법: left join 으로 묶었줄 때 기준이 되는 컬럼을 주의해야한다.
문제를 고려하면⁉
입양간 기록은 있는데 입소한 기록은 없어야한다.
where문에서 null값을 조건으로 걸 것이라면,

SELECT o.animal_id, o.name
from animal_outs o
left join animal_ins i
on i.animal_id=o.animal_id
where i.datetime is null
order by o.animal_id

이렇게 작성해주는 것이 맞다. (animal_outs을 기준 칼럼으로,animal_outs을 join으로 묶어주기 )

어려운 점 없었다.

select s.user_id, s.product_id
from (SELECT count(user_id), product_id, user_id
from ONLINE_SALE
group by product_id, user_id
having count(user_id) >=2
 ) s
order by s.user_id,s.product_id desc

쉽게 품

SELECT user_id, nickname
, concat(city, STREET_ADDRESS1, STREET_ADDRESS2) '전체주소'
, concat(substr(tlno,1,3),'-',substr(tlno,4,4),'-',substr(tlno,8,4)) '전화번호'
from (
select *, count(writer_id) uc
from USED_GOODS_BOARD b
join USED_GOODS_USER u
on b.writer_id=u.user_id
group by writer_id
    ) s
where s.uc >= 3
order by user_id desc

??? 😮💫😳💫🤔💫🙄💫😩

SELECT u.user_id, u.nickname
, concat(u.city,' ', u.STREET_ADDRESS1, u.STREET_ADDRESS2) '전체주소'
, concat(substr(u.tlno,1,3),'-',substr(u.tlno,4,4),'-',substr(u.tlno,8)) '전화번호'
from USED_GOODS_USER u
join(    
select count(*) as uc
    , writer_id
from USED_GOODS_BOARD
group by writer_id
    ) s
on s.writer_id=u.user_id
where s.uc >= 3
order by u.user_id desc

결과는 나오느데....왜 자꾸 정답이 아니여...
정답이랑 비교해봐도 ..뭐가 잘못된건지 모르겠어서 일단 keep 하고 넘어가야겠다.
.
.
.


python

  1. 정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.
def solution(num):
    return 'Even' if num%2==0 else 'Odd'

예전에 썻던 if문을 응용했다.

  1. 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
def solution(arr):
    answer = sum(arr)/len(arr)
    return answer

이것두 10번에서 했던 기억이 있어서 쉽게 해결했다.

  1. 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
def solution(n):
    answer = sum(int(i) for i in str(n))
    return answer

int() 인자를 정수로 변환
float() 인자를 실수로 변환
str() 인자를 문자열로 변환
chr() 인자를 (유니코드) 문자로 변환

📌

문자열 변환:
str(n)을 사용하여 숫자 n을 문자열로 변환합니다. 예를 들어, n이 123이면 "123"이라는 문자열이 됩니다. ✅

자리수 추출 및 정수 변환:
문자열 "123"의 각 문자 ('1', '2', '3')에 대해 generator expression int(i) for i in str(n)이 실행됩니다. 이 표현식은 각 문자를 정수로 변환하여 1, 2, 3이라는 정수들을 차례로 만듭니다.✅

⭐알게된 것=> 문자열 123이 1, 2, 3 으로 문자 하나하나씩 쪼개지는구나 ~!

자리수 합산:
sum() 함수는 generator expression을 통해 생성된 정수들을 모두 더합니다. 즉, 1 + 2 + 3 = 6이 됩니다.✅

결과 반환:
계산된 합을 변수 answer에 저장한 후, 이를 반환합니다.

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

def solution(n):
    
    total=0
    for i in range(1, n + 1):
        if (n % i == 0):
            total+=i
    
    return total

약수를 어떻게 표현하는지만 구글링해서 참고했다 !!
= n % i == 0

.
.
.


세션 숙제

  1. 문제1 - 집계함수의 활용
    조건1) 서버별, 월별 게임계정id 수를 중복값 없이 추출해주세요. 월은 첫 접속일자를 기준으로 계산해주세요. 월은 yyyy-mm의 형태로 추출해주세요.
select serverno '서버'
		,date_format(first_login_date,'%Y-%m') '월'
		, count(distinct(game_account_id))
from basic.users u 
group by serverno, date_format(first_login_date,'%Y-%m')

이건 내가 서버랑 월별로 잘 나왔는지, 보려고 썼던거구 제출은 아래 코드로 해야겠다.

select count(distinct(game_account_id)) as '게임계정 id 수'
from basic.users u 
group by serverno, date_format(first_login_date,'%Y-%m')

.
.

  1. 문제2 - 집계함수와 조건절의 활용
    조건1) group by 를 활용하여 first_login_date별 게임캐릭터수를 중복값 없이 구하고,
    조건2) having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임캐릭터id 개수를 추출해주세요.
select count(distinct(game_actor_id)) '캐릭터 수'
,first_login_date
from basic.users u 
group by first_login_date
having count(distinct(game_actor_id)) >10

.
.

  1. 문제3 - 집계함수와 조건절의 활용2
    조건1) group by 절을 사용하여 서버별, 유저구분(기존/신규) 게임캐릭터id수를 구해주세요. 중복값을 허용하지 않는 고유한 갯수로 추출해주세요.
    조건2) 기존/신규 기준→ 첫 접속일자가 2024-01-01 보다 작으면(미만) 기존유저, 그렇지 않은 경우 신규유저
    조건3) 또한, 서버별 평균레벨을 함께 추출해주세요.
select  serverno
,(select case when first_login_date > '2024-01-01' then '신규유저'
	else '기존유저' end '유저구분') user
,count(distinct(game_actor_id)) '캐릭터 수'
,avg(level) '평균레벨'
from basic.users
group by serverno, user 
order by  serverno 


문제에서 이걸 요구하는게 맞나..? 조건이 여러개로 나누어져있는데, 왜 더 헷갈리는 것 같지,,?🤔

스칼라 서브쿼리를 써봤다.
.
.

  1. _ 2번을 인라인 서브쿼리를 사용해서 풀기
select s.cnt, first_login_date
from(
select count(distinct(game_actor_id)) cnt,
first_login_date
from basic.users u 
group by first_login_date
) s
where s.cnt > 10
and first_login_date = s.first_login_date

.
.

  1. 조건1) 레벨이 30 이상인 캐릭터를 기준으로, 게임계정 별 캐릭터 수를 중복값 없이 추출해주세요.
    조건2) having 구문을 사용하여 캐릭터 수가 2 이상인 게임계정만 추출해주세요.
    조건3) 인라인 뷰 서브쿼리를 활용하여 캐릭터 수 별 게임계정 개수를 중복값 없이 추출해주세요.
select s.cnt_cha as '캐릭터 수'
,count(distinct(s.game_account_id)) as '게임계정 개수'
from(
select count(distinct(u.game_actor_id)) cnt_cha
,game_account_id
from basic.users u
where u.level >='30'
group by u.game_account_id
having count(distinct(u.game_actor_id)) >= 2
) s
group by s.cnt_cha

우당탕.,고쳐 나가면서 풀었는데,, 맞는지는 모르겠다...~~ (답을 맞춰볼 사람이 피료해..)~~



느낀점 & 내일계획

이번주는 발표 준비에 많이 시간을 써야할 것 같다.
시간을 많이 쓴 만큼 결과가 나올 것 같은 느낌..? 팀원마다 진도가 다 달라서, 조율을 잘 해봐야할 것같다. 한명에게 너무 몰빵되지 않게..!
SQL이랑 PYTHON은 부딪혀본 만큼 느는 느낌이라 (저번주 거의 교통사고였음)
앞으로도 (하기싫어도)꾸역꾸역 해내야겠다.

별로 월요일이 힘들지 않게 느껴져서 다행이다. 내일도 홧팅홧팅💥

📌내일 (2/25 TUE) 계획
09:00~ 알고리즘 코드카타
10:10~ 아티클스터디
11:30~ 개인스터디
13:00~ 오후스터디(기초분석과제)
19:00~ 개인스터디 마무리
20:00~ 데일리스크럼&TIL 작성

profile
경영학도의 데이터분석 성장기💥

0개의 댓글

관련 채용 정보