SQL

SQL GROUP BY, HAVING

봄다온 2025. 1. 23. 15:55

GROUP BY

select 검색의 결과로 나오는 정보를 그룹화 해준다.

# group by 앞과 뒤의 칼럼명은 동일. 
# 아래 두 쿼리의 결과는 같다.
select 컬럼명 from 테이블명 group by 컬럼명;
select distinct 컬럼명 from 테이블명; 

select item_type from rating group by item_type;
  item_type
-------------
 drink
 canned_food
 ramen

group 이후에 나오는 컬럼명은 컬럼 순서대로 숫자 지정 가능

select 컬럼명1,컬럼명2 from 테이블명 group by 1, 2;
select 컬럼명1,컬럼명2 from 테이블명 group by 2, 1;

group by로 새로운 group을 생성하고 결과를 리턴하는데 이때 중복된 내용은 가질수 없다.
group by는 항상 같은 컬럼을 사용하거나 group by 함수를 사용한다.

여기까지는 group by와 distinct의 차이가 없다.
하지만 group by는 distinct와 다르게 집계함수와 HAVING을 사용할 수 있다.

# count
그룹화한 데이터의 개수를 세준다.
select item_type, count(*) from rating group by item_type;
  item_type  | count
-------------+-------
 drink       |     3
 canned_food |     6
 ramen       |    11

HAVING

where과 같이 조건을 걸때 사용. where은 집계전 데이터 조회, having은 집계후 데이터 조회
where사용할때는 집계함수 사용안함.
group by에서 같은 컬럼명을 사용했듯이, having에서도 집계함수와 집계함수가 기준인 조건을
사용한다.

# HAVING
select 컬럼명, 집계함수 from 테이블명 group by 컬럼명 having 조건;
select item_type, count(*) from rating group by item_type having count(*) > 3;
  item_type  | count
-------------+-------
 canned_food |     6
 ramen       |    11

group by, 집계함수, having, where을 전부사용한 쿼리 예제

select 컬럼명, 집계함수 from 테이블명 where 조건 group by 컬럼명 having 조건2;

select item_type, count(*) 
  from rating
    where item_type like 'r%'
    group by item_type
    having count(*) > 3;

  item_type | count
-----------+-------
 ramen     |    11