SELECT 열에 적용되는 GROUP BY 규칙
집계되지 않은 모든 열이 GROUP BY에 포함되어야 하는 이유와 only-full-group-by 모드를 알아봅니다.
SELECT 열에 적용되는 GROUP BY 규칙은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관이 GROUP BY부터 시작하는 이유
GROUP BY는 면접에서 주니어와 중급 개발자를 가르는 지점입니다. 면접관이 가장 자주 검증하는 단 하나의 규칙은 다음과 같습니다. SELECT 목록의 모든 열은 집계 함수 안에 있거나 GROUP BY에 나열되어 있어야 합니다.
이 규칙을 어기면 엔진은 행이 여러 개인 그룹에서 어떤 값을 표시해야 할지 결정할 수 없습니다. 면접관은 여러분이 그룹이 실제로 무엇인지 이해하는지 확인하기 위해 바로 이 실수를 일부러 넣습니다.
그룹의 실제 의미
GROUP BY는 여러 행을 서로 다른 키마다 한 행으로 압축합니다. 그룹화가 끝나면 엔진에는 더 이상 개별 행이 없습니다. 그룹마다 요약 행 하나만 남습니다.
- 그룹화에 사용한 열은 그룹마다 값이 하나로 명확합니다.
COUNT,SUM,AVG와 같은 집계는 여러 값을 하나로 줄입니다.- 그 밖의 원시 열은 모호합니다. 여러 값 중 어떤 값을 표시해야 합니까?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;전형적인 오류
면접관들이 좋아하는 오류를 살펴보겠습니다. department로 그룹화하면서 GROUP BY에 없는 비집계 열인 name도 선택하는 경우입니다.
각 부서에는 직원이 여러 명이므로 그룹마다 이름도 여러 개입니다. 엔진은 그중 하나를 선택할 수 없으므로 표준 SQL은 질의를 거부합니다.
-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;해결하는 두 가지 방법
타당한 해결 방법은 두 가지이며, 면접관은 여러분이 두 방법이 서로 다른 결과를 만든다는 점을 모두 알고 있는지 확인하려 합니다:
- 더 세분화된 그룹화(부서와 이름마다 한 행)를 원한다면 열을 GROUP BY에 추가하십시오.
- 기존 그룹마다 값 하나를 원한다면
MAX(name)또는COUNT(name)와 같은 집계 함수로 열을 감싸십시오.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;MySQL의 ONLY_FULL_GROUP_BY
자주 나오는 함정입니다. 예전 MySQL은 그룹화되지 않은 열을 선택하는 것을 허용했고 그룹에서 임의의 값을 조용히 반환했습니다. 그 결과 겉보기에는 정상인 잘못된 보고서가 만들어졌습니다.
최신 MySQL은 기본적으로 ONLY_FULL_GROUP_BY를 활성화하여 표준 규칙을 적용합니다. 포스트그레스, SQL 서버, 오라클은 항상 이 규칙을 적용해 왔습니다. '예전 서버에서는 작동했는데 지금은 오류가 나는' 이유를 묻는다면 이것이 답입니다.
-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;함수적 종속성 예외
면접관이 이해도를 확인하기 위해 사용하는 세부 사항이 있습니다. 테이블의 기본 키로 그룹화하면 해당 테이블의 다른 모든 열은 그 키에 함수적으로 종속되므로 그룹마다 값이 정확히 하나입니다.
포스트그레스와 최신 MySQL에서는 이러한 종속 열을 목록에 나열하지 않고 선택할 수 있습니다. 그룹화한 키가 해당 열을 고유하게 결정하므로 모호하지 않습니다.
-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;풀이 예시: 지역별 매출
지역별 총매출을 보고해야 한다고 가정해 보겠습니다. 그룹화 키는 region이고 측정값은 SUM(amount)입니다. 나머지는 모두 집계하거나 제외해야 합니다.
이 형태가 얼마나 깔끔한지 확인해 보십시오. 지역마다 한 행이 있고, 각 행에는 합산된 값 하나가 들어 있습니다. 모든 집계 보고서는 이런 형태를 취합니다.
SELECT region,
SUM(amount) AS total_sales,
COUNT(*) AS num_orders,
AVG(amount) AS avg_order
FROM sales
GROUP BY region;세부 정보와 요약 혼합하기
함정 문제를 살펴보겠습니다. '각 주문의 금액을 해당 지역의 총계와 함께 표시하십시오.' 일반적인 GROUP BY만으로는 이 작업을 할 수 없습니다. 그룹화하면 개별 행이 사라지기 때문입니다.
올바른 답은 윈도 함수(SUM(amount) OVER (PARTITION BY region))를 사용하거나 그룹화한 하위 쿼리에 다시 조인하는 것입니다. 여기서 GROUP BY가 잘못된 도구임을 알아차리는 것이 질문의 핵심입니다.
-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;GROUP BY와 SELECT 별칭
SELECT에서 정의한 별칭으로 GROUP BY할 수 있을까요? SQL 방언에 따라 다르며, 이러한 차이가 바로 면접관이 확인하는 부분입니다.
- MySQL과 포스트그레스: SELECT 별칭으로 그룹화할 수 있습니다.
- SQL 서버와 오라클: 그룹화할 수 없으므로 전체 식을 반복해야 합니다.
어디서나 작동하는 이식 가능한 답은 GROUP BY에서 식을 반복하는 것입니다.
-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);고유성을 위한 DISTINCT와 GROUP BY
집계 없이 고유한 조합만 원한다면 GROUP BY는 집계 함수가 없을 때 DISTINCT와 동일하게 작동합니다. 면접관은 어느 쪽이 더 명확한지 물어볼 수 있습니다.
'고유한 행을 원한다'는 의도를 표현하려면 DISTINCT를 사용하십시오. 집계도 계산할 때는 GROUP BY를 사용하십시오. 결과는 같지만 가독성에 전달하는 신호가 다릅니다.
-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;면접에서 말하는 방법
GROUP BY 문제가 나오면 다음 규칙을 소리 내어 설명하십시오. '선택한 모든 열은 그룹화 키이거나 집계 함수로 감싸져 있어야 합니다. 그룹화하면 키마다 한 행만 남기 때문입니다.'
그런 다음 그룹화 키와 측정값을 말하고, 그룹화되지 않은 채 남는 항목이 없는지 확인하십시오. 이렇게 구조적으로 답하면 질의를 작성하기 전에도 중급 수준의 역량을 보여 줄 수 있습니다.
빠른 확인
GROUP BY의 핵심 규칙을 제대로 이해했는지 확인해 보십시오.
요약
규칙: 모든 SELECT 열은 그룹화 키이거나 집계 대상이어야 합니다. 이유: GROUP BY는 키마다 한 행을 남기므로, 그룹화되지 않은 원시 열은 모호해집니다.
- 해당 열을 그룹화하거나 집계하여 규칙 위반을 수정하십시오.
- MySQL의 예전 동작은 임의의 값을 반환했지만,
ONLY_FULL_GROUP_BY는 표준을 적용합니다. - 기본 키에 의한 함수적 종속은 허용되는 유일한 예외입니다.
- 그룹별 합계와 함께 세부 행을 유지하려면 GROUP BY가 아니라 윈도 함수를 사용하십시오.
자주 묻는 질문
“SELECT 열에 적용되는 GROUP BY 규칙” 강의는 무료인가요?
네 — “SELECT 열에 적용되는 GROUP BY 규칙” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“SELECT 열에 적용되는 GROUP BY 규칙”에서 뭘 배우나요?
집계되지 않은 모든 열이 GROUP BY에 포함되어야 하는 이유와 only-full-group-by 모드를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“SELECT 열에 적용되는 GROUP BY 규칙” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- SELECT 열에 적용되는 GROUP BY 규칙
- HAVING과 WHERE 비교하기
- 여러 열과 수식으로 그룹화하기
- 그룹 개수 세기와 필터링하기