본문 바로가기

스마 (SQL Master) 도전!/Deep Dive !!

[SQL] GROUP BY 오류: "group by 표현식이 아닌것들.. 원인과 해결 방법

 

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을 공부할 때 많이 헷갈리는 부분이지만(제가 많이 했갈렸지만), 한 번 이해해두면 이후 쿼리 작성이 훨씬 편해집니다... ㅎㅎ