[Learning SQL] 그룹화와 집계

반응형
반응형

 

개인적으로 그룹화를 사용하는 이유는 통계를 내기위해 사용되는 것이라고 생각이 듭니다.
통계에는 평균을 구한다는지, 최댓값, 최솟값, 등등을 구할 수 있습니다.

sql에서는 이러한 기능들을 제공하는데 이것을 그룹화라고 부릅니다.

sql에서는 다음처럼 사용합니다.

group by 그룹화될 열

사실 우리는 우리도 모르게 그룹화를 사용하고 있습니다.
다음 쿼리를 보면서 이야기 해봅시다.

select * from block;

이상합니다. 분명히 그룹화를 사용한다고 했는데 어디에도 group by의 흔적이 보이지 않습니다.
정확히 말하면 이 방법은 암묵적인 그룹화 방법입니다.

결국 다음과 같은 쿼리들도 가능하다는 이야기입니다.

select count(*) from block;
select min(*) from block;

 

select max(*) from block;

count같은 경우 sql은 테이블 구조로 되어있기 때문에 어느 열로 검색을 해도 같은 결과를 도출하지만
max와 min은 얘기가 조금 다릅니다.
열의 갯수가 1개이며 대소비교가 가능하다면 정상적으로 출력이 되겠지만,
여러개라면 어느 값으로 대소 비교를 해야 할지 모릅니다.
아마 sql에서는 에러를 호출하게 됩니다. (거의 틀린 코드라고 봐도 무방합니다.)

암묵적인 그룹화가 있다면, 명시적인 그룹화도 존재할까요?

명시적인 그룹화

명시적인 그룹화는 특정 열을 가지고 그룹을 지정하겠다는 뜻입니다.

 여기서 그룹화를 지정할 수 있는 부분은 총 3가지입니다.
도형의 모양, seq, 색깔

물론 도형의 모양 같은 경우는 의미가 없습니다. 왜니햐면 전부 사각형이기 때문입니다.

그러면 색깔로 그룹화를 해보겠습니다.

select * from block 
group by color;

이 쿼리는 사실 틀린 쿼리입니다.
그 이유는 추후에 말씀드리겠습니다.

위에서 count(*), min(*), max(*)를 사용했습니다.
이번에도 사용해봅시다.

select count(*) from block 
group by color;

이것의 결과는 어떻게 나올까요.
전체 갯수를 세어봅시다. 총 9개라는 군요
하지만 그룹화를 지정했기 때문에 총 갯수는 더이상 나오지 않습니다.

다만 빨간색의 갯수, 검정색의 갯수 ... 이런식으로 나오게 됩니다.

그러면 결과는 2,4,1,1,1로 나오게 됩니다.

아쉽지만 최댓값과 최솟값을 계산할 수 있는건 단 seq 뿐입니다.
그러면 min(*)는 사용이 불가합니다. 이유는 위에서 설명했듯이 어떤 값으로 계산이 되어질지 모르기 때문입니다.

그러면 다음과 같이 하면 됩니다.

select min(seq) from block 
group by color;
select max(seq) from block 
group by color;

위에서

select * from block 
group by color;

는 불가하다고 했습니다.
왜냐하면 그룹화를 지정했는데 전체를 보여달라는건 말도 안되기 때문입니다.
저게 전체 코드를 보여달라는건지 아니면 그룹화를 한 상태를 보여 달라는건지 알 수 없기 때문입니다.

계속 count(*)로 설명했습니다.
하지만 이렇게 쿼리를 짜는 습관은 좋지 않는다고 합니다.
왜냐하면 속도가 느리다고 합니다. 이유는 정확히 모르겠지만 아무래도 모든 열을 검색을 해야하기 때문이 아닐까요?

그래서 다음처럼 변경이 되어지는것이 올바른 표현입니다.

select count(seq) from block 
group by color;

 

반응형

'sql' 카테고리의 다른 글

[Learning SQL] 내부 조인 vs 외부 조인  (0) 2021.05.12
[Learning SQL] 서브쿼리  (0) 2021.05.03
[LearningSql] 집합 연산자  (0) 2021.04.20
[LearningSql] 다중 테이블 쿼리  (0) 2021.04.13
[LearningSql] 필터링  (0) 2021.04.11

댓글

Designed by JB FACTORY