🔻강조해주신 내용
⭐1
select 기준컬럼, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)
from 테이블명
where 조건 #(생략가능)
group by 기준컬럼
;
기준컬럼? 집계함수?
⭐2
where과 having의 차이를 , '집계함수+작동 순서'정도로만 차이가 있다고 이해하고있었는데,
필터링 구문 | 필터링 시점 |
---|---|
WHERE | GROUP BY 전 개별 데이터 필터링 |
HAVING | GROUP 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
절에서 하나의 테이블처럼 사용하고 가장 많이 사용됨.
=> 🔴인라인뷰
🔴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 하고 넘어가야겠다.
.
.
.
- 정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.
def solution(num):
return 'Even' if num%2==0 else 'Odd'
예전에 썻던 if문
을 응용했다.
- 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
def solution(arr):
answer = sum(arr)/len(arr)
return answer
이것두 10번에서 했던 기억이 있어서 쉽게 해결했다.
- 자연수 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이라는 정수들을 차례로 만듭니다.✅
자리수 합산:
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) 서버별, 월별 게임계정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')
.
.
- 문제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
.
.
- 문제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
문제에서 이걸 요구하는게 맞나..? 조건이 여러개로 나누어져있는데, 왜 더 헷갈리는 것 같지,,?🤔
스칼라 서브쿼리를 써봤다.
.
.
- _ 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) 레벨이 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 작성