
SQL을 공부하거나 문제를 풀다보면 어쩌면 가끔 다음과 같은 오류를 볼 수 있습니다.
ORA-00979: not a GROUP BY expression
특히 아래처럼 쿼리를 작성했을 때 많이 발생합니다.
SELECT job, sal
FROM emp
GROUP BY job
HAVING COUNT(*) > 0
ORDER BY sal;
이 경우 에러가 발생합니다.
처음 보면 꽤 헷갈리지만, 사실 GROUP BY의 동작 원리만 이해하면 바로 납득됩니다.
이번 글에서는 GROUP BY가 어떻게 동작하는지와 함께 왜 이런 오류가 발생하는지 정리해보겠습니다.
GROUP BY는 여러 행을 하나의 행으로 묶는다
GROUP BY의 핵심 개념은 다음 한 문장으로 정리됩니다.
여러 행(row)을 하나의 그룹으로 묶고, 그룹당 하나의 결과 행을 만든다.
하나의 그룹 -> 그룹 당 하나의 결과 행!
중요합니다.
예를 들어 다음과 같은 테이블이 있다고 가정해보겠습니다.
| job | sal |
| DEV | 3000 |
| DEV | 4000 |
| DEV | 5000 |
| HR | 2000 |
GROUP BY 없이 조회
SELECT job, sal
FROM emp;
결과
| job | sal |
| DEV | 3000 |
| DEV | 4000 |
| DEV | 5000 |
| HR | 2000 |
GROUP BY를 사용하지 않으면 단순히 행 그대로 출력됩니다.
GROUP BY 사용
SELECT job
FROM emp
GROUP BY job;
결과
| job |
| DEV |
| HR |
DEV는 3개의 행이 있었지만 하나의 그룹으로 묶여서 한 행으로 출력됩니다.
정상출력 OK!!!!
그럼 왜 "group by 표현식이 아니라는 오류가 발생할까요?
문제가 되는 쿼리를 다시 보겠습니다.
SELECT job, sal
FROM emp
GROUP BY job;
GROUP BY가 실행되면 내부적으로 데이터는 다음처럼 묶입니다.
| job | sal 값들... |
| DEV | 3000, 4000, 5000 |
| HR | 2000 |
여기서 SQL 입장에서는 문제가 생깁니다.
DEV 그룹에는 sal 값이 3개 있습니다.
- 3000
- 4000
- 5000
그렇다면 SELECT sal을 할 때 어떤 값을 보여줘야 할까요?
SQL은 이 선택을 자동으로 할 수 없기 때문에 다음과 같은 오류를 발생시킵니다.
에러 : group by 표현식이 아님
GROUP BY 사용할 때 SELECT 규칙
GROUP BY를 사용할 때 SELECT에 올 수 있는 것은 두 가지뿐입니다.
- GROUP BY에 사용된 컬럼
- 집계 함수
가능한 예
SELECT job
FROM emp
GROUP BY job;
SELECT job, AVG(sal)
FROM emp
GROUP BY job;
SELECT job, MAX(sal)
FROM emp
GROUP BY job;
집계 함수는 여러 값을 하나의 값으로 만들어주기 때문에 GROUP BY와 함께 사용할 수 있습니다.
쿼리 수정 방법
예를 들어 직무별 평균 급여를 구하려면 다음과 같이 작성합니다.
SELECT job, AVG(sal)
FROM emp
GROUP BY job
ORDER BY AVG(sal);
또는 직무별 최고 급여를 구할 수도 있습니다.
SELECT job, MAX(sal)
FROM emp
GROUP BY job
ORDER BY MAX(sal);
HAVING COUNT(*) > 0 은 의미가 있을까?
맨 포스트 맨 위에 작성했던 쿼리에 있었던 조건입니다.
HAVING COUNT(*) > 0
사실 이 조건은 대부분 의미가 없습니다.
왜냐하면 GROUP BY로 그룹이 만들어졌다는 것은 이미 최소 1개의 행이 존재한다는 뜻이기 때문입니다.
그래서 보통은 다음처럼 사용합니다.
HAVING COUNT(*) >= 2
즉 2개 이상 데이터가 있는 그룹만 조회하는 경우에 사용합니다.
마무리
GROUP BY를 이해할 때 가장 중요한 개념은
GROUP BY는 여러 행을 하나의 그룹으로 묶고, 그룹당 하나의 결과 행을 만든다.
그래서 SELECT에는 반드시 다음 두 가지 중 하나만 사용할 수 있습니다.
- GROUP BY에 포함된 컬럼
- 집계 함수 (AVG, SUM, COUNT, MAX, MIN)
이 개념만 이해하면 GROUP BY 관련 오류는 대부분 쉽게 해결할 수 있습니다.
처음 SQL을 공부할 때 많이 헷갈리는 부분이지만(제가 많이 했갈렸지만), 한 번 이해해두면 이후 쿼리 작성이 훨씬 편해집니다... ㅎㅎ
'스마 (SQL Master) 도전! > Deep Dive !!' 카테고리의 다른 글
| [DB 딥다이브] 인조 식별자만 믿었다간 서비스 터진다..? 조인 성능과 복합 인덱스 물리 메커니즘 파해치기 (3) | 2026.06.10 |
|---|---|
| [SQL] GROUP BY 절에 없는 일반 속성은 SELECT에 왜 못 올까? (개념부터 서브쿼리 조인까지) 딥 다이브 (0) | 2026.05.28 |