728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/144856
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
-- 코드를 입력하세요
-- 판매중인 도서 정보 BOOK
-- 저자 정보 AUTHOR
-- BOOK_SALES
-- 2022년 1월, 저자 별, 카테고리 별 매출액
SELECT
B.AUTHOR_ID,
A.AUTHOR_NAME,
B.CATEGORY,
SUM(S.SALES * B.PRICE) AS TOTAL_SALES
FROM BOOK_SALES S
JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE DATE_FORMAT(S.SALES_DATE, '%Y-%m') = '2022-01'
GROUP BY B.AUTHOR_ID, B.CATEGORY
ORDER BY B.AUTHOR_ID, B.CATEGORY DESC;
✅ WHERE vs HAVING 차이점
구분 | WHERE | HAVING |
시점 | GROUP BY 이전 | GROUP BY 이후 (즉, 집계 이후) |
대상 | 행 단위 조건 | 그룹 단위 조건 (집계 결과) |
사용 예시 | WHERE price > 1000 | HAVING SUM(sales) > 100000 |
동작 방식 | 필터링 후 그룹화 | 그룹화 후 필터링 |
✅ 1. SQL 표준의 관점 (STRICT SQL, PostgreSQL 등)
SQL 표준에 따르면 SELECT 절에 나오는 집계되지 않은 컬럼은 모두 GROUP BY에 포함되어야 한다.
-- 아래는 SQL 표준에서는 오류
SELECT AUTHOR_ID, AUTHOR_NAME, SUM(SALES)
FROM ...
GROUP BY AUTHOR_ID;
✅ 2. MySQL의 관점 (기본값: ONLY_FULL_GROUP_BY OFF)
MySQL은 ONLY_FULL_GROUP_BY 모드가 비활성화되어 있으면, GROUP BY에 포함되지 않은 컬럼이 SELECT에 있어도 “동일한 값으로 간주되는 경우”에는 허용한다. 즉, 다음 쿼리도 실행된다.
단, 이건 MySQL이 내부적으로 AUTHOR_NAME을 AUTHOR_ID로부터 결정 가능하다고 판단할 수 있을 때만 통과된다.
SELECT AUTHOR_ID, AUTHOR_NAME, SUM(SALES)
FROM ...
GROUP BY AUTHOR_ID;
AUTHOR_ID와 AUTHOR_NAME은 1:1 관계이다. 즉, 같은 AUTHOR_ID에 대해 AUTHOR_NAME은 항상 동일하므로:
GROUP BY AUTHOR_ID, CATEGORY
만 써도 실제 결과에는 문제가 없다. 하지만 명시적으로 AUTHOR_NAME을 GROUP BY에 포함시키는 것이 더 안전하고 이식성이 좋다.
728x90
반응형
'알고리즘 > SQL' 카테고리의 다른 글
[SQL] 조건에 맞는 사원 정보 조회하기 (0) | 2025.05.16 |
---|---|
[SQL] 입양 시각 구하기 (2) (0) | 2025.05.09 |
[SQL] 재귀 CTE(Command Table Expression)를 이용한 계층적 구조 탐색 (0) | 2025.05.09 |
[SQL] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2025.05.09 |