[프로그래머스 LV.2] 분기별 분화된 대장균의 개체 수 구하기 — MySQL 정답 & 해설

2025. 12. 3. 18:30·코딩테스트/MYSQL

🔗 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 개념은 다음과 같습니다.

  1. QUARTER() 함수
    • MySQL에서 QUARTER(date)는 날짜가 속한 분기를 반환합니다.
      • 1월~3월 → 1
      • 4월~6월 → 2
      • 7월~9월 → 3
      • 10월~12월 → 4
  2. 문자열 연결(CONCAT)
    • 분기 숫자 뒤에 'Q'를 붙여 출력해야 하므로 CONCAT(QUARTER(...), 'Q') 사용
  3. GROUP BY와 COUNT
    • 분기별 개체 수를 집계하기 위해 GROUP BY와 COUNT(*) 사용
  4. 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
'코딩테스트/MYSQL' 카테고리의 다른 글
  • [프로그래머스 LV.2] 가격대 별 상품 개수 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 상품 별 오프라인 매출 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 성분으로 구분한 아이스크림 총 주문량 — MySQL 정답 & 해설
작지만 꾸준한 성장으로
작지만 꾸준한 성장으로
contact
  • 작지만 꾸준한 성장으로
    파랑새
    작지만 꾸준한 성장으로
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • IT (3)
      • 코딩테스트 (23)
        • 알고리즘 (12)
        • MYSQL (11)
      • 패션 (0)
      • 독후감 (0)
      • TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    프로그래머스 lv.2
    Pandas groupby agg
    알고리즘
    프로그래머스 lv.0
    long format
    wide format
    Python
    mysql
    프로그래머스 lv.1
    파이썬코테
    코테
    Pandas pivot
    SWEA
    데이터 전처리 파이프라인
    Programmers
    자바
    파이썬
    모델 추론
    CPU Bound
    데이터 리모델링
    데이터베이스
    Pandas melt
    와이드 포맷 롱 포맷
    백준
    I/O Bound
    프로그래머스
    python3
    공공데이터 전처리
    sql 코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
작지만 꾸준한 성장으로
[프로그래머스 LV.2] 분기별 분화된 대장균의 개체 수 구하기 — MySQL 정답 & 해설
상단으로

티스토리툴바