💡 채널톡 DA 면접 준비하면서 SQL 문제 풀다가 틀린 것들 정리.
부끄럽지만 기록해둔다. 같은 실수 반복 안 하려고.
.
.
.
..
FROM orders o
ON users u o.user_id = u.user_id
FROM orders o
JOIN users u ON o.user_id = u.user_id
FROM → JOIN → ON 순서!
JOIN 키워드 빼먹으면 안 됨.
WHERE '2024-01-01' <= created_at < '2024-02-01'
파이썬 문법이 튀어나왔다 ㅋㅋ
WHERE created_at >= '2024-01-01'
AND created_at < '2024-02-01'
SQL은 AND로 연결해야 함!
파이썬처럼 a <= x < b 안 됨.
SELECT u.user_id, u.name, COUNT(*)
FROM users u
JOIN orders o ON u.user_id = o.user_id
GROUP BY u.user_id
SELECT u.user_id, u.name, COUNT(*)
FROM users u
JOIN orders o ON u.user_id = o.user_id
GROUP BY u.user_id, u.name
SELECT에 있는 비집계 컬럼은 GROUP BY에 전부 포함!
name도 SELECT에 있으니까 GROUP BY에 넣어야 함.
SELECT user_id, COUNT(order_id) >= 2
FROM orders
SELECT user_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(order_id) >= 2
조건은 SELECT에 넣는 게 아님!
ROW_NUMBER() order_id as rn
뭔가 대충 썼다...
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY amount DESC) AS rn
ROW_NUMBER() OVER(PARTITION BY 그룹 ORDER BY 정렬) AS 별칭
이 구조 통째로 외우자!
LAG(amount) OVER(ORDER BY sale_date) AS prev_amount
"이전 행 값 가져오기" = LAG()
ROW_NUMBER 이해하니까 LAG도 바로 이해됨.
.
.
.
.
.
| 항목 | 상태 | 메모 |
|---|---|---|
| JOIN 문법 | 🔴 | FROM JOIN ON 순서 |
| 날짜 범위 | 🔴 | AND로 연결! |
| GROUP BY 컬럼 | 🟡 | 비집계 컬럼 전부 |
| SELECT vs HAVING | 🟡 | 조건은 HAVING |
| ROW_NUMBER | 🟡 | OVER() 구조 외우기 |
| LAG | 🟢 | 이해 완료 |
📝 틀려야 배운다.
같은 실수 두 번 안 하면 된다!
