전소현 튜터님과 함께하는 SQL실습!
1일차는 SQL과 필요한 프로그램을 설치하는 시간을 가졌다.
2일차는 SQL의 기본구조인 SELECT, FROM을 이용한 쿼리문을 작성하고 중복값을 제거하는 DISTINCT 함수, WHERE, CASE WHEN 조건문, ORDER BY를 이용한 결과값 정렬을 배웠다.
SQL 구조는 SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY의 형태로 쓰지만 컴퓨터가 이를 읽을 때는 FROM-ON-JOIN-WHERE-GROUP BY-HAVING-SELECT-DISTINCT-ORDER BY로 실행한다. 때문에 실제 코드를 읽을 때는 컴퓨터가 인식하는 순서대로 읽어나가야 한다.
SQL에서 사용하는 연산자는 다음과 같다.
미만, 초과 >,<
이하, 이상 >=, <=
같음 =
같지 않음 <> 또는 !=
문자열에 포함 LIKE
조건을 모두 만족 AND
조건 중 하나를 만족 OR
아님 NOT 또는 !
사이에 포함 BETWEEN
포함 IN
포함되지 않음 NOT IN
비어 있음 IS NULL
비어 있지 않음 IS NOT NULL
연산의 우선 순위를 주기 위해 괄호를 작성하여야 한다.
WHERE 날짜 IS NOT NULL
AND (성별!='M')
AND (직업 IN('아나운서','승무원','화가'))
AND (나이 BETWEEN 30 AND 40) -- 30 이상, 40 이하
SQL에서는 문자열 나타낼 때 작은따옴표 큰따옴표 구분 없이 사용해도 돼서 실습하는 동안 작은따옴표로 통일해서 사용하기로 했다.
추가로 키보드 ~밑에 있는 ``백틱을 사용할 수 있는데, 예약어를 문자열로 사용하고 싶을 때 (예, 컬럼 이름을 SELECT로 사용하고 싶을 때)사용한다.
IF보다는 CASE WHEN으로 다 조건을 걸 수 있는 경우가 많아서 CASE WHEN을 사용하는 것을 권장하셨다.
CAST TYPE은 다음과 같이 있었다.
BINARY 값을 이진법으로 변환
CHAR 값을 문자열로 변환
DATE 값을 YYYY-MM-DD의 DATE로 변환
DATETIEM 값을 YYYY-MM-DD HH:MM:SS의 DATETIME으로 변환
TIME 값을 HH:MM:SS의 TIME으로 변환
DECIMAL 값을 최대자리수(M), 소수점 이하 자리수(D)로 지정하여 변환
NCHAR 값을 부호 있는 64비트 정수로 변환
UNSIGNED 값을 부호 없는 64비트 정수로 변환
SQL실습 2회차 2번 문제를 풀면서 생긴 어려움이 있었다.

select first_login_date,
ip_addr,
exp,
zone_id
from basic.users
where level>10
and serverno!=1
and etc_str2 in ('레벨업 패키지' or '시즌패스')
and etc_str1='상점에서 구매'
order by first_login_date desc
;
잘 출력되긴 하는데 튜터님이 캡쳐해주신 것과 약간 달랐다...
알고 보니 etc_str2 in ('레벨업 패키지' or '시즌패스')에서 괄호 안에서 or로 구분했기 때문,,

select first_login_date,
ip_addr,
exp,
zone_id
from basic.users
where level>10
and serverno!=1
and etc_str2 in ('레벨업 패키지', '시즌패스')
and etc_str1='상점에서 구매'
order by first_login_date desc
;
SQL실습3 3번 문제

select serverno,
case when first_login_date<2024-01-01 then '기존유저'
else '신규유저'
end as gb,
count(distinct game_actor_id) as actor_cnt,
avg(level) as avg_level
from basic.users
group by serverno,
gb
;
데이터는 출력되지만 게임 캐릭터 수와 평균 레벨이 정답과 다르게 나온다.
내가 의도한 기준대로 데이터가 나뉘지 않은 것 같다는 생각이 들어 오류를 찾아보았다.
조건절에 걸어놓은 날짜에 작은 따옴표를 넣어줬더니 정답대로 출력되었다.
튜터님꼐 질문했더니 데이터가 문자열로 지정되어 있어서 ''안에 넣어 모두 인식시켜줘야 하기 때문이라고 하셨다.

select serverno,
case when first_login_date<'2024-01-01' then '기존유저'
else '신규유저'
end as gb,
count(distinct game_actor_id) as actor_cnt,
avg(level) as avg_level
from basic.users
group by serverno,
gb
;
정상적으로 출력된 모습.
최근에는 계속 파이썬만 공부하기도 했고 여행으로 이틀동안 빠지게 되어서 따라가기 힘들까봐 걱정을 많이 했는데 기본부터 실습을 알려주셔서 감을 찾다보니 세번째 실습 문제까지도 큰 문제 없이 해결할 수 있었다. 꽤 어려운 문제라고 하셨는데 이번 기수 수강생들 모두 잘 해내는듯ㅎㅎ데이터 분석 10기 퐈이아~!~!