내일배움캠프

[내일배움캠프] TIL 3일차 25.12.24(수)

nom_de_plume 2025. 12. 24. 20:54
SQL 문제 풀기 전 지침

(1) 문제 파악

  • 문제가 무엇을 요구하는지 정확히 읽기
  • 어떤 결과를 출력해야 하는지 확인
  • 필요한 컬럼, 조건, 정렬 등 핵심 키워드 체크
    • "이상/이하" vs "초과/미만" 구분 (>= vs >)
    • "포함" vs "제외" 조건 확인 (IN vs NOT IN)
    • 정렬 기준과 방향 (ASC/DESC)
    • 출력 컬럼명 alias(별칭) 지정 여부
(2) 데이터 구조 파악
  • 테이블에 어떤 컬럼이 있는지 확인
  • 각 컬럼의 데이터 타입 확인 (숫자, 문자, 날짜 등)
  • 여러 테이블 정보를 함께 봐야 하는 경우, PK/FK 관계 파악
(3) 변수 유형 파악

범주형

  • 명목형: 순서 없음 (성별, 지역, 음식종류)
  • 순서형: 순서 있음 (학점, 만족도, 등급)
  • → GROUP BY, COUNT, 비율 계산에 주로 사용
수치형
  • 연속형: 부동 소수점 (금액, 시간, 거리)
  • 이산형: 정수 단위 (주문횟수, 인원수)
  •  SUM, AVG, MIN, MAX 등 집계에 사용
(4) 데이터 미리보기
  • SELECT * FROM 테이블 LIMIT 10으로 실제 데이터 형태 확인
  • 컬럼에 어떤 값들이 들어있는지 눈으로 확인
  • SELECT DISTINCT 컬럼 FROM 테이블로 고유값 확인 (범주형 파악에 유용)
(5) NULL 값 존재 여부 확인 및 처리
  • 집계 함수(COUNT, SUM, AVG 등) 사용 시 NULL 처리 방식 고려
  • 필요하면 IFNULL로 NULL값의 대체값 지정 (IFNULL(컬럼, 0))
(6) 중복 데이터 확인
  • DISTINCT가 필요한 상황인지 판단
  • 예: 주문 테이블에서 "주문한 고객 수"를 구할 때
    • COUNT(customer_id) → 총 주문 건수 (중복 포함)
    • COUNT(DISTINCT customer_id) → 고유한 고객 수 (중복 제거)
(7) 데이터 타입 일치 확인
  • 문자열 비교 시 따옴표 사용 (WHERE name = 'Kim')
  • 문자열로 저장된 숫자나 날짜는 타입 변환 후 연산
    • 숫자: CAST(price AS SIGNED)
    • 날짜: STR_TO_DATE(date_str, '%Y-%m-%d')
(8) SQL문 실행 순서 이해
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
왜 이 순서가 중요할까요?
SQL은 우리가 작성하는 순서(SELECT → FROM → WHERE...)와 실제 실행되는 순서가 다릅니다. 이 순서를 이해하면 많은 오류를 예방할 수 있어요!
핵심 포인트
  • WHERE에서는 집계 함수 직접 사용 불가
    • WHERE는 GROUP BY보다 먼저 실행되기 때문에 아직 집계가 안 된 상태
    • 집계 결과로 필터링하려면 GROUP BY 이후에 실행되는 HAVING 사용
  • SELECT에서 만든 alias(별칭)를 WHERE에서 사용 불가
    • WHERE가 SELECT보다 먼저 실행되기 때문에 alias가 아직 존재하지 않음
  • ORDER BY에서는 SELECT의 alias(별칭) 사용 가능
    • 주의! : GROUP BY, HAVING에서는 SELECT의 alias(별칭)를 원칙적으로는 사용 불가능하지만, MySQL에서는 확장 기능으로 허용 (표준 SQL에서는 ORDER BY만 alias 사용 가능, 즉 다른 데이터베이스에서는 위와 같은 문법이 지원 안 될 가능성 존재)

 

SQL 세션 데일리 과제 #1

 

과제 1

login 이벤트 중에서 country = 'kr' 인 데이터의 logid, log_date, game_account_id, device, referrer를 출력하고, logid 오름차순 정렬해서 20개만 보여주세요.

 

답)

select
        logid,
        log_date,
        game_account_id,
        device,
        referrer
from basic.game_logs
where action_type='login' and country='KR'
order by logid
limit 20;
 

 

과제 2

item_gain 중 item_qty >= 10 인 로그를 찾고, logid, log_date, game_account_id, item_name, item_qty를 출력하세요. 정렬은 item_qty DESC, log_date DESC 후 상위 30개를 보여주세요.

 

답)

select
        logid,
        log_date,
        game_account_id,
        item_name,
        item_qty
from basic.game_logs
where action_type='item_gain' and item_qty>=10
order by item_qty desc, log_date desc
limit 30;

=> log_date를 log_data로 입력해 초기 오류 발생. 항상 오타 조심

=> order by 뒤에 2개 이상이 나왔을 때  'and' 가 아닌 ', ' 사용해 오류 발생. 'and'는 where에서 사용, order by에서는 ',' 사용 늘 기억하기 

 

과제 3

action_type의 purchase 이벤트 중 country IN ('KR', 'JP')인 데이터를 대상으로 아래 컬럼을 출력하세요.

- logid, game_account_id, country, item_name, item_qty

- referrer가 NULL이면 'unknown', 아니면 원래 referrer 값을 쓰는 referrer_group컬럼을 CASE WHEN으로 만들어 함께 출력

정렬 : log_date DESC, logid DESC / LIMIT 50

 

답:

select
        logid,
        game_account_id,
        country,
        item_name,
        item_qty,
        case
              when referrer is null then 'unknown'
              else referrer
        end as referrer_group
from basic.game_logs
where action_type='purchase' and country in ('KR','JP')
order by log_date desc, logid desc
limit 50;

=> null은 표기할때 is null임. referrer=null이라 작성해 초기 오류 발생. is null 세트로 암기 필요

 

과제 4

"파티 플레이 로그"만 뽑고 싶습니다. party_id IS NOT NULL인 행 중에서, action_type IN ('quest_complete', 'item_gain')인 데이터만 출력하세요.

- 컬럼 : logid, log_date, game_account_id, action_type, party_id, party_members

- 정렬 : party_members DESC, logid ASC / LIMIT 30

 

답)

select
        logid,
        log_date,
        game_account_id,
        action_type,
        party_id,
        party_members
from basic.game_logs
where party_id is not null and action_type in ('quest_complete', 'item_gain')
order by party_members desc, logid asc
limit 30;
 

 

SQL 세션 데일리 퀴즈 #1

 

Q1. SELECT가 주로 선택하는 것은?

A. 행(row)

B. 열(column)

C. 테이블

D. DBMS

 

답) B. 열(column)

 

Q2. NULL 비교로 올바른 것은?

A. col = NULL

B. col != NULL

C. col IS NULL

D. col <> NULL

 

답) C. col IS NULL

 

Q3. 다음 중 일반적으로 우선순위가 높은 것은? (MySQL 기준)

A. OR

B. AND

 

답) B. AND

 

Q4. LIKE '_____' 는 무엇을 의미하나요?

A. 5글자 문자열과 매칭

B. 5글자 이상

C. _ 문자 포함

D. 공백 포함

 

답) A. 5글자 문자열과 매칭

 

Q5. 별칭(alias) AS로 만든 컬럼은 WHERE에서 사용할 수 있다.

(O/X)

 

답) X

=> 별칭은 select절에서 생성된다. WHERE절이 SELECT절보다 먼저 실행되기 때문에 별칭은 WHERE에서 사용할 수 없다.

     작동순서 꼭 기억.

작동순서 

FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY

 

팀 진행 및 결정사항

2025.12.24 결정사항

25.12.25 직무 발표회 10번째. 제일 마지막 순서

'쿠팡이츠' 핵심지표 결정

ppt 완성 및 대본 완성

 

2025.12.24 일정

9~10시 스크럼 일지(아티클 차후 일정, PPT, 대본 최종 검토
10~12시 아티클 스터디

14~16시 직무 스터디 발표회
20시30분~21시 스크럼 오후 일지

 

오늘의 회고

SQL이 점점 길어진다... 나름 집중해서 듣고 있지만 헷갈린다. 외울것도 점점 많아지는 상황에 초반인 지금 기초를 확실히 하기 위해 노력해야겠다. 엑셀보다 쉽고 빠른 SQL 4주차는 대본 작성 및 팀 회의 일정으로 시간이 부족했다. 4주차는 차후 다 들은 후 TIL 작성 예정이다.