본문 바로가기

Data Science/SQL86

[SQL/오답] WITH RECURSIVE: 존재하지 않는 시간대 0으로 채우기 (프로그래머스 Lv4) [프로그래머스] GROUP BY 입양 시각 구하기(2); WITH RECURSIVE CTE, HOURhttps://school.programmers.co.kr/learn/courses/30/lessons/59413 1. Problem입양 기록이 담긴 ANIMAL_OUTS 테이블에서 0시부터 23시까지의 모든 시간대별 입양 건수를 조회해야 한다. 단순히 GROUP BY를 사용하면 입양 기록이 없는 시간대(예: 새벽 3시)는 결과에서 아예 누락되지만, 문제의 요구사항은 기록이 없어도 0으로 표기하는 것이다.2. Solution: 가상 시간대 생성과 외부 조인재귀 쿼리로 0~23까지의 숫자 테이블을 먼저 만들고, 이를 기준으로 실제 데이터를 붙여 유실을 방지한다.3. Takeaway: 왜 이 방식이 '고급'인.. 2026. 2. 12.
[SQL/오답] 정규표현식(REGEXP)의 대소문자 함정과 이메일 유효성 검사 (LeetCode1517 Easy) 1. Problem웹사이트 가입자 중 유효한 이메일 형식을 가진 사용자를 필터링해야 한다.Prefix 조건: 반드시 문자로 시작해야 하며, 이후에는 문자, 숫자, 언더바(_), 마침표(.), 대시(-)만 허용된다.Domain 조건: 반드시 @leetcode.com이어야 한다. 정규식의 문법적 정확도뿐만 아니라, 도메인의 대소문자 정합성까지 검증해야 하는 문제이다.2. Solution: REGEXP와 BINARY의 결합문자열 패턴은 REGEXP로 잡고, 엄격한 대소문자 비교는 LIKE BINARY에 위임한다.3. Takeaway: 정규식 설계와 SQL의 특성정규식의 정밀 설계 (^와 $): 시작(^)과 끝($) 앵커를 명시하여 이메일 앞뒤에 원치 않는 공백이나 쓰레기 데이터가 붙는 것을 방지한다. 특히 ... 2026. 2. 10.
[SQL/오답] GROUP_CONCAT: 흩어진 행 데이터를 하나의 리스트로 통합하기 (LeetCode1484 Easy) [리트코드]|Group Sold Products By The Date; GROUP_CONCAThttps://leetcode.com/problems/group-sold-products-by-the-date/description/1. Problem날짜별로 판매된 서로 다른 제품의 개수와 제품 리스트를 구해야 한다. 제품 리스트는 알파벳 순으로 정렬되어야 하며, 중복된 제품명은 제거해야 한다. 행(Row)으로 나열된 데이터를 날짜라는 기준에 맞춰 하나의 열(Column)로 묶어내는 것이 핵심 과제이다.2. Solution: 집계 함수와 문자열 통합COUNT(DISTINCT)로 개수를 세고, GROUP_CONCAT을 이용해 문자열을 결합한다.3. Takeaway: GROUP_CONCAT의 3대 핵심 옵션DIST.. 2026. 2. 10.
[SQL/오답] LEFT JOIN과 NULL의 이해: 존재하지 않는 데이터를 처리하는 법 (LeetCode1378 Easy) 1378. Replace Employee ID With The Unique Identifier; LEFT JOIN, IFNULLhttps://leetcode.com/problems/replace-employee-id-with-the-unique-identifier/1. Problem직원 정보가 담긴 Employees 테이블과 고유 ID가 담긴 EmployeeUNI 테이블을 결합해야 한다. 모든 직원의 이름은 출력되어야 하며, 고유 ID가 없는 직원의 경우 그 자리를 NULL로 표시해야 한다. 즉, 정보가 부족하더라도 기준 테이블의 행을 유지하는 것이 핵심이다.2. Solution: 기준 테이블을 보존하는 외부 조인모든 직원을 출력하기 위해 Employees를 기준으로 LEFT JOIN을 수행한다. 매칭되.. 2026. 2. 10.
[SQL/오답] TOP 1 추출과 데이터 결합: 정렬 조건(Tie-breaker)의 중요성 (LeetCode1341 Medium) [리트코드]|1341. Movie Ratinghttps://leetcode.com/problems/movie-rating/description/1. Problem두 가지 서로 다른 질문에 대한 답을 구한 뒤, 하나의 결과 열(results)로 합쳐야 한다.최다 리뷰어: 가장 많은 리뷰를 남긴 사용자 (동점 시 이름순 정렬)2월 최고 평점 영화: 2020년 2월 평균 평점이 가장 높은 영화 (동점 시 제목순 정렬)2. Solution: 개별 쿼리 최적화와 통합각 요구사항을 독립적인 서브쿼리로 작성하여 LIMIT 1으로 최상위 데이터를 뽑고, UNION ALL로 연결한다.3. Takeaway: 실전 쿼리 작성을 위한 객관적 분석집계 중첩의 한계와 대안: SQL은 MAX(AVG(rating))과 같은 중첩 집.. 2026. 2. 10.
[SQL/오답] CROSS JOIN과 LEFT JOIN 시너지: 시험을 치르지 않은 학생까지 0으로 집계하기 (LeetCode1280 Easy) [리트코드] Easy|1280. Students and Examinations; CROSS JOINhttps://leetcode.com/problems/students-and-examinations/description/ 1. Problem학교의 모든 학생이 모든 과목에 대해 몇 번의 시험을 치렀는지 집계해야 한다.핵심 난관: 시험 기록(Examinations)이 전혀 없는 학생이나, 특정 과목을 응시하지 않은 경우에도 결과 테이블에는 **'0'**으로 표시되어 반드시 등장해야 한다.2. Solution: 카테시안 곱과 외부 조인의 결합모든 학생과 모든 과목의 조합을 CROSS JOIN으로 선언하여 '응시 가능한 전체 목록'을 만든 뒤, 실제 응시 기록을 결합한다.3. Takeaway: 왜 CROSS J.. 2026. 2. 9.