etc_str2 = '레벨업 패키지' or '시즌패스'
로 적으면 안 되는 이유select
game_actor_id
, level
, case
when level <=10 then '1~10Lv 이하'
when level <=20 then '11~20Lv 이하'
when level <=30 then '21~30Lv 이하'
when level <=40 then '31~40Lv 이하'
when level <=50 then '41~50Lv 이하'
when level <=60 then '51~60Lv 이하'
when level <=70 then '61~70Lv 이하'
when level <=80 then '71~80Lv 이하'
when level <=90 then '81~90Lv 이하'
else '91~100Lv'
end as levelgroup
, first_login_date
from
basic.users
order by
first_login_date desc
;
집계함수 | 기능 |
---|---|
COUNT | 테이블의 행 수 반환 |
SUM | 테이블의 열 합계 반환 |
AVG | 테이블의 열 평균 반환 |
MIN | 테이블의 열 최소값 반환 |
MAX | 테이블의 열 최대값 반환 |
select
count(*)as cnt
, avg(나이)as avg_age
, max(나이)as max_age
, min(나이)as min_age
, sum(나이)as sum_age
from
basic.theglory
;
※ 주의할 점
1, 2번 작성 후, 3번을 작성하지 않을 경우 에러가 발생됩니다.
그 이유는, 데이터를 SELECT할 때, 2번 집계함수는 여러 데이터로부터 하나의 행을 반환하지만, 1번 기준컬럼은 N개의 값을 반환하기 때문에, 3번 GROUP BY 절을 사용하여 기준컬럼 당 값 1개를 반환 할 수 있도록 명시해야 합니다.
✨여기서 잠깐! SQL 의 작동순서를 기억하고 계신다면, 이해에 도움이 될 거예요!
작동순서: FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
# 집계함수와 GROUP BY 절을 함께 사용하는 SQL문
select
기준컬럼 -- 결과값 여러 개
, 집계함수(조건컬럼을 기준으로 여러 개의 집계함수 동시 사용 가능) -- 결과값 1개
from
테이블명
where
조건 #(생략가능)
group by
기준컬럼 -- 기준컬럼을 그룹별로 묶어 한 개씩 가지고 오게 만듦
;
# 주의)기준컬럼과 집계함수를 작성하고 GROUP BY 절을 사용하지 않을 때 에러가 발생하는 예
select
기준컬럼 -- 결과값 여러 개
, 집계함수(조건컬럼을 기준으로 여러 개의 집계함수 동시사용 가능) -- 결과값 1개
from
테이블명
where
조건 #(생략가능)
;
/*출력되는 결과값 개수가 일치하지 않으므로 에러 발생*/
# 집계함수와 GROUP BY 절을 함께 사용하는 SQL문 - 실습
select
성별 # 기준 컬럼 🚩
, count(*)as cnt #집계함수 ✅
, avg(나이)as avg_age #집계함수 ✅
, max(나이)as max_age #집계함수 ✅
, min(나이)as min_age #집계함수 ✅
, sum(나이)as sum_age #집계함수 ✅
from
basic.theglory
group by
성별 # 기준 컬럼 🚩
;
# 집계함수, GROUP BY절, HAVING을 함께 사용하는 SQL문
select
기준컬럼
, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)
from
테이블명
where
조건 #(생략가능)
group by
기준컬럼
having
조건식
;
1 → 전체 데이터에 대한 필터링: WHERE 절을 사용
2 → 집계함수와 GROUP BY 를 사용해서 작성
3 → GROUP BY 된 결과값을 필터링 해야 하므로, HAVING 절을 사용
# 집계함수, GROUP BY절, HAVING을 함께 사용하는 SQL문 - 실습
select
성별
, avg(나이)as avg_age 2️⃣
from
basic.theglory
where
나이>=311️⃣
group by
성별 2️⃣
having
AVG_AGE>41 3️⃣
;
: 빅데이터를 다루다 보면 많은 컬럼이 들었이는 데이터 셋을 보게되는 경우가 있습니다. 컬럼들을 활용한 많은 연산(사칙, 집계, 윈도우 함수, 포맷팅)을 하는 경우, SUB QUERY 는 이를 순차적(구조적)으로 기록하는 역할을 수행합니다.
복잡한 연산을 단계적으로 진행하게 되는 것이죠!
# 중첩 서브쿼리 실습
# 문동은의 나이보다 나이가 많은 모든 데이터 반환하기
select
*
from
basic.theglory
where
나이 > (select 나이 from basic.theglory where 이름='문동은')
;
# 스칼라 서브쿼리 실습
# 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
;
# 인라인 뷰 서브쿼리 실습
# 나이가 33세 이상인 모든 데이터 중 나이와 직업 컬럼 반환하기
select
x.나이
, x.직업
from (
select
*
from
basic.theglory
where
나이>=33
) as x
;
-- 위와 동일한 의미
SELECT
x.나이
, x.직업
FROM
x
;
조건1) 서버별, 월별 게임계정id 수를 중복값 없이 추출해주세요. 월은 첫 접속일자를 기준으로 계산해주세요. 월은 yyyy-mm의 형태로 추출해주세요.
힌트: 월을 추출하는 방법→날짜는 string(문자열) 형식으로 저장되어 있으므로, 문자열을 자르는 함수를 사용해주시면 좋겠죠? 😃
조건1) group by 를 활용하여 첫 접속일자별 게임캐릭터수를 중복값 없이 구하고,
조건2) having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임캐릭터id 개수를 추출해주세요.
조건1) group by 절을 사용하여 서버별, 유저구분(기존/신규) 게임캐릭터id수를 구해주세요. 중복값을 허용하지 않는 고유한 갯수로 추출해주세요.
조건2) 기존/신규 기준→ 첫 접속일자가 2024-01-01 보다 작으면(미만) 기존유저, 그렇지 않은 경우 신규유저
조건3) 또한, 서버별 평균레벨을 함께 추출해주세요.
조건1) 문제2번을 having 이 아닌 인라인 뷰 서브쿼리를 사용하여 추출해주세요.
힌트: 인라인 뷰 서브쿼리는 from 절 뒤에 위치하여, 마치 하나의 테이블 같은 역할을 했었습니다!
조건1) 레벨이 30 이상인 캐릭터를 기준으로, 게임계정 별 캐릭터 수를 중복값 없이 추출해주세요.
조건2) having 구문을 사용하여 캐릭터 수가 2 이상인 게임계정만 추출해주세요.
조건3) 인라인 뷰 서브쿼리를 활용하여 캐릭터 수 별 게임계정 개수를 중복값 없이 추출해주세요.