티스토리 뷰
SQL 코드카타
Q11. 여러 기준으로 정렬하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59404
2. 정답 코드:
SELECT
ANIMAL_ID,
NAME,
DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC;
Q12. 이름에 el이 들어가는 동물 찾기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59047
2. 정답 코드:
SELECT
ANIMAL_ID,
NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog'
AND NAME LIKE '%el%'
ORDER BY NAME;
Q13. 나이 정보가 없는 회원 수 구하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131528
2. 정답 코드:
SELECT
COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE IS NULL;
Q14. 가장 비싼 상품 구하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131697
2. 정답 코드:
SELECT
PRICE AS MAX_PRICE
FROM PRODUCT
ORDER BY PRICE DESC
LIMIT 1;
Q15. NULL 처리하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59410
2. 정답 코드:
SELECT
ANIMAL_TYPE,
IFNULL(NAME, 'No name') AS NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
Q16. 경기도에 위치한 식품창고 목록 출력하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131114
2. 정답 코드:
SELECT
WAREHOUSE_ID,
WAREHOUSE_NAME,
ADDRESS,
IFNULL(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE SUBSTR(ADDRESS, 1, 3) = '경기도'
ORDER BY WAREHOUSE_ID ASC;
Q17. 강원도에 위치한 생산공장 목록 출력하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131112
2. 정답 코드:
SELECT
FACTORY_ID,
FACTORY_NAME,
ADDRESS
FROM FOOD_FACTORY
WHERE SUBSTR(ADDRESS, 1, 3) = '강원도'
ORDER BY FACTORY_ID ASC;
Q18. DATETIME에서 DATE로 형 변환
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59414
2. 정답 코드:
SELECT
ANIMAL_ID,
NAME,
SUBSTR(DATETIME, 1, 10) AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
Q19. 흉부외과 또는 일반외과 의사 목록 출력하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/132203
2. 정답 코드:
SELECT
DR_NAME,
DR_ID,
MCDP_CD,
SUBSTR(HIRE_YMD, 1, 10) AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
Q20. 가격이 제일 비싼 식품의 정보 출력하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131115
2. 정답 코드:
SELECT *
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1;
라이브 세션) SQL 강의 6 (윈도우 함수)
윈도우 함수란?
행을 유지하면서(행 수 그대로) 계산 결과를 옆에 붙이는 기능
윈도우 함수 기본 문법
함수(...) OVER (
PARTITION BY ...
ORDER BY ...
)
MySQL에서는 윈도우 함수는 SELECT 리스트/ORDER BY에서만 사용 가능
→ 즉 WHERE, GROUP BY, HAVING에서는 직접 못 씀
윈도우 함수 종류
| 분류 | 대표 함수 | 설명 | GROUP BY 병행 여부 |
| 집계 함수 | SUM(), MAX(), MIN(), AVG(), COUNT() | 윈도우 범위 내 합계, 최대/최소, 평균, 개수 계산 | 가능 |
| 순위 함수 | RANK(), DENSE_RANK(), ROW_NUMBER() | 행에 순위를 매기거나 행 번호 부여 | 불가능 |
| 순서 함수 | FIRST_VALUE(), LAST_VALUE(), LAG(), LEAD() |
파티션 내 첫 값/마지막 값, 이전/다음 행 값 참조 | 불가능 |
| 비율/분석 함수 | RATIO_TO_REPORT(), PERCENT_RANK(), CUME_DIST(), NTILE(n) | 비율, 누적 백분율, 분위수 계산 | 불가능 |
NULL 처리 (윈도우 함수와 같이 쓰임!)
1) IFNULL
- expr1이 NULL이 아니면 expr1
- NULL이면 expr2 반환
IFNULL(expr1, expr2)
2) COALESCE → 병합한단 의미 (컬럼 A, B를 하나로 합치면서 NULL 값도 없앨 수 있다!)
- 처음으로 NULL이 아닌 값을 반환
- ex. 쿠폰 없으면 course_id 기반 기본값, 그래도 없으면 'no_coupon'
COALESCE(val1, val2, val3, ...)
미니실습 0
# IFNULL Ver.
SELECT
student_id,
student_name,
IFNULL(region, 'UNKNOWN') AS region_clean
FROM basic.students
ORDER BY student_id;
# COALESCE Ver.
SELECT
student_id,
student_name,
COALESCE(region, 'UNKNOWN') AS region_clean
FROM basic.students
ORDER BY student_id;
1) 그룹 합/개수/평균을 행 유지한 채로 붙이기
① GROUP BY vs COUNT OVER (행이 줄어드냐 유지되냐)
- GROUP BY student_id + COUNT(*) → 학생당 1행만 남음 (행이 줄어듦)
- COUNT(*) OVER (PARTITION BY student_id) → 원래 행 수 유지 + “학생별 건수” 컬럼만 추가
GROUP BY를 사용한다면,
SELECT
student_id,
COUNT(*) AS enroll_cnt
FROM basic.enrollments
GROUP BY student_id;


반면에 COUNT(*) OVER 사용하면,
SELECT
enrollment_id,
student_id,
course_id,
enroll_date,
COUNT(*) OVER (PARTITION BY student_id) AS enroll_cnt_in_student
FROM basic.enrollments
ORDER BY student_id, enroll_date, enrollment_id;

미니실습 1
SELECT
enrollment_id,
student_id,
course_id,
count(*) OVER (PARTITION BY student_id) AS student_enroll_cnt,
count(*) OVER (PARTITION BY course_id) AS course_enroll_cnt
FROM basic.enrollments
ORDER BY enrollment_id;
2) 그룹별 순번/순위 (ROW_NUMBER / RANK / DENSE_RANK)
① ROW_NUMBER() : 무조건 1,2,3… 번호 (동점이어도 나눠짐)
SELECT
enrollment_id,
student_id,
enroll_date,
ROW_NUMBER() OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS enroll_seq
FROM basic.enrollments
ORDER BY student_id, enroll_seq;
ROW_NUMBER() 사용하면, 사진처럼 enroll_date가 2025-12-12 로 동일함에도 순서가 1, 2로 나눠짐

② RANK vs DENSE_RANK (동점 처리)
- RANK() : 동점이면 같은 순위, 다음 순위는 건너뜀(갭) 1 1 3
- DENSE_RANK() : 동점이면 같은 순위, 다음 순위는 안 건너뜀(촘촘) 1 1 2
SELECT
course_id,
course_name,
list_price,
ROW_NUMBER() OVER (ORDER BY list_price DESC) AS row_num,
RANK() OVER (ORDER BY list_price DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY list_price DESC) AS dense_rnk
FROM basic.courses
ORDER BY list_price DESC, course_id;

미니실습 2
WITH ranked AS (
SELECT
course_id,
enrollment_id,
student_id,
final_price,
ROW_NUMBER() OVER (
PARTITION BY course_id
ORDER BY final_price DESC, enrollment_id
) AS rn
FROM basic.enrollments
)
SELECT
course_id,
enrollment_id,
student_id,
final_price
FROM ranked
WHERE rn <= 2
ORDER BY course_id, rn;
③ 누적합/비율/최근 N개 평균 (SUM/AVG OVER + ORDER BY + Frame)
누적합 ★중요★
누적합은 ROWS 프레임을 명시해라
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
미니실습 3
SELECT
payment_id,
paid_at,
amount,
sum(amount) OVER (
ORDER BY paid_at, payment_id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cum_amount
FROM basic.payments
WHERE payment_status = 'paid'
ORDER BY paid_at, payment_id;
여기서 PARTITION BY 안 쓰는 이유? 파티션별로 나눌 필요가 없으니까!
④ 이전/다음 행 비교 (LAG/LEAD) + NULL 처리 (IFNULL/COALESCE) ★내용 어려움★
: LAG, LEAD는 시계열/세션/로그 데이터에서 정말 자주 씀
- LAG(값) : 내 바로 “이전 행”의 값을 가져온다
- LEAD(값) : 내 바로 “다음 행”의 값을 가져온다
LAG(expr, N, default) OVER (PARTITION BY ... ORDER BY ...)
LEAD(expr, N, default) OVER (PARTITION BY ... ORDER BY ...)
- N 기본값 = 1 (한 칸 전/후)
- default 없을 때 대처 값(기본값 = NULL)
- ORDER BY는 사실상 필수(“전/후” 기준이 필요)
WITH w AS (
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS prev_price
FROM basic.enrollments
ORDER BY student_id, enroll_date, enrollment_id
)
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
prev_price,
final_price - COALESCE(prev_price, final_price) AS diff_from_prev
FROM w
ORDER BY student_id, enroll_date, enrollment_id;
⚬ COALESCE(prev_price, final_price) : prev_price가 NULL이면 final_price를 사용
⚬ IFNULL(prev_price, final_price)로 바꿔도 똑같이 동작
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price, 1, final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS prev_price,
final_price
- LAG(final_price, 1, final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS diff_from_prev
FROM basic.enrollments
ORDER BY student_id, enroll_date, enrollment_id;
WITH w AS (
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS prev_price
FROM basic.enrollments
ORDER BY student_id, enroll_date, enrollment_id
)
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
prev_price,
final_price - COALESCE(prev_price, final_price) AS diff_from_prev
FROM w
ORDER BY student_id, enroll_date, enrollment_id;
-------------------------------------------------------------------------------------------------------------------------------------------------
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price, 1, final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS prev_price,
final_price
- LAG(final_price, 1, final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS diff_from_prev
FROM basic.enrollments
ORDER BY student_id, enroll_date, enrollment_id;
위 아래 동일한 기능을 하는 구문인데 LAG(final_price, 1, final_price) 를 써서 엄청 짧아졌다!
근데, 여기서 더 짧아질 수도 있다!
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price, 1, final_price) OVER w AS prev_price,
LEAD(final_price, 1, final_price) OVER w AS next_price
FROM basic.enrollments
WINDOW w AS (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
)
ORDER BY student_id, enroll_date, enrollment_id;
AS (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id )
구문 자체를 WINDOW w AS () 로 줄여서 쓸 수 있다!
OVER ~ 길게 썼던 걸
OVER w 로 줄이는 방법!
미니실습 4 ★★★ 개념 확실히 익히기
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price, 1, final_price) OVER w AS prev_price,
LEAD(final_price, 1, final_price) OVER w AS next_price,
final_price - LAG(final_price, 1, final_price) OVER w AS diff_from_prev,
final_price - LEAD(final_price, 1, final_price) OVER w AS diff_to_next
FROM basic.enrollments
WINDOW w AS (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
)
ORDER BY student_id, enroll_date, enrollment_id;
# WINDOW w AS () 사용 Ver.
WITH w AS (
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS prev_raw,
LEAD(final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS next_raw
FROM basic.enrollments
)
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
COALESCE(prev_raw, final_price) AS prev_price,
COALESCE(next_raw, final_price) AS netx_price,
final_price - COALESCE(prev_raw, final_price) AS diff_from_prev,
final_price - COALESCE(next_raw, final_price) AS diff_to_next
FROM w
ORDER BY student_id, enroll_date, enrollment_id;
# COALESCE(x, final_price) 사용 Ver.
WITH w AS (
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
LAG(final_price, 1, final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS prev_price,
LEAD(final_price, 1, final_price) OVER (
PARTITION BY student_id
ORDER BY enroll_date, enrollment_id
) AS next_price
FROM basic.enrollments
)
SELECT
enrollment_id,
student_id,
enroll_date,
final_price,
prev_price,
next_price,
final_price - prev_price AS diff_from_prev,
final_price - next_price AS diff_to_next
FROM w
ORDER BY student_id, enroll_date, enrollment_id;
# LAG / LEAD 함수의 Default 값 사용 Ver.
✅ STRING 함수 → WHERE절에서 자주 사용
| 함수 이름 | 정의 | 문법 | 결과 |
| 🔥CONCAT | 문자열을 병합할 때 사용 | CONCAT('피카츄','라이츄') | 피카츄라이츄 |
| 🔥SUBSTRING | 문자열의 일부를 잘라낼 때 사용 | SUBSTRING('피카츄라이츄', 2, 4) | 카츄라이 |
| 🔥SUBSTRING_INDEX | 문자열을 특정 구분기호 (.) 기준으로 나누어 일부를 추출할 때 사용 | SUBSTRING_INDEX('피카츄.라이츄', '.', 1) | 피카츄 |
| REVERSE | 문자열을 뒤집을 때 사용. 특정 문자 탐색에도 활용 가능 | REVERSE('피카츄') | 츄카피 |
| LEFT | 문자열의 왼쪽부터 N개 문자 추출 | LEFT('피카츄라이츄1234', 5) | 피카츄라이 |
| RIGHT | 문자열의 오른쪽부터 N개 문자 추출 | RIGHT('피카츄라이츄1234', 5) | 츄1234 |
✅ Math 함수 → SELECT / HAVING에서 자주 사용
| 함수 이름 | 정의 | 문법 | 결과 예시 |
| 🔥 ABS | 절대값을 출력함. | ABS(-1) | 1 |
| 🔥 ROUND | 숫자를 소수점 이하 자릿수에서 반올림하여 출력함. | ROUND(2.77, 1) - 숫자 1은 소수 첫째짜리까지 반올림하겠다는 뜻 |
2.8 |
| CEILING | 소수점을 올림하여 출력함. | CEILING(2.77) | 3 |
| FLOOR | 소수점을 내림하여 출력함. | FLOOR(2.77) | 2 |
| 🔥TRUNCATE | 숫자를 소수점 이하 자릿수에서 버림하여 출력함. | TRUNCATE(2.77, 1) - 숫자 1은 소수 첫째짜리만 남겨두고 버리겠다는 뜻 |
2.7 |
| RAND | 지정 숫자 범위 중 하나를 랜덤하게 출력함. | ROUND(RAND() * 100, 0) | 0~100 사이의 랜덤값 |
✅ 날짜 함수 → GROUP BY / WHERE에서 자주 사용
| 함수 이름 | 정의 | 문법 | 결과 예시 |
| 🔥 NOW() | 현재 날짜와 시간을 출력 | NOW() | 현재 시간 출력 |
| SYSDATE() | 현재 날짜와 시간을 출력 | SYSDATE() | 현재 시간 출력 |
| CURRENT_TIMESTAMP() | 현재 날짜와 시간을 출력 | CURRENT_TIMESTAMP() | 현재 시간 출력 |
| 🔥 DATE_ADD() | 날짜에 일정 기간을 더함 | DATE_ADD('2024-04-03', INTERVAL 1 DAY) | 2024-04-04 |
| 🔥 DATE_SUB() | 날짜에서 일정 기간을 뺌 | DATE_SUB('2024-04-03', INTERVAL 1 DAY) | 2024-04-02 |
| 🔥 DATEDIFF() | 두 날짜의 차이(일 수)를 계산 | DATEDIFF('2024-04-03','2024-04-01') | 2 |
| 🔥 DATE_FORMAT() | 날짜를 특정 형식으로 출력 | DATE_FORMAT(NOW(), '%Y-%m-%d') | 2024-08-17 등 |
| 🔥 UNIX_TIMESTAMP() | 현재 시간을 유닉스 타임스탬프로 반환 | UNIX_TIMESTAMP() | 정수값 |
| CURDATE() | 현재 날짜만 출력 | CURDATE() | 2025-08-17 등 |
| CURRENT_DATE() | 현재 날짜만 출력 | CURRENT_DATE() | 2025-08-17 등 |
| CURTIME() | 현재 시간만 출력 | CURTIME() | 23:45:00 등 |
| CURRENT_TIME() | 현재 시간만 출력 | CURRENT_TIME() | 23:45:00 등 |
| YEAR() | 날짜의 연도 추출 | YEAR('2024-04-01') | 2024 |
| MONTH() | 날짜의 월 추출 | MONTH('2024-04-01') | 4 |
| DAY() | 날짜의 일(일자) 추출 | DAY('2024-04-01') | 1 |
과제 1. NULL 처리 + JOIN 1번 (COALESCE/IFNULL 연습)
✅ 상황
운영팀이 신청 내역을 볼 때,
- 학생 region이 비어있으면 "UNKNOWN"으로 보이고
- coupon_code가 비어있으면 "no_coupon"으로 보이길 원합니다.
✅ 목표
enrollment_status IN ('active','completed')인 신청만 대상으로 아래를 출력하세요.
출력 컬럼
- enrollment_id
- student_id
- student_name
- region_clean : COALESCE(s.region, 'UNKNOWN')
- coupon_label : IFNULL(e.coupon_code, 'no_coupon')
정렬
- enrollment_id 오름차순
SELECT
e.enrollment_id,
e.student_id,
s.student_name,
COALESCE(s.region, 'UNKNOWN') AS region_clean,
IFNULL(e.coupon_code, 'no_coupon') AS coupon_label
FROM basic.enrollments e
INNER JOIN basic.students s
ON e.student_id = s.student_id
WHERE e.enrollment_status IN ('active', 'completed')
ORDER BY e.enrollment_id;
과제 2. “행 유지” 윈도우 집계 (COUNT/SUM/AVG OVER)
✅ 상황
분석팀이 enrollments(신청 1건=1행)를 유지한 채로, 학생별 통계를 “옆에 붙여서” 보고 싶어합니다.
✅ 목표
enrollments에서 각 행마다 아래 컬럼을 붙여 출력하세요.
출력 컬럼
- enrollment_id
- student_id
- final_price
- student_enroll_cnt : 학생 기준 신청 건수
- student_total_spend : 학생 기준 총 결제(신청금액 합)
- student_avg_price : 학생 기준 평균 신청금액
정렬
- student_id, enrollment_id 오름차순
SELECT
enrollment_id,
student_id,
final_price,
COUNT(*) OVER (
PARTITION BY student_id
) AS student_enroll_cnt,
SUM(final_price) OVER (
PARTITION BY student_id
) AS student_total_spend,
avg(final_price) OVER (
PARTITION BY student_id
) AS student_avg_price
FROM basic.enrollments
ORDER BY student_id, enrollment_id;
과제 3. 학생별 “가장 비싼 신청 1건”만 뽑기 (ROW_NUMBER + CTE)
✅ 상황
마케팅팀이 학생별로 “가장 고가 강좌 신청 1건”만 뽑아 VIP 안내를 보내려 합니다.
✅ 목표
`enrollment_status IN ('active','completed')`만 대상으로,
학생별로 `final_price`가 가장 큰 신청 1건만 남기세요.
동점이면 enrollment_id가 더 작은 것을 1건으로 선택하세요.
출력 컬럼
- student_id
- enrollment_id
- final_price
정렬
- student_id 오름차순
WITH ranked AS (
SELECT
student_id,
enrollment_id,
final_price,
ROW_NUMBER() OVER (
PARTITION BY student_id
ORDER BY final_price DESC, enrollment_id ASC
) AS rn
FROM basic.enrollments
WHERE enrollment_status IN ('active', 'completed')
)
SELECT
student_id,
enrollment_id,
final_price
FROM ranked
WHERE rn = 1
ORDER BY student_id;
과제 4. 결제 로그 “이전 값 + 변화량 + 누적합” 만들기 (LAG + SUM OVER)
✅ 상황
재무팀이 paid 결제 로그를 시간순으로 보면서,
- 바로 이전 결제 금액
- 이전 대비 증감
- 지금까지 누적 결제액
- 을 한 번에 보고 싶어합니다.
✅ 목표
payment_status='paid'인 결제만 대상으로 아래를 출력하세요.
출력 컬럼
- payment_id
- paid_at
- amount
- prev_amount : 이전 결제의 amount (없으면 0)
- diff_from_prev : amount - prev_amount
- cum_amount : 시간순 누적 결제액
정렬
- paid_at, payment_id 오름차순
SELECT
payment_id,
paid_at,
amount,
LAG(amount, 1, 0) OVER (
ORDER BY paid_at
) AS prev_amount,
amount
- LAG(amount, 1, 0) OVER (
ORDER BY paid_at
) AS diff_from_prev,
SUM(amount) OVER (
ORDER BY paid_at
) AS cum_amount
FROM basic.payments
WHERE payment_status = 'paid'
ORDER BY paid_at, payment_id;
# WINDOW w AS () 미사용 Ver.
SELECT
payment_id,
paid_at,
amount,
LAG(amount, 1, 0) OVER w AS prev_amount,
amount - LAG(amount, 1, 0) OVER w AS diff_from_prev,
SUM(amount) OVER w AS cum_amount
FROM basic.payments
WHERE payment_status = 'paid'
WINDOW w AS (
ORDER BY paid_at
)
ORDER BY paid_at, payment_id;
# WINDOW w AS () 사용 Ver. 제출 이걸로
데일리 퀴즈
Q1. MySQL에서 윈도우 함수 사용 위치로 올바른 것은?
A. WHERE 절에서만 사용 가능하다
B. GROUP BY 절에서만 사용 가능하다
C. SELECT 리스트와 ORDER BY 절에서만 사용 가능하다
D. JOIN ON 절에서만 사용 가능하다
Q2. LAG(expr, N, default)에 대한 설명으로 올바른 것은?
A. N의 기본값은 0이다
B. 이전 행이 없으면 default를 반환한다
C. default의 기본값은 0이다
D. ORDER BY 없이도 항상 같은 결과가 보장된다
Q3. COALESCE(a, b, c)에 대한 설명으로 올바른 것은?
A. 세 값이 모두 NULL이면 0을 반환한다
B. 첫 번째 인자만 검사하고 NULL이면 항상 b를 반환한다
C. 왼쪽부터 보면서 처음으로 NULL이 아닌 값을 반환한다
D. NULL을 검사할 수 없는 함수다
Q4. ROW_NUMBER()와 RANK()의 차이로 가장 올바른 것은?
A. 둘 다 동점이면 같은 순위를 준다
B. ROW_NUMBER는 동점이어도 서로 다른 번호를 준다
C. RANK는 ORDER BY 없이도 항상 안정적이다
D. ROW_NUMBER는 GROUP BY가 있어야만 사용 가능하다
Q5. 아래 누적합 문법에서 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW의 의미로 가장 올바른 것은?
A. 현재 행 한 줄만 합산한다
B. 파티션의 마지막 행부터 현재 행까지 합산한다
C. 파티션의 첫 행부터 현재 행까지 누적 합산한다
D. 파티션 전체(모든 행)를 항상 합산한다
데이터 리터러시) 1-5. 결론 도출
결과 - 결론
- 결과 : 계산과 분석을 해서 나온 결과물 → '무엇을'
- 결론 : 목적에 대해 어떤 의미가 있는지 설명하는 것 → '그것이 왜 중요한지?'
결론을 잘 정리하는 방법
- 단순하고 쉽게 전달
- 흥미유발
- 대상자 관점에서의 접근
- 직관적으로 이해할 수 있도록 시각화
어제 컨디션이 안 좋았던 탓에 최대한 휴식을 취하려고 했더니 오늘은 어제보단 집중해서 공부할 수 있었다.
SQL 라이브 세션 내용도 조금 까다로웠는데, 혼자 긴 시간 복습하다보니 일부는 예제 쿼리를 보지 않아도 될 정도로 이해가 된 것 같다.
내일은 쉬는 날이긴하지만 조금만 놀고..! 금요일 성취도 평가를 위해 그 동안 배웠던 내용들을 복습해야겠다.
마지막으로 생성형 AI를 활용한 블로그 작성 과정도 배웠는데, 짧은 시간 안에 많은 내용을 접해 아직은 낯설지만, 앞으로 차근차근 글을 작성해보며 활용법에 익숙해져야겠다고 느꼈다.
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 260104) 주말 SQL 코드카타 (0) | 2026.01.04 |
|---|---|
| 8일차) 내일배움캠프 데이터 분석 TIL - SQL 기초(8) (1) | 2026.01.02 |
| 6일차) 내일배움캠프 데이터 분석 TIL - SQL 기초(6) (0) | 2025.12.30 |
| 5일차) 내일배움캠프 데이터 분석 TIL - SQL 기초(5) (0) | 2025.12.29 |
| 4일차) 내일배움캠프 데이터 분석 TIL - SQL 기초(4) (1) | 2025.12.26 |
- Total
- Today
- Yesterday
- SQL
- 통계
- github
- 데이터시각화
- 머신러닝
- GoogleColab
- 데이터분석
- 내일배움캠프
- 파이썬
- 코딩처음
- 데이터분석입문
- 비전공자코딩
- 프로그래밍입문
- 태블로
- 코딩기초
- Tableau
- git
- 중학생코딩
- 코드카타
- 파이썬입문
- 구글코랩
- Python
- 텍스트분석
- Til
- 판다스
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
