
💡 SQL에서 가장 중요한 개념 중 하나인 JOIN을 완벽하게 정리한다.두 개 이상의 테이블을 연결해서 데이터를 가져오는 것.현실에서 데이터는 여러 테이블에 나뉘어 저장된다:users 테이블: 유저 정보orders 테이블: 주문 정보products 테이블: 상품 정보

💡 데이터를 그룹으로 묶고 요약하는 핵심 기술을 정리한다.데이터를 특정 기준으로 묶어서 집계하는 것.예: "유저별 총 주문 금액", "월별 매출", "상품별 판매 수량"→ 이런 질문에 답하려면 GROUP BY 필수!orders| order_id | user_id |

💡 복잡한 문제를 단계별로 해결하는 서브쿼리를 완벽 정리한다.쿼리 안에 들어가는 또 다른 쿼리.복잡한 질문을 단계별로 나눠서 해결할 수 있다.users| user_id | name | created_at |\|---------\|------\|------------\

💡 코딩테스트 단골! 윈도우 함수를 완벽하게 정리한다.GROUP BY 없이 집계하면서 개별 행도 유지하는 함수.→ 원본 데이터 + 집계 결과를 동시에!orders| order_id | user_id | amount | order_date |\|----------\|-

💡 실제 코딩테스트에서 반복 출제되는 패턴을 정리한다.코딩테스트에서 자주 나오는 패턴을 익히면,새로운 문제도 "아, 이건 저 패턴이네!" 하고 풀 수 있다.users| user_id | name | created_at |\|---------\|------\|-----

💡 코테에서 가장 자주 나오는 날짜/시간 함수를 완벽 정리한다.코딩테스트 문제 유형:"2024년 1월에 가입한 유저""최근 7일간 주문""월별 매출 집계""요일별 트래픽"→ 날짜 함수 모르면 못 푸는 문제 많음!orders| order_id | user_id | am

💡 지저분한 데이터를 깔끔하게 정리하는 문자열 함수를 정리한다.이름에서 성만 추출이메일에서 도메인 추출공백 제거대소문자 통일데이터 합치기→ 실무 데이터는 지저분함. 정제 필수!users| user_id | name | email |\|---------\|------\

업로드중..💡 NULL 때문에 틀리는 문제가 많다. 완벽하게 정리한다."값이 없음" 을 나타내는 특수한 상태.0과 다름 (0은 값임)빈 문자열('')과 다름FALSE와 다름중요: NULL과의 모든 비교는 NULL을 반환!users| user_id | name | ag

💡 여러 쿼리 결과를 하나로 합치는 집합 연산을 정리한다.두 개 이상의 SELECT 결과를 합치는 연산.employees_kr (한국 직원)| id | name | dept |\|----\|------\|------\|| 1 | 김철수 | 개발 || 2 | 이영희 |

💡 채널톡 JD에 BigQuery가 있다! MySQL과 다른 문법을 정리한다.Google Cloud의 데이터 웨어하우스.페타바이트급 데이터 처리서버리스 (관리 필요 없음)SQL 기반이지만 문법이 조금 다름채널톡 JD:"BigQuery 데이터 마트를 직접 설계하고, D

💡 채널톡 DA 면접 준비하면서 SQL 문제 풀다가 틀린 것들 정리.부끄럽지만 기록해둔다. 같은 실수 반복 안 하려고.FROM → JOIN → ON 순서!JOIN 키워드 빼먹으면 안 됨.파이썬 문법이 튀어나왔다 ㅋㅋSQL은 AND로 연결해야 함!파이썬처럼 a <

💡 3문제 더 풀면서 새로 발견한 약점들."없는 것 찾기" 패턴 집중 연습했다.주문을 한 번도 하지 않은 유저를 조회해줘."없는 것 찾기"는 무조건 LEFT JOIN!INNER JOIN 쓰면 없는 애들이 아예 안 나옴 ㅠIS NULL은 WHERE에서!반복 연습 필요.

💡 같은 유형 4문제 연속 복습하면서 발견한 것들.70점 → 99점까지 성장했다!HAVING은 그룹 조건이니까 집계함수 써야 함!MySQL에서는 별칭 되긴 하지만, BigQuery/PostgreSQL에서는 안 됨!SQL 실행 순서:채널톡이 BigQuery 쓰니까 집계

💡 ROW_NUMBER 문법이 계속 헷갈려서 집중 연습했다.95점에서 시작해서 4연속 100점까지!뭔가 다 섞여버렸다... ㅋㅋ순서 외우자!PARTITION BY와 ORDER BY는 OVER() 안에 들어간다!급하게 풀면 괄호 빠뜨림. AS 앞에 ) 있는지 확인!테이

💡 LAG/LEAD 11문제 풀면서 확실히 정복했다!실수하면서 배운 것들 정리.CTE에서 새 컬럼 만들면 → FROM도 CTE에서!tomorrow 컬럼은 원본 테이블에 없어!비교할 값을 LEAD/LAG에 넣어야 해!매출 비교면 sales, 주가 비교면 price!SQ

이전 구매일로부터 7일 이내에 재구매한 기록 찾기결과 컬럼: user_id, prev_order_date, order_date, days_diffLAG는 복잡해 보이지만 결국 날짜 값 하나를 반환한다.비유하자면:해결 방법 2가지:A) CTE에서 LAG만 하고, 메인에서

각 유저별로 연속 접속 구간을 찾고, 각 구간의 연속 일수 구하기결과 컬럼: user_id, start_date, end_date, consecutive_daysuser_id = 101 데이터로 보자:왜 이렇게 되냐면:연속된 날짜: 날짜가 1씩 증가, 순번도 1씩 증가

월별로 각 카테고리 매출을 컬럼으로 펼쳐서 보여주기행 → 열 변환 (피벗)CASE WHEN이 하는 일:SUM으로 합치면:2024-01 음식: 10000 + 15000 = 25000피벗 = SUM(CASE WHEN 조건 THEN 값 ELSE 0 END)SELECT 안에

이전 구매일로부터 5일 이내 재구매한 기록 찾기이유: SQL은 SELECT 절을 동시에 처리해서 방금 만든 별칭을 바로 참조 못함!기억: LAG, LEAD, ROW_NUMBER, RANK 등 윈도우 함수는 항상 OVER() 필수!구분법:WHERE: 행 필터링 (집계 전

기억: DATE_SUB, DATEDIFF는 일반 함수! OVER() 안 붙어!예시:grp 값 확인:grp = '02-29'는 "이 행들이 같은 그룹이다"라는 표식일 뿐! 날짜 자체는 의미 없어!흐름:DATE_SUB에 OVER() 붙이지 않기DATE_SUB(날짜, INT

기억: DATE_SUB, DATEDIFF는 일반 함수! OVER() 안 붙어!예시:grp 값 확인 (rn 포함 전체 과정):왜 연속이면 grp가 같아지냐?연속된 날짜: 날짜 +1, rn도 +1 → 빼면 같은 값!끊긴 날짜: 날짜 +4 (03-03 → 03-07), rn

가입월(cohort) 기준으로, 가입 후 N개월 차에 주문한 유저 수 구하기코호트 = 같은 시기에 가입한 유저 그룹1월 가입자 = 1월 코호트2월 가입자 = 2월 코호트왜 이렇게 묶냐?→ "1월에 가입한 사람들이 시간이 지나도 계속 서비스 쓰냐?" 를 추적하려고!→ "

→ 종료일 - 시작일 계산!WEEK 계산 예시:순서 반대라서 헷갈림 주의!→ "1월 1주차, 3월 2주차" 개념 ❌→ 그냥 총 일수 ÷ 7 ✅캘린더 주차 원하면:채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀

SELECT 결과를 임시 테이블처럼 사용하는 것!같은 쿼리, 다른 표현:WITH는 "재료 준비"일 뿐, JOIN은 따로 해줘야 해!비유:WITH = 재료 준비 🥕🥩JOIN = 요리하기 🍳재료 준비했다고 자동으로 요리되는 게 아니야!면접 팁: 둘 다 쓸 줄 알면 좋

예시:언제 쓰냐: 첫 구매까지 며칠 걸렸나?⚠️ DATEDIFF랑 순서 반대!단위 옵션:| 단위 | 의미 |\|------\|------\|| YEAR | 년 || MONTH | 월 || WEEK | 주 || DAY | 일 || HOUR | 시간 |예시:언제 쓰냐: 코

기억법:며칠 = Day = DATEDIFF몇 개월/주 = MONTH/WEEK = TIMESTAMPDIFF팁: 문제 읽고 테이블명, 컬럼명 먼저 확인!"첫 구매"까지 며칠 → WITH + MIN 필요!채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀

순서 주의: 종료일 - 시작일 (DATEDIFF랑 반대!)ROUND 필요 없어! 이미 정수야!채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀

채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀

UNION ALL이랑 CROSS JOIN을 섞어서 씀 ㅋㅋtable_A:table_B:결과: 2 + 2 = 4행→ 위아래로 쌓임!fruits:colors:결과: 2 × 2 = 4행→ 모든 조합이 생김!문제: 모든 음료 × 모든 사이즈 조합UNION ALL은 필요 없음!

에러 이유: grades 테이블 JOIN 안 했는데 g.grade 썼음!첫 번째 SELECT: 3개 (member_id, name, grade)두 번째 SELECT: 3개 맞춰야 함!문제 유형: NULL인 product_id 행에 0, 1, 2 값 넣어서 확장오늘의 교

"SQL 코테도 결국 수학, 국어, 영어 문제랑 똑같다!"문제 속에 답이 있다!문제:"엄마x아빠 조합이 아닌, 엄마, 아빠 각각의 가장 어린 자녀"번역:"각각의" → 따로 구해서 합쳐야겠네!엄마 따로 (motherId) + 아빠 따로 (fatherId)→ UNION A

"최고 랭킹"이니까 MAX 아니야? 라고 생각했는데...최고 랭킹 = 숫자가 가장 작은 것 = MIN!랭킹/순위 → 숫자가 작을수록 좋다 → MIN!점수/금액 → 숫자가 클수록 좋다 → MAX!"최고"라는 단어를 보고 → 무의식적으로 MAX!하지만 "뭐가 최고인지" 생

어떻게 거르면 좋을까?"최종적으로 뭘 쓸 거야?"부서 이름두 번째 고연봉자 이름dept_name ← SELECT에 씀 ✅employee_name ← SELECT에 씀 ✅rn_desc ← WHERE에 씀 ✅d.id, e.id, e.deptId, e.salary ← 안 씀

UNION ALL로 두 쿼리 합친 후에 전체를 정렬하고 싶은데, 어떻게 해?괄호 없어도 돼! 맨 끝에 붙이면 전체 결과에 적용됨!UNION이 합치면서 개별 ORDER BY는 무시해버려!UNION ALL 결과 (정렬 전):| name | birth_year |\|----

💡 교훈:컬럼명은 외워서 쓰지 말고, 테이블 정의 보면서 그대로 쓰자!💡 교훈:별칭 정하면 일관성 있게! 쓰기 전에 한 번 더 확인!💡 교훈:필요한 테이블 개수 = JOIN 개수 확인하자!💡 교훈:문제 조건 끝까지 읽고, 체크하면서 쿼리 작성!💡 교훈:CTE에

로직은 거의 다 맞음!Q1~Q4 유형 패턴 완벽히 이해함실수 지적하면 바로 수정 가능첫 제출 정답률이 낮음대부분 오타/컬럼명 실수급하게 풀면 실수 터짐"실력은 충분하다. 근데 실수가 발목 잡는다."✅ 침착하게✅ 컬럼명 확인하면서✅ 천천히 풀면→ 합격! 🎉❌ 급하게❌

"집계함수(CASE WHEN 조건 THEN 값 END)" 순서 기억!OVER() 쓰면 모든 행 유지 + GROUP BY 없이!HAVING에서는 별칭 말고 집계함수 직접 쓰자! (범용적!)조건부 COUNT = COUNT(CASE WHEN 조건 THEN 값 END)

문제 보자마자 "어 복잡해 보여!" → 바로 윈도우 함수!→ 오버 엔지니어링! 💀"행이 줄어들어야 해? 유지되어야 해?"결과:| 반 | 평균 |\|----\|------\|| A | 87.5 || B | 87.5 |→ 4행 → 2행 (줄어듦!)✅ GROUP BY!결과

alias 테이블 별칭, 언제 생략해도 될까?

윈도우 함수니까 () OVER() 필수!첫 행의 LAG = NULL, 마지막 행의 LEAD = NULL복잡한 계산이면 괄호 치는 게 가독성 좋음!윈도우 함수 = 행 유지 = GROUP BY 불필요!이전/다음 행 비교할 때 = LAG/LEAD! 💪업로드중..

LAG로 전일 대비 변화량을 구했는데...NULL = "모름"이니까, 계산 결과도 "모름"!하나라도 NULL이면 → 결과는 NULL!NULL이면 대체값으로 바꿔줌!COALESCE가 더 범용적! (표준 SQL)NULL 만나면 COALESCE! 💪

CASE WHEN을 3개 따로 쓰고 있었다...CASE 3개가 아니라 1개로 합쳐야 한다!CASE WHEN은 순차 처리!위에서 걸리면 아래는 검사 안 함!둘 다 OK! 정답 없음! 읽기 편한 대로!CASE 하나 vs 여러 개, 상황에 맞게! 💪업로드중..

⚠️ SQL은 1부터 시작! (0 아님!)양수 = 앞에서부터, 음수 = 뒤에서부터!문자열 = SUBSTRING + CONCAT + SUBSTRING_INDEX! 💪

SUBSTRING, CONCAT, SUBSTRING_INDEXREPLACE, TRIM, CHAR_LENGTH, LPAD/RPAD, UPPER/LOWER, LEFT/RIGHT해당 문자 여러 개 있으면 전부 바꿈!가운데 공백은 안 건드림! 앞뒤만!⚠️ 한글 다루면 CHAR

근무일수를 구하려고 DATE_SUB을 썼다...DATE_SUB은 일수 계산이 아니다!큰 날짜가 먼저! (끝 - 시작)DATE_SUB에 날짜 2개 못 넣어! INTERVAL 형태로만!윤년, 월별 일수 다 SQL이 알아서 처리! 😎날짜 = DATEDIFF(숫자) vs D

유저별 총 주문금액을 구하는데 또 OVER를 썼다...같은 실수 반복 중! 😱"행이 줄어들어?"→ 3행 → 2행! (줄어듦!)→ 4행 → 4행! (유지!)둘 다 "유저별 1줄" 문제인데 OVER를 써버림!문제 읽고 이렇게 판단하자!1\. "유저별 총 금액 구하라" →

"지역별 매출 1등 매장"을 구하려는데, CTE 1개에서 SUM이랑 ROW_NUMBER를 동시에 하려 했다...매장당 1줄로 줄어듦!매장당 1줄이니까 순위가 정확!같은 매장이 여러 줄! ROW_NUMBER 순위가 꼬임! 😱"~별 1등을 구하라" = CTE 2개!GRO