0Pricing
Coding Interview Prep · 강의

GROUP BY 없이 집계하기

일반 집계가 전체 표를 한 행으로 축약하는 방식을 알아봅니다.

GROUP BY 없이 집계하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

집계 함수 하나, 한 행

면접관은 다음 질문으로 기초적인 개념을 확인합니다. "GROUP BY 없이 집계 함수를 사용하면 어떻게 되나요?"

답은 전체 테이블이 하나의 행으로 축약된다는 것입니다. 집계 함수는 조건을 충족하는 모든 행을 하나의 큰 암묵적 그룹으로 취급합니다. 이 "암묵적 그룹" 모델을 이해하면 이후에 나오는 여러 규칙도 설명할 수 있으므로, 차근차근 살펴보겠습니다.

암묵적인 단일 그룹

GROUP BY 없이 단독 집계 함수를 작성하면 SQL은 모든 행을 포함하는 그룹이 하나 있는 것처럼 동작합니다. 테이블에 행이 몇 개 있든 결과는 항상 정확히 한 행이며, 테이블이 비어 있어도 마찬가지입니다.

따라서 SELECT COUNT(*) FROM employees는 전체 테이블을 요약하는 숫자 하나가 들어 있는 한 행을 반환합니다.

SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one row

여러 집계 함수 함께 사용하기

하나의 SELECT에 여러 집계 함수를 나열할 수 있습니다. 이 함수들은 모두 동일한 암묵적 그룹을 요약하므로, 여러 열을 포함한 정확히 한 행을 반환합니다.

이는 표준적인 "요약 통계를 보여 주세요" 쿼리입니다. 네 숫자 모두 같은 전체 행 집합을 설명합니다.

SELECT
  COUNT(*)     AS num_rows,
  SUM(salary)  AS total_pay,
  AVG(salary)  AS avg_pay,
  MAX(salary)  AS top_pay
FROM employees;

혼합 시 발생하는 오류

가장 자주 출제되는 규칙입니다. GROUP BY 없이 같은 SELECT에서 단독 집계 함수와 집계되지 않은 열을 함께 사용할 수 없습니다.

왜 그럴까요? 집계 함수는 한 행을 만들지만 일반 열에는 여러 값이 있습니다. 그중 어떤 값을 보여 줘야 할까요? 이는 모호하므로 표준 SQL에서는 오류가 발생합니다.

-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;

왜 모호한가

우리 테이블을 예로 생각해 보세요. MAX(salary)는 모든 행을 하나의 값으로 축약합니다. 하지만 name은 각 행마다 값이 다릅니다. 하나의 요약 행에 다섯 개의 이름을 한 셀에 담을 수는 없습니다.

데이터베이스는 임의로 추측하지 않습니다. 이는 GROUP BY 규칙의 근거와 같은 원리입니다. 선택한 모든 열은 집계 함수의 대상이거나 그룹의 일부여야 합니다. GROUP BY가 없으면 집계 함수만 사용할 수 있습니다.

MySQL의 느슨한 예외

언급할 만한 SQL 방언의 차이가 하나 있습니다. 과거의 또는 엄격 모드가 아닌 MySQL에서는 혼합 쿼리를 허용하고 임의의 이름을 반환할 수 있었습니다. 이 이름이 반드시 최고 연봉자의 이름인 것은 아닙니다.

현재 기본값인 ONLY_FULL_GROUP_BY가 활성화된 최신 MySQL은 다른 데이터베이스와 마찬가지로 이 쿼리를 거부합니다. 이 내용을 언급하면 여러 SQL 방언을 이해하고 있음을 보여 줄 수 있지만, 혼합 쿼리는 항상 잘못된 것으로 취급하세요.

MAX에 해당하는 행 가져오기

그렇다면 최고 연봉자의 이름은 어떻게 가져올까요? 혼합해서 가져오면 안 됩니다. ORDER BY + LIMIT를 사용하거나, 집계 결과와 비교하는 서브쿼리를 사용하세요.

ORDER BY/LIMIT 방식이 가장 간단합니다. 서브쿼리 방식은 더 일반적으로 사용할 수 있으며, 최댓값이 같은 모든 직원을 반환합니다.

-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

빈 테이블에 대한 집계 함수

면접관이 제시하는 함정이 될 수 있는 예외 상황이 있습니다. "빈 테이블에서 단독 집계 함수는 무엇을 반환하나요?"

  • COUNT(*)는 0을 반환합니다. 한 행이며 값은 0입니다.
  • SUM, AVG, MIN, MAX는 NULL을 반환합니다. 한 행이며 값은 NULL입니다.

중요한 점은 여전히 한 행을 반환한다는 것이며, 행이 0개 반환되는 일은 없다는 것입니다. 이 한 행 보장이 GROUP BY 없이 집계 함수를 사용하는 핵심입니다.

SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULL

WHERE에서는 집계 함수를 사용할 수 없습니다

이 모델에서 따라오는 또 다른 규칙이 있습니다. WHERE 절에서는 집계가 수행되기 전에 개별 행을 필터링하므로, WHERE 절에 집계 함수를 넣을 수 없습니다.

집계 결과로 필터링하려면 그룹화와 함께 HAVING을 사용하거나, 집계 함수를 서브쿼리로 감싸야 합니다. 실행 순서에서 WHERE가 너무 일찍 실행되므로 집계 결과를 볼 수 없는 것입니다.

-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);

-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

단독 집계 함수와 GROUP BY 비교

다음과 같이 대비해서 기억해 보세요.

  • GROUP BY 없음: 암묵적 그룹 하나 = 전체 테이블 = 결과 행이 정확히 하나입니다.
  • GROUP BY 열 사용: 열의 서로 다른 값마다 그룹 하나 = 그룹마다 한 행입니다.

단독 집계 함수는 그룹화 열을 0개로 둔 GROUP BY일 뿐입니다. 같은 처리 방식이지만 하나의 큰 묶음으로 처리합니다.

-- Whole table: one row
SELECT AVG(salary) FROM employees;

-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

설명하는 방법

깔끔한 답변은 다음과 같습니다. "GROUP BY가 없는 집계 함수는 전체 결과 집합을 하나의 암묵적 그룹으로 취급하고, 빈 테이블에서도 정확히 한 개의 요약 행을 반환합니다. 집계되지 않은 열을 함께 선택할 수 없는 이유는 그 값이 모호해지기 때문입니다. MAX 또는 MIN에 해당하는 행을 가져오려면 LIMIT와 함께 ORDER BY를 사용하거나, 집계 결과와 비교하는 서브쿼리를 사용합니다."

빠른 확인

결과의 형태를 예측해 보세요.

복습

GROUP BY가 없는 집계 함수를 요약하면 다음과 같습니다.

  • 전체 테이블이 하나의 암묵적 그룹이 되므로 결과 행은 정확히 하나입니다.
  • 단독 집계 함수와 집계되지 않은 열을 함께 사용할 수 없습니다.
  • 빈 테이블에서는 COUNT(*)가 0을 반환하고 나머지는 NULL을 반환하지만, 결과는 여전히 한 행입니다.
  • 집계 함수는 WHERE에 사용할 수 없으며, 서브쿼리나 HAVING을 사용해야 합니다.
  • MIN/MAX에 해당하는 행을 가져오려면 ORDER BY + LIMIT 또는 서브쿼리를 사용하세요.

이로써 집계 함수에 관한 면접 연습을 마칩니다.

자주 묻는 질문

“GROUP BY 없이 집계하기” 강의는 무료인가요?

네 — “GROUP BY 없이 집계하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“GROUP BY 없이 집계하기”에서 뭘 배우나요?

일반 집계가 전체 표를 한 행으로 축약하는 방식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“GROUP BY 없이 집계하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)
  2. NULL이 있는 SUM과 AVG
  3. MIN, MAX와 숫자가 아닌 값의 집계
  4. GROUP BY 없이 집계하기
← Coding Interview Prep(으)로 돌아가기