SQL 통한 Database 관리

GROUP BY 쿼리에서는 `ORDER BY` 절에서 사용하는 모든 열이 `SELECT`나 `GROUP BY` 절에 있어야

JBS 12 2024. 8. 29. 18:01

select 지역, sum(매출금액) as 매출금액
from 지역별매출
group by 지역
order by 년 DESC; 는 오류나고,

select 지역, 매출금액
from 지역별매출
order by 년 ASC;는 왜 가능해

두 쿼리 사이의 차이점과 왜 하나는 오류가 발생하고 다른 하나는 성공하는지 설명드리겠습니다.

### 1. `SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출 GROUP BY 지역 ORDER BY 년 DESC;`

이 쿼리에는 **오류가 발생합니다**. 그 이유는 다음과 같습니다:

- `GROUP BY` 절을 사용했기 때문에, `SELECT` 절에 있는 열들은 반드시 `GROUP BY`에 포함되거나, 집계 함수(`SUM`, `COUNT`, `AVG` 등)를 사용해야 합니다.
- 그러나 `ORDER BY` 절에서 `년` 열을 사용하고 있는데, 이 열이 `SELECT` 절에 없으며 `GROUP BY`에도 포함되지 않았습니다.
- SQL에서는 `GROUP BY`로 그룹화된 결과를 정렬할 때, 정렬 기준이 되는 열은 `SELECT` 절이나 `GROUP BY` 절에 있어야 합니다.

**즉,** `년` 열이 `SELECT` 절이나 `GROUP BY` 절에 포함되지 않았기 때문에, SQL 엔진이 이 열을 정렬 기준으로 사용할 수 없고, 이로 인해 오류가 발생합니다.

### 2. `SELECT 지역, 매출금액 FROM 지역별매출 ORDER BY 년 ASC;`

이 쿼리는 **성공적으로 실행됩니다**. 그 이유는:

- 이 쿼리에서는 `GROUP BY` 절이 없고, 모든 열이 그대로 `SELECT` 절에 나열되어 있습니다.
- `ORDER BY` 절에서 사용하는 `년` 열도 `SELECT` 절에 포함되지 않았지만, `지역별매출` 테이블에 존재하기 때문에 정렬이 가능합니다.
- 이 경우, `ORDER BY`는 테이블의 모든 데이터를 기반으로 행을 정렬하므로, `년 ASC` 조건은 문제가 없습니다.

### 핵심 차이점

- **첫 번째 쿼리**는 `GROUP BY` 절이 있기 때문에, `ORDER BY`에서 사용하는 열은 반드시 `GROUP BY` 또는 `SELECT` 절에 있어야 합니다. 그렇지 않으면 오류가 발생합니다.
- **두 번째 쿼리**는 `GROUP BY`가 없기 때문에, 테이블에 있는 모든 열을 자유롭게 `ORDER BY`에서 사용할 수 있으며, 따라서 오류 없이 실행됩니다.

### 요약

- `GROUP BY`를 사용하는 쿼리에서는 `ORDER BY` 절에서 사용하는 모든 열이 `SELECT`나 `GROUP BY` 절에 있어야 합니다.
- `GROUP BY`를 사용하지 않는 쿼리에서는, 테이블에 존재하는 열을 `ORDER BY` 절에서 자유롭게 사용할 수 있습니다.