🔗 1. 문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/299308
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 2. 문제 요구사항 정리
이번 문제는 ECOLI_DATA 테이블을 활용하여 각 분기(QUARTER)별 분화된 대장균 개체 수를 구하는 SQL을 작성하는 문제입니
다.
💡 3. 핵심 개념
이번 문제를 풀기 위해 중요한 SQL 개념은 다음과 같습니다.
- QUARTER() 함수
- MySQL에서 QUARTER(date)는 날짜가 속한 분기를 반환합니다.
- 1월~3월 → 1
- 4월~6월 → 2
- 7월~9월 → 3
- 10월~12월 → 4
- MySQL에서 QUARTER(date)는 날짜가 속한 분기를 반환합니다.
- 문자열 연결(CONCAT)
- 분기 숫자 뒤에 'Q'를 붙여 출력해야 하므로 CONCAT(QUARTER(...), 'Q') 사용
- GROUP BY와 COUNT
- 분기별 개체 수를 집계하기 위해 GROUP BY와 COUNT(*) 사용
- GROUP BY에서 SELECT 별칭 사용(MySQL 전용)
- MySQL에서는 SELECT에서 만든 별칭(AS QUARTER)을 GROUP BY와 ORDER BY에서 그대로 쓸 수 있음
- 이유: SQL 실행 순서상 GROUP BY는 SELECT보다 먼저 실행되지만, MySQL 엔진이 파싱 단계에서 별칭을 치환해주기 때문
- 다른 DBMS(Oracle, PostgreSQL 등)에서는 별칭 대신 SELECT 표현식 그대로 사용해야 함
✅ 4. 정답 SQL 코드
SELECT
CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q') AS QUARTER,
COUNT(*) AS ECOLI_COUN
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER ASC;
SELECT
CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q') AS QUARTER,
COUNT(*) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q')
ORDER BY QUARTER;
위는 제가 작성한 코드이고,
아래는 SELECT에서 생성한 별칭을 GROUP BY에 직접 사용하지 않고, 표현식 그대로 GROUP BY에 넣어주는 방식입니다.
'💡 3. 핵심 개념'의 4번에서 언급했듯이, GROUP BY에 SELECT에서 사용한 별칭을 사용하는 것은 MySQL에서만 허용되는 특수한 문법입니다. 표준 SQL에서는 SELECT alias는 GROUP BY에서 아직 정의되지 않았기 때문에 바로 사용할 수 없고, 대신 SELECT에서 사용한 표현식을 그대로 GROUP BY에 넣어야 합니다.
아래 코드와 같이 작성하면 MySQL뿐만 아니라 다른 DBMS에서도 호환되며, 표준 SQL 규칙을 준수하면서 동일한 결과를 얻을 수 있습니다. 이 방식은 면접이나 시험처럼 DBMS가 특정되지 않은 환경에서도 안전하게 사용할 수 있다는 장점이 있습니다.
결론적으로, 별칭을 GROUP BY에 바로 쓰는 방식과 표현식을 그대로 쓰는 방식 둘 다 결과는 같지만, DBMS 호환성과 표준 준수를 고려하면 후자가 더 안전하고 추천되는 방법입니다.
💬 5. 풀이하면서 느낀 점
이번 문제를 풀면서 새롭게 배운 점은 QUARTER 함수를 처음 접했다는 것입니다. 관련 문서를 찾아보면서 각 월이 어떤 분기에 속하는지, 그리고 분기별로 데이터를 집계하는 방법을 정리하다 보니, 앞으로도 관련 문제가 나왔을 때 사용할 수 있겠다는 감이 잡혔습니다. 생각보다 간단하지만, 이렇게 날짜 데이터를 분기 단위로 다루는 게 꽤 유용하다는 것도 알게 되었습니다.
또한, 처음 작성한 쿼리에서는 GROUP BY QUARTER(DIFFERENTIATION_DATE)처럼 표현했는데, MySQL에서는 통과가 되더라고요. 그런데 SELECT에서 만든 별칭을 GROUP BY에 바로 쓰는 방법은 MySQL에서만 가능한 특수한 문법이라는 것을 알게 되었습니다. 다른 DBMS에서는 이 방식이 통하지 않아 오류가 날 수 있기 때문에, 표준 SQL 방식으로는 SELECT에서 쓴 표현식을 그대로 GROUP BY에 넣어주는 것이 안전하다는 것도 깨달았습니다.
이 과정을 통해, MySQL에서 alias를 GROUP BY나 ORDER BY에서 쓸 수 있는 이유, 즉 실제 실행 순서와는 상관없이 엔진이 파싱 단계에서 별칭을 치환한다는 점까지 이해할 수 있었습니다. 덕분에 SQL 문법을 보는 눈이 조금 더 넓어진 느낌입니다.
궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊
'코딩테스트 > MYSQL' 카테고리의 다른 글
| [프로그래머스 LV.2] 가격대 별 상품 개수 구하기 — MySQL 정답 & 해설 (0) | 2025.12.08 |
|---|---|
| [프로그래머스 LV.2] 상품 별 오프라인 매출 구하기 — MySQL 정답 & 해설 (0) | 2025.12.08 |
| [프로그래머스 LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 — MySQL 정답 & 해설 (0) | 2025.12.03 |
| [프로그래머스 LV.2] 성분으로 구분한 아이스크림 총 주문량 — MySQL 정답 & 해설 (0) | 2025.12.01 |
| [프로그래머스 LV.2] 조건에 맞는 도서와 저자 리스트 출력하기 — MySQL 정답 & 해설 (3) | 2025.11.29 |